精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

前端也要懂編譯:Babel 全景上手指南

開(kāi)發(fā) 開(kāi)發(fā)工具
Babel 是一個(gè)用于 JavaScript 的通用多用途編譯器,使用 Babel 可以使用(或創(chuàng)建)下一代 的JavaScript,以及下一代 JavaScript 工具。

[[376863]]

 此文檔翻譯自 https://github.com/jamiebuilds/babel-handbook,由圖雀醬審驗(yàn)。

引言

Babel 是一個(gè)用于 JavaScript 的通用多用途編譯器,使用 Babel 可以使用(或創(chuàng)建)下一代 的JavaScript,以及下一代 JavaScript 工具。

作為一門(mén)語(yǔ)言,JavaScript 不斷發(fā)展,帶來(lái)了很多新的規(guī)范和建議,使用 Babel 可以讓你在這些新的規(guī)范和建議全面普及之前就提前使用它們。

Babel 通過(guò)將最新標(biāo)準(zhǔn)的 JavaScript 代碼編譯為已經(jīng)在目前可以工作的代碼來(lái)實(shí)現(xiàn)上一段提到的內(nèi)容。這個(gè)過(guò)程被稱為 “源代碼到源代碼” 的編譯,這也被成為 “轉(zhuǎn)換”。

例如,Babel 可以將最新的 ES2015 的箭頭函數(shù)語(yǔ)法從:

  1. const square = n => n * n; 

轉(zhuǎn)換成下面的內(nèi)容:

  1. const square = function square(n) { 
  2.   return n * n; 
  3. }; 

然而,Babel 可以勝任更多的工作,因?yàn)锽abel 支持語(yǔ)法擴(kuò)展,例如 React 的 JSX 語(yǔ)法或者靜態(tài)類型檢查的 Flow 語(yǔ)法。

更近一步,在 Babel 中一切皆插件,而每個(gè)人都可以充分利用 Babel 的強(qiáng)大能力來(lái)創(chuàng)建屬于自己的插件。且 Babel 被組織成幾個(gè)核心的模塊,允許用戶利用這些模塊來(lái)構(gòu)建下一代 JavaScript 工具鏈。

許多人也是這樣去做的,Babel 的生態(tài)系統(tǒng)正在茁長(zhǎng)的成長(zhǎng)。在這本 Babel 手冊(cè)中,我將講解 Babel 內(nèi)建的一些工具以及社區(qū)里的一些擁有的工具。

Babel 模塊介紹

因?yàn)?JavaScript 社區(qū)沒(méi)有標(biāo)準(zhǔn)的構(gòu)建工具,框架或平臺(tái)等,Babel 官方性與其他所有的主要工具進(jìn)行了集成。無(wú)論是來(lái)自 Gulp、Browserify,或者是 Ember、Meteor,亦或是 Webpack 等,無(wú)論你的啟動(dòng)工具是什么,Babel 都存在一些官方性的集成。

就本手冊(cè)而言,我們將介紹設(shè)置Babel的內(nèi)置方法,但是您也可以訪問(wèn)交互式設(shè)置頁(yè)面[1]以了解所有集成。

  • 注意:本指南將參考諸如 node 和 npm 之類的命令行工具。在繼續(xù)進(jìn)行任何操作之前,您應(yīng)該對(duì)這些工具感到滿意。

babel-cli

Babel的CLI是從命令行使用Babel編譯文件的簡(jiǎn)單方法。

讓我們首先在全局安裝它以學(xué)習(xí)基礎(chǔ)知識(shí)。

  1. $ npm install --global babel-cli 

我們可以像這樣編譯我們的第一個(gè)文件:

  1. $ babel my-file.js 

這會(huì)將編譯后的輸出直接轉(zhuǎn)儲(chǔ)到您的終端中。要將其寫(xiě)入文件,我們將指定 --out-file 或 -o 。

  1. $ babel example.js --out-file compiled.js 
  2. or 
  3. $ babel example.js -o compiled.js 

如果我們想將整個(gè)目錄編譯成一個(gè)新目錄,可以使用 --out-dir 或 -d 來(lái)完成。

  1. $ babel src --out-dir lib 
  2. or 
  3. $ babel src -d lib 

從項(xiàng)目中運(yùn)行Babel CLI

雖然您可以在計(jì)算機(jī)上全局安裝Babel CLI,但最好逐個(gè)項(xiàng)目在本地安裝它。

這有兩個(gè)主要原因。

  • 同一臺(tái)計(jì)算機(jī)上的不同項(xiàng)目可能取決于Babel的不同版本,從而允許您一次更新一個(gè)版本。
  • 這意味著您對(duì)工作的環(huán)境沒(méi)有隱式依賴。使您的項(xiàng)目更加可移植且易于設(shè)置。

我們可以通過(guò)運(yùn)行以下命令在本地安裝Babel CLI:

  1. $ npm install --save-dev babel-cli 
  • 注意:由于在全局范圍內(nèi)運(yùn)行 Babel 通常是一個(gè)壞主意,因此您可能需要通過(guò)運(yùn)行以下命令來(lái)卸載全局副本:
  1. $ npm uninstall --global babel-cli 

完成安裝后,您的 package.json 文件應(yīng)如下所示:

  1.   "name""my-project"
  2.   "version""1.0.0"
  3.   "devDependencies": { 
  4.     "babel-cli""^6.0.0" 
  5.   } 

現(xiàn)在,與其直接從命令行運(yùn)行 Babel,不如將命令放入使用本地版本的 npm 腳本中。只需在您的 package.json 中添加一個(gè) “script” 字段,然后將 babel 命令放入其中即可進(jìn)行構(gòu)建。

  1.   { 
  2.     "name""my-project"
  3.     "version""1.0.0"
  4. +   "scripts": { 
  5. +     "build""babel src -d lib" 
  6. +   }, 
  7.     "devDependencies": { 
  8.       "babel-cli""^6.0.0" 
  9.     } 
  10.   } 

現(xiàn)在,從我們的終端我們可以運(yùn)行:

  1. npm run build 

這將以與以前相同的方式運(yùn)行Babel,只是現(xiàn)在我們正在使用本地副本。

babel-register

運(yùn)行Babel的下一個(gè)最常見(jiàn)的方法是通過(guò) babel-register 。通過(guò)此選項(xiàng),您僅需要文件即可運(yùn)行 Babel,這可能會(huì)更好地與您的設(shè)置集成。

請(qǐng)注意,這并非供生產(chǎn)使用。部署以這種方式編譯的代碼被認(rèn)為是不好的做法。最好在部署之前提前進(jìn)行編譯。但是,這對(duì)于構(gòu)建腳本或您在本地運(yùn)行的其他事情非常有效。

首先讓我們?cè)陧?xiàng)目中創(chuàng)建一個(gè) index.js 文件。

  1. console.log("Hello world!"); 

如果我們使用 node index.js 來(lái)運(yùn)行它,那么 Babel 不會(huì)編譯它。因此,我們需要先設(shè)置 babel-register 。

首先安裝 babel-register 。

  1. $ npm install --save-dev babel-register 

接下來(lái),在項(xiàng)目中創(chuàng)建一個(gè) register.js 文件,并編寫(xiě)以下代碼:

  1. require("babel-register"); 
  2. require("./index.js"); 

這是在 Node 的模塊系統(tǒng)中注冊(cè) Babel 并開(kāi)始編譯每個(gè) require 的文件。

現(xiàn)在,我們可以使用 node egister.js 代替運(yùn)行 node index.js 。

  1. $ node register.js 

注意:您不能在要編譯的文件中注冊(cè) Babel。在 Babel 有機(jī)會(huì)編譯文件之前,Node 正在執(zhí)行文件。

  1. require("babel-register"); 
  2.  
  3. // not compiled: 
  4. console.log("Hello world!"); 

 babel-node

如果您只是通過(guò) node CLI 運(yùn)行某些代碼,則集成 Babel 的最簡(jiǎn)單方法可能是使用 babel-node CLI,這在很大程度上只是對(duì) node CLI 的替代。

請(qǐng)注意,這并非供生產(chǎn)使用。部署以這種方式編譯的代碼被認(rèn)為是不好的做法。最好在部署之前提前進(jìn)行編譯。但是,這對(duì)于構(gòu)建腳本或您在本地運(yùn)行的其他事情非常有效。

首先,請(qǐng)確保您已安裝 babel-cli 。

  1. $ npm install --save-dev babel-cli 

**注意:**如果您想知道為什么要在本地安裝此軟件,請(qǐng)?jiān)谏厦娴捻?xiàng)目部分中閱讀 “從項(xiàng)目中運(yùn)行 Babel CLI”。

然后,將運(yùn)行 node 的任何位置替換為 babel-node 。

如果您使用的是 npm script ,則只需執(zhí)行以下操作:

  1.   { 
  2.     "scripts": { 
  3. -     "script-name""node script.js" 
  4. +     "script-name""babel-node script.js" 
  5.     } 
  6.   } 

否則,您將需要寫(xiě)出通向 babel-node 本身的路徑。

  1. - node script.js 
  2. + ./node_modules/.bin/babel-node script.js 

 babel-core

如果出于某種原因需要在代碼中使用 Babel,則可以使用 babel-core 軟件包本身。

首先安裝 babel-core 。

  1. $ npm install babel-core 

  1. var babel = require("babel-core"); 

如果您具有 JavaScript 字符串,則可以直接使用 babel.transform 對(duì)其進(jìn)行編譯。

  1. babel.transform("code();", options); 
  2. // => { code, map, ast } 

如果使用文件,則可以使用異步api:

  1. babel.transformFile("filename.js", options, function(err, result) { 
  2.   result; // => { code, map, ast } 
  3. }); 

如果您出于任何原因已經(jīng)擁有Babel AST,則可以直接從AST轉(zhuǎn)換。

  1. babel.transformFromAst(ast, code, options); 
  2. // => { code, map, ast } 

對(duì)于上述所有方法, options 可以傳遞指南可以從這里了解 https://babeljs.io/docs/usage/api/#options[2]。

配置 Babel

您現(xiàn)在可能已經(jīng)注意到,僅運(yùn)行 Babel 似乎除了將 JavaScript 文件從一個(gè)位置復(fù)制到另一個(gè)位置之外沒(méi)有執(zhí)行任何其他操作。

這是因?yàn)槲覀兩形锤嬖V Babel 該做什么事情。

  • 由于Babel是通用編譯器,它以多種不同的方式使用,因此默認(rèn)情況下它不會(huì)執(zhí)行任何操作。您必須明確告訴Babel 它應(yīng)該做什么。

您可以通過(guò)安裝 plugins 或 presets (plugins 組)為Babel提供操作說(shuō)明。

.babelrc

在我們開(kāi)始告訴 Babel 怎么做之前。我們需要?jiǎng)?chuàng)建一個(gè)配置文件。您需要做的就是在項(xiàng)目的根目錄下創(chuàng)建一個(gè) .babelrc 文件。從這樣開(kāi)始:

  1.   "presets": [], 
  2.   "plugins": [] 

該文件是您配置 Babel 以執(zhí)行所需操作的方式。

  • 注意:雖然您還可以通過(guò)其他方式將選項(xiàng)傳遞給 Babel,但 .babelrc 文件是約定俗成的,也是最好的方法。

babel-preset-es2015

讓我們首先告訴 Babel 將 ES2015(JavaScript標(biāo)準(zhǔn)的最新版本,也稱為ES6)編譯為ES5(當(dāng)今大多數(shù)JavaScript環(huán)境中可用的版本)。

我們將通過(guò)安裝“ es2015” Babel預(yù)設(shè)來(lái)做到這一點(diǎn)(當(dāng)然目前瀏覽器支持了絕大部分 ES2015 的特性了,這里是用作演示,使用形式是一致的):

  1. $ npm install --save-dev babel-preset-es2015 

接下來(lái),我們將修改 .babelrc 以包括該預(yù)設(shè)。

  1.   { 
  2.     "presets": [ 
  3. +     "es2015" 
  4.     ], 
  5.     "plugins": [] 
  6.   } 

 babel-preset-react

設(shè)置 React 同樣簡(jiǎn)單。只需安裝預(yù)設(shè):

  1. $ npm install --save-dev babel-preset-react 

然后將預(yù)設(shè)添加到您的 .babelrc 文件中:

  1.   "presets": [ 
  2.     "es2015"
  3.     "react" 
  4.   ], 
  5.   "plugins": [] 

 babel-preset-stage-x

JavaScript還提出了一些建議,這些建議正在通過(guò)TC39(ECMAScript標(biāo)準(zhǔn)背后的技術(shù)委員會(huì))流程納入標(biāo)準(zhǔn)。

此過(guò)程分為5個(gè)階段(0-4)。隨著提案獲得更大的吸引力,并更有可能被采納為標(biāo)準(zhǔn),它們經(jīng)歷了各個(gè)階段,最終在階段4被接納為標(biāo)準(zhǔn)。

這些以babel的形式捆綁為4種不同的預(yù)設(shè):

  • babel-preset-stage-0
  • babel-preset-stage-1
  • babel-preset-stage-2
  • babel-preset-stage-3

請(qǐng)注意,沒(méi)有階段 4 的 preset ,因?yàn)樗皇巧厦娴?es2015 預(yù)設(shè)。

這些預(yù)設(shè)中的每個(gè)預(yù)設(shè)都需要用于后續(xù)階段的預(yù)設(shè)。即 babel-preset-stage-1 需要 babel-preset-stage-2 ,而 babel-preset-stage-3 也需要。

安裝您感興趣的 stage 很簡(jiǎn)單:

  1. $ npm install --save-dev babel-preset-stage-2 

然后,您可以將其添加到您的 .babelrc 配置中。

  1.   { 
  2.     "presets": [ 
  3.       "es2015"
  4.       "react"
  5. +     "stage-2" 
  6.     ], 
  7.     "plugins": [] 
  8.   } 

執(zhí)行 Babel 生成的代碼

目前,您已經(jīng)使用Babel編譯了代碼,但這還不是故事的結(jié)局。

babel-polyfill

幾乎所有未來(lái) JavaScript 語(yǔ)法都可以使用 Babel 進(jìn)行編譯,但 API 并非如此。

例如,以下代碼具有需要編譯的箭頭函數(shù)功能:

  1. function addAll() { 
  2.   return Array.from(arguments).reduce((a, b) => a + b); 

在編譯之后會(huì)變成如下這樣:

  1. function addAll() { 
  2.   return Array.from(arguments).reduce(function(a, b) { 
  3.     return a + b; 
  4.   }); 

但是,由于 Array.from 并非在每個(gè)JavaScript環(huán)境中都存在,因此在編譯之后它仍然無(wú)法使用:

  1. Uncaught TypeError: Array.from is not a function 

為了解決這個(gè)問(wèn)題,我們使用一種叫做 Polyfill[3] 的東西。簡(jiǎn)而言之,Polyfill 是一段代碼,該代碼復(fù)制當(dāng)前運(yùn)行時(shí)中不存在的 API,允許您在當(dāng)前環(huán)境可用之前能提前使用 Array.from 等 API。

Babel使用出色的 core-js[4] 作為其polyfill,以及定制的 regenerator[5] 運(yùn)行時(shí),以使生成器和異步函數(shù)正常工作。

要包含 Babel polyfill,請(qǐng)首先使用npm安裝它:

  1. $ npm install --save babel-polyfill 

然后只需將 polyfill 包含在任何需要它的文件的頂部:

  1. import "babel-polyfill"

babel-runtime

為了實(shí)現(xiàn) ECMAScript 規(guī)范的詳細(xì)信息,Babel將使用 “helper” 方法來(lái)保持生成的代碼干凈。

由于這些 “helper” 方法會(huì)變得很長(zhǎng),而且它們被添加到每個(gè)文件的頂部,因此您可以將它們移動(dòng)到 require 的單個(gè)“運(yùn)行時(shí)”中。

首先安裝 babel-plugin-transform-runtime 和 babel-runtime :

  1. $ npm install --save-dev babel-plugin-transform-runtime 
  2. $ npm install --save babel-runtime 

然后更新您的 .babelrc :

  1.   { 
  2.     "plugins": [ 
  3. +     "transform-runtime"
  4.       "transform-es2015-classes" 
  5.     ] 
  6.   } 

現(xiàn)在,Babel 將如下代碼:

  1. class Foo { 
  2.   method() {} 

編譯成這樣:

  1. import _classCallCheck from "babel-runtime/helpers/classCallCheck"
  2. import _createClass from "babel-runtime/helpers/createClass"
  3.  
  4. let Foo = function () { 
  5.   function Foo() { 
  6.     _classCallCheck(this, Foo); 
  7.   } 
  8.  
  9.   _createClass(Foo, [{ 
  10.     key"method"
  11.     value: function method() {} 
  12.   }]); 
  13.  
  14.   return Foo; 
  15. }(); 

而不是將 _classCallCheck 和 _createClass helper 函數(shù)放在需要的每個(gè)文件中。

配置 Babel(進(jìn)階版)

大多數(shù)人都可以通過(guò)僅使用內(nèi)置預(yù)設(shè)來(lái)使用 Babel,但是 Babel 所展現(xiàn)的功能遠(yuǎn)不止于此。

手動(dòng)指定插件

Babel 預(yù)設(shè)只是預(yù)配置插件的集合,如果您想做不同的事情,可以手動(dòng)指定插件。這幾乎與預(yù)設(shè)完全相同。

首先安裝一個(gè)插件:

  1. $ npm install --save-dev babel-plugin-transform-es2015-classes 

然后將 plugins 字段添加到您的 .babelrc 中。

  1.   { 
  2. +   "plugins": [ 
  3. +     "transform-es2015-classes" 
  4. +   ] 
  5.   } 

這使您可以更精確地控制正在運(yùn)行的確切的 transforms 。

有關(guān)官方插件的完整列表,請(qǐng)參見(jiàn)Babel插件頁(yè)面[6]。

還請(qǐng)看一下社區(qū)構(gòu)建的所有插件[7]。如果您想學(xué)習(xí)如何編寫(xiě)自己的插件,請(qǐng)閱讀Babel插件手冊(cè)[8](圖雀社區(qū)將在之后翻譯這本插件手冊(cè),敬請(qǐng)期待~)。

插件選項(xiàng)

許多插件還具有將其配置為不同行為的 option 。例如,許多 transform 都具有 loose 模式,該模式會(huì)放棄某些規(guī)范行為,而傾向于使用更簡(jiǎn)單,性能更高的代碼。

要將選項(xiàng)添加到插件,只需進(jìn)行以下更改:

  1.   { 
  2.     "plugins": [ 
  3. -     "transform-es2015-classes" 
  4. +     ["transform-es2015-classes", { "loose"true }] 
  5.     ] 
  6.   } 

根據(jù)環(huán)境定制 Babel

Babel插件解決了許多不同的任務(wù)。其中許多是開(kāi)發(fā)工具,可以幫助您調(diào)試代碼或與工具集成。還有許多用于優(yōu)化生產(chǎn)中代碼的插件。

因此,通常需要基于環(huán)境的 Babel 配置。您可以使用 .babelrc 文件輕松完成此操作。

  1.   { 
  2.     "presets": ["es2015"], 
  3.     "plugins": [], 
  4. +   "env": { 
  5. +     "development": { 
  6. +       "plugins": [...] 
  7. +     }, 
  8. +     "production": { 
  9. +       "plugins": [...] 
  10. +     } 
  11.     } 
  12.   } 

Babel將根據(jù)當(dāng)前環(huán)境在 env 內(nèi)部啟用配置。

當(dāng)前環(huán)境將使用 process.env.BABEL_ENV 。當(dāng) BABEL_ENV 不可用時(shí),它將回退到 NODE_ENV ,如果不可用,則默認(rèn)為“ development ”。

Unix

  1. $ BABEL_ENV=production [COMMAND] 
  2. $ NODE_ENV=production [COMMAND] 

Windows

  1. SET BABEL_ENV=production 
  2. $ [COMMAND] 
  • 注意:[COMMAND] 是您用來(lái)運(yùn)行Babel的任何東西(即 babel , babel-node ,或者如果您正在使用 babel-register 鉤子,則可能只是 node )。
  • 提示:如果要讓命令在 Unix 和 Windows 跨平臺(tái)上運(yùn)行,請(qǐng)使用 cross-env[9]。

構(gòu)建自己的預(yù)設(shè)

手動(dòng)指定插件?插件選項(xiàng)?基于環(huán)境的設(shè)置?對(duì)于所有項(xiàng)目,所有這些配置似乎都需要重復(fù)很多次。

因此,我們鼓勵(lì)社區(qū)創(chuàng)建自己的預(yù)設(shè)。這可以是您整個(gè)公司[10]的預(yù)設(shè)。

創(chuàng)建預(yù)設(shè)很容易。假設(shè)您有以下 .babelrc 文件:

  1.   "presets": [ 
  2.     "es2015"
  3.     "react" 
  4.   ], 
  5.   "plugins": [ 
  6.     "transform-flow-strip-types" 
  7.   ] 

您需要做的就是按照命名約定 babel-preset-* 創(chuàng)建一個(gè)新項(xiàng)目(請(qǐng)對(duì)此命名空間負(fù)責(zé)!),并創(chuàng)建兩個(gè)文件。

首先,創(chuàng)建一個(gè)新的 package.json 文件,該文件具有您的預(yù)設(shè)所需的 dependencies 關(guān)系。

  1.   "name""babel-preset-my-awesome-preset"
  2.   "version""1.0.0"
  3.   "author""James Kyle <me@thejameskyle.com>"
  4.   "dependencies": { 
  5.     "babel-preset-es2015""^6.3.13"
  6.     "babel-preset-react""^6.3.13"
  7.     "babel-plugin-transform-flow-strip-types""^6.3.15" 
  8.   } 

然后創(chuàng)建一個(gè) index.js 文件,該文件導(dǎo)出 .babelrc 文件的內(nèi)容,并用 require 調(diào)用替換插件/預(yù)設(shè)字符串。

  1. module.exports = { 
  2.   presets: [ 
  3.     require("babel-preset-es2015"), 
  4.     require("babel-preset-react"
  5.   ], 
  6.   plugins: [ 
  7.     require("babel-plugin-transform-flow-strip-types"
  8.   ] 
  9. }; 

然后只需將其發(fā)布到 npm,就可以像使用任何預(yù)設(shè)一樣使用它。

Babel 和其他工具結(jié)合

一旦掌握了 Babel,Babel 便會(huì)很直接地進(jìn)行設(shè)置,但是使用其他工具進(jìn)行設(shè)置可能非常困難。但是,我們嘗試與其他項(xiàng)目緊密合作,以使體驗(yàn)盡可能輕松。

靜態(tài)分析工具

較新的標(biāo)準(zhǔn)為語(yǔ)言帶來(lái)了許多新語(yǔ)法,而靜態(tài)分析工具才剛剛開(kāi)始利用它。

Linting

ESLint 是最受歡迎的 Lint 工具之一,因此,我們維護(hù)了官方的 babel-eslint[11] 集成。首先安裝 eslint 和 babel-eslint 。

  1. $ npm install --save-dev eslint babel-eslint 

接下來(lái),在項(xiàng)目中創(chuàng)建或使用現(xiàn)有的 .eslintrc 文件,并將解析器設(shè)置為 babel-eslint 。

  1.   "parser""babel-eslint"
  2.   "rules": { 
  3.     ... 
  4.   } 

現(xiàn)在將一個(gè) lint 任務(wù)添加到您的 npm package.json 腳本中:

  1.   "name""my-module"
  2.   "scripts": { 
  3.     "lint""eslint my-files.js" 
  4.   }, 
  5.   "devDependencies": { 
  6.     "babel-eslint""..."
  7.     "eslint""..." 
  8.   } 

然后只需運(yùn)行任務(wù)即可完成所有設(shè)置。

  1. $ npm run lint 

有關(guān)更多信息,請(qǐng)查閱 babel-eslint[12]或eslint[13]文檔。

文檔

使用Babel,ES2015和Flow,您可以推斷出很多有關(guān)您的代碼的信息。使用documentation.js[14],您可以非常輕松地生成詳細(xì)的API文檔。

Documentation.js在后臺(tái)使用Babel支持所有最新語(yǔ)法,包括Flow注釋,以便在代碼中聲明類型。

框架

現(xiàn)在,所有主要的JavaScript框架都專注于圍繞語(yǔ)言的未來(lái)調(diào)整其API。因此,在工具中進(jìn)行了大量工作。

框架不僅有機(jī)會(huì)使用Babel,而且有機(jī)會(huì)以改善用戶體驗(yàn)的方式對(duì)其進(jìn)行擴(kuò)展。

React

React極大地改變了其API以使其與ES2015類保持一致(在此處了解更新的API)。更進(jìn)一步,React依賴Babel來(lái)編譯它的JSX語(yǔ)法,不贊成Babel來(lái)使用它自己的自定義工具。您可以按照上述說(shuō)明開(kāi)始設(shè)置 babel-preset-react 程序包。

React社區(qū)接受了Babel并與之合作。社區(qū)[15]現(xiàn)在進(jìn)行了許多轉(zhuǎn)換。

最著名的是 babel-plugin-react-transform 插件,結(jié)合了許多特定于 React 的轉(zhuǎn)換,可以啟用熱模塊重裝和其他調(diào)試實(shí)用程序。

參考資料

[1]交互式設(shè)置頁(yè)面: https://babeljs.io/en/setup/

[2]https://babeljs.io/docs/usage/api/#options: https://babeljs.io/docs/usage/api/#options

[3]Polyfill: https://www.google.com/search?q=%E4%BB%80%E4%B9%88%E6%98%AF+polyfill&oq=%E4%BB%80%E4%B9%88%E6%98%AF+polyfill&aqs=chrome..69i57j0i12.3956j1j4&sourceid=chrome&ie=UTF-8

[4]core-js: https://github.com/zloirock/core-js

[5]regenerator: https://github.com/facebook/regenerator[6]Babel插件頁(yè)面: http://babeljs.io/docs/plugins/

[7]所有插件: https://www.npmjs.com/search?q=babel-plugin

[8]Babel插件手冊(cè): https://github.com/jamiebuilds/babel-handbook/blob/master/translations/en/plugin-handbook.md

[9]cross-env: https://www.npmjs.com/package/cross-env

[10]公司: https://github.com/cloudflare/babel-preset-cf

[11]babel-eslint: https://github.com/babel/babel/tree/master/eslint/babel-eslint-parser

[12]babel-eslint: https://github.com/babel/babel/tree/master/eslint/babel-eslint-parser

[13]eslint: https://eslint.org/

[14]documentation.js: http://documentation.js.org/

[15]社區(qū): https://www.npmjs.com/search?q=babel-plugin+react

 

責(zé)任編輯:姜華 來(lái)源: 圖雀社區(qū)
相關(guān)推薦

2021-01-26 08:37:18

MobXVueReact

2022-09-05 14:45:56

前端K8S

2025-05-28 15:46:13

2014-06-24 09:41:56

Android Stu教程

2024-01-29 00:36:50

Backstage設(shè)施工具

2014-01-22 10:00:10

Android SDKAndroid開(kāi)發(fā)

2021-11-26 09:40:37

EclipseIDEA開(kāi)發(fā)

2016-06-20 10:20:22

Docker云計(jì)算

2013-12-04 14:44:41

Android SDK用戶交互

2013-12-26 15:40:33

Android SDK項(xiàng)目

2013-12-04 13:27:56

Android SDK項(xiàng)目

2021-01-18 05:33:08

機(jī)器學(xué)習(xí)前端算法

2021-01-11 05:18:11

機(jī)器學(xué)習(xí)

2014-06-06 14:25:03

iOS 8SwiftWWDC2014

2013-12-26 15:14:38

Android SDK運(yùn)行調(diào)試

2012-08-01 17:39:17

2013-12-26 14:52:52

Android SDK物理設(shè)備

2013-12-04 14:29:18

Android SDK應(yīng)用程序

2013-12-26 15:47:59

Android SDK應(yīng)用程序

2013-11-27 10:12:11

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美精品在线一区| 97婷婷涩涩精品一区| 国产精品自在自线| 成人日日夜夜| 91色综合久久久久婷婷| 国产精品久久婷婷六月丁香| 黑人巨大精品一区二区在线| 精品视频高潮| 91精品办公室少妇高潮对白| 一区二区三区四区欧美日韩| 秋霞av鲁丝片一区二区| 久久综合狠狠| 欧美激情精品久久久久久久变态| a级大片在线观看| 精品一区二区三区亚洲| 都市激情亚洲色图| 影音先锋欧美资源| 水中色av综合| 国产福利一区在线观看| 午夜精品在线视频| 91插插插插插插| 国产96在线亚洲| 欧美美女一区二区三区| 欧美日韩黄色一级片| 黄色片网站在线观看| 久久综合成人精品亚洲另类欧美| 亚洲最大成人网色| 无码人妻久久一区二区三区| 国一区二区在线观看| 永久555www成人免费| 国产一级免费片| 欧洲一区在线| 制服丝袜中文字幕一区| 久久精品99国产| 草草在线观看| 亚洲欧美日韩国产手机在线| 奇米视频888战线精品播放| 亚洲精品97久久中文字幕| 久久国产福利国产秒拍| 国产成人精品一区| 久草国产精品视频| 精品69视频一区二区三区Q| 欧美成aaa人片免费看| 福利视频第一页| av在线不卡顿| 在线亚洲国产精品网| 欧洲美一区二区三区亚洲 | 国产精品久久波多野结衣| 国产精品美女一区| 激情六月婷婷久久| 91精品在线看| 国产理论片在线观看| 麻豆精品久久久| 国产精品日韩一区| 中文区中文字幕免费看| 日韩不卡手机在线v区| 国产精品激情自拍| 这里只有精品国产| 免费观看久久久4p| 国产日产久久高清欧美一区| 中文字幕人妻一区二区在线视频 | 草草地址线路①屁屁影院成人| 国产成人福利av| 日韩av在线网| 美女洗澡无遮挡| 日韩精品久久久久久久电影99爱| 一区二区三区国产在线观看| 毛片久久久久久| 亚洲国产精品久久久久蝴蝶传媒| 久久国产精品影视| 黄色激情视频在线观看| 先锋a资源在线看亚洲| 国产成人久久精品| 91精品国自产| 成人午夜av影视| 欧美日韩国产精品一卡| 99免在线观看免费视频高清| 亚洲欧美一区二区不卡| 野外做受又硬又粗又大视频√| japanese色国产在线看视频| 欧美三级xxx| 亚洲最大综合网| 韩国三级大全久久网站| 亚洲国产精品成人av| 久久久久久亚洲中文字幕无码| 久久国产影院| 久久理论片午夜琪琪电影网| 精人妻无码一区二区三区| 卡一卡二国产精品| 国产精品亚洲一区| 成人午夜在线观看视频| 亚洲色图视频网站| 国产精品一区二区免费在线观看| 日本成人伦理电影| 日韩欧美国产电影| 中字幕一区二区三区乱码| 小处雏高清一区二区三区| 欧美激情性做爰免费视频| 波多野结衣理论片| 成人一区二区三区视频| 日韩欧美国产二区| 免费电影网站在线视频观看福利| 色婷婷亚洲精品| 国产高潮失禁喷水爽到抽搐| 成人在线一区| 91精品国产高清久久久久久91| 一级黄色a视频| 91偷拍与自偷拍精品| 黄色网址在线免费看| 伊人色综合一区二区三区影院视频| 欧美区在线观看| 精品1卡二卡三卡四卡老狼| 欧美xxxx中国| 日本三级久久久| 成人午夜免费在线观看| 国产精品日韩精品欧美在线| 怡红院av亚洲一区二区三区h| 国产在线不卡一区二区三区| 亚洲图片欧美日产| 日韩欧美亚洲视频| 国产福利91精品一区| 亚洲区一区二区三区| 竹内纱里奈兽皇系列在线观看| 日韩久久精品一区| 熟女av一区二区| 蜜桃视频在线观看一区| 欧美在线激情| 最新中文字幕在线播放| 亚洲国产成人爱av在线播放| 青青草精品在线视频| 久久99精品国产| 亚洲电影一二三区| 性欧美1819sex性高清| 日韩第一页在线| 国产一区二区三区影院| 成人一区二区三区视频在线观看 | 国产精品视区| 好看的日韩精品| 激情av在线播放| 欧美mv日韩mv国产| 激情五月婷婷在线| 国产成人综合视频| www.99riav| 9l亚洲国产成人精品一区二三 | 私库av在线播放| 国产精品一区二区久激情瑜伽| 中文字幕欧美日韩一区二区| 午夜精品久久久久久毛片| 视频直播国产精品| 亚洲综合一区中| 日韩毛片视频在线看| 香蕉视频xxx| 欧美体内she精视频在线观看| 成人欧美一区二区三区视频 | 精品人妻无码中文字幕18禁| 欧美xxx在线观看| 97se国产在线视频| 1区2区在线| 精品一区二区亚洲| 国产稀缺真实呦乱在线| 激情久久久久久久久久久久久久久久| 亚洲精品8mav| 亚洲精品一区二区三区中文字幕| 欧美疯狂做受xxxx高潮| 韩国av永久免费| 岛国视频午夜一区免费在线观看| 国产黄色网址在线观看| 日本不卡在线视频| 免费成人深夜夜行网站视频| 亚洲乱码一区| 日本午夜精品理论片a级appf发布| 青青草在线免费观看| 欧美日韩久久久| 欧美又粗又大又长| 91在线观看一区二区| 激情综合网俺也去| 国产精品久久久久久麻豆一区软件 | 中文字幕 日韩有码| 亚洲精品视频观看| 熟女丰满老熟女熟妇| 毛片不卡一区二区| 久草视频国产在线| 精品国产精品国产偷麻豆| 成人免费自拍视频| 九色porny丨入口在线| 中文欧美日本在线资源| 亚洲欧美高清视频| 在线视频你懂得一区二区三区| 欧美一区二区三区爽爽爽| 97精品久久久久中文字幕| mm131亚洲精品| 亚洲人成久久| 亚洲一区精彩视频| 亚洲va久久| 91在线免费网站| **在线精品| 欧美俄罗斯乱妇| 国产高清在线| 亚洲成人av中文字幕| 国产精品成人无码| 亚洲成人一区二区在线观看| www.日本高清视频| 99久久精品免费看国产| 亚洲免费看av| 国产亚洲午夜| 毛片av在线播放| 热久久天天拍国产| 久精品国产欧美| 亚洲一区二区三区中文字幕在线观看 | 激情五月五月婷婷| 欧美人妖在线| 精品国产乱码久久久久久郑州公司 | 波多野结衣在线网站| 亚洲国产成人精品久久| 国产黄色一级大片| 欧美日韩国产不卡| 无码人妻精品一区二| 欧美日韩综合视频| 久久精品国产亚洲av麻豆色欲| 国产精品毛片大码女人| 蜜桃传媒一区二区亚洲av| 成人晚上爱看视频| 一个人看的视频www| 久久99国产精品久久99| 日本美女高潮视频| 久久一区二区三区超碰国产精品| 欧美视频免费看欧美视频| 欧美/亚洲一区| 色香蕉在线观看| 久久免费大视频| 亚洲精品一品区二品区三品区| 日韩有码一区| 美女精品国产| 日韩精品欧美大片| 精品中文字幕一区| 欧美日韩看看2015永久免费 | 日韩一区欧美| 日本午夜一区二区三区| 精品影片在线观看的网站| 久久久99爱| 亚洲福利网站| 日本视频一区在线观看| 成人aaaa| 亚洲一区三区| 亚洲先锋影音| 欧美精品在欧美一区二区| 欧美精品网站| 国产色一区二区三区| 99riav1国产精品视频| av高清在线免费观看| 99精品福利视频| 夫妻免费无码v看片| 久久精品午夜| 亚洲国产精品三区| 久久99精品网久久| 久久艹这里只有精品| 国产成人亚洲综合色影视| 国产高潮失禁喷水爽到抽搐| 99re热这里只有精品免费视频| 免费a v网站| 91看片淫黄大片一级在线观看| 熟妇高潮精品一区二区三区| 国产欧美一区二区在线观看| 91无套直看片红桃在线观看| 亚洲精品一二三| 日韩成人在线免费视频| 色女孩综合影院| 国产又粗又猛又爽又黄视频 | 亚洲一级一区| 国产精品视频一区二区三区四区五区 | 欧美高清在线精品一区| www中文在线| 一区二区三区四区高清精品免费观看 | 国产高清一级毛片在线不卡| 久久精品国亚洲| 欧美精品videossex少妇| 国内自拍欧美激情| 久久久人成影片一区二区三区在哪下载| 国产精品免费视频xxxx| 成人激情久久| 免费一区二区三区| 99久久久久| 97成人在线免费视频| 蜜桃av一区二区三区| 少妇精品无码一区二区| 久久精品视频在线免费观看| 澳门黄色一级片| 欧美视频中文在线看| 国产模特av私拍大尺度| 亚洲精品视频在线播放| 成视频免费观看在线看| 欧美在线激情网| 国产精品久一| 日韩av电影免费在线| 一区在线免费| 91小视频网站| 99国产欧美久久久精品| 黑人操日本美女| 色老汉一区二区三区| 草草视频在线播放| 中文字幕亚洲天堂| 国产理论在线| 97超碰人人模人人爽人人看| 精品国产一区二区三区香蕉沈先生| 99re6这里有精品热视频| 日韩黄色免费网站| 午夜免费福利影院| 亚洲免费观看高清在线观看| 亚洲毛片一区二区三区| 日韩精品自拍偷拍| 成人高清免费在线播放| 97精品欧美一区二区三区| 91麻豆精品| 涩涩涩999| 一本色道久久综合一区| 伊人色在线视频| 亚洲国产精品99久久久久久久久| 日干夜干天天干| 欧美大肚乱孕交hd孕妇| 欧美jizz18性欧美| 国产精品高潮呻吟久久av野狼| 理论片一区二区在线| 欧美久久在线观看| 国产主播一区二区三区| 激情五月激情综合| 在线观看一区二区精品视频| 青青草在线视频免费观看| 97精品视频在线播放| 精品视频在线你懂得| 国产一线二线三线女| 成人永久看片免费视频天堂| 久草视频免费播放| 日韩精品中文字幕在线一区| av网址在线看| 亚洲精品日产aⅴ| 88国产精品视频一区二区三区| 九九热精品在线播放| 中文字幕第一页久久| 岳乳丰满一区二区三区| 中文字幕av一区中文字幕天堂 | 精品视频一区二区| 亚洲欧洲一区| 亚洲综合自拍网| 婷婷六月综合亚洲| 免费看黄色一级视频| 久久免费国产精品1| 精品国产一区二区三区不卡蜜臂 | 亚洲熟女少妇一区二区| 欧美性生活大片视频| 国产日本在线| 国产精品视频网址| 91综合在线| 亚洲国产综合av| 亚洲国产日韩a在线播放 | 中文字幕欧美日韩va免费视频| 成人日韩在线观看| 亚洲日本欧美在线| 精品在线你懂的| 国产这里有精品| 亚洲电影免费观看高清| 国产资源在线观看入口av| 欧美国产综合视频| 日本欧美大码aⅴ在线播放| 男女全黄做爰文章| 日韩女优av电影| 日韩电影毛片| 亚洲一区二区在线免费观看| 国产一区二区三区精品视频| 久久精品视频久久| 亚洲欧洲日产国码av系列天堂| 日韩一级二级| 日本老太婆做爰视频| 99re热这里只有精品视频| av一级在线观看| 欧美大奶子在线| 欧美交a欧美精品喷水| 特级丰满少妇一级| 亚洲中国最大av网站| 青青草在线免费视频| 亚洲一区二区三区视频| 99在线|亚洲一区二区| 久草福利资源在线| 亚洲成人a级网| 欧美一区二区三区婷婷| 日b视频免费观看| 国产喷白浆一区二区三区| 精品国产无码一区二区| 热99精品里视频精品| 一个色综合网| 公侵犯人妻一区二区三区| 日韩一级黄色大片| 欧美性猛交xxx高清大费中文| 中文字幕日韩一区二区三区| 99久久99久久免费精品蜜臀| 一区二区三区午夜| 97视频在线看| 欧美成人首页| 天天操天天干天天操天天干| 亚洲福利小视频| 国产精品视频一区二区三区|