babel-cli
Babel 的 CLI 是一種在命令列下使用 Babel 編譯檔案的簡單方法。
babel-register
這種方法只需要引入檔案就可以執行 Babel,但請注意這種方法並不適合正式產品環境使用。 直接部署用此方式編譯的程式碼不是好的做法。 在部署之前預先編譯會更好。 不過用在構建指令碼或是其他本地執行的指令碼中是非常合適的。
$ npm install --save-dev babel-register
require("babel-register");
require("./index.js");
複製程式碼
babel-node
如果你要用 node CLI 來執行程式碼,那麼整合 Babel 最簡單的方式就是使用 babel-node CLI,它是 node CLI 的替代品。
首先確保babel-cli
已經安裝了。
$ npm install --save-dev babel-cli
{
"scripts": {
- "script-name": "node script.js"
+ "script-name": "babel-node script.js"
}
}
複製程式碼
babel-core
如果你需要以程式設計的方式來使用 Babel,可以使用babel-core
這個包。
$ npm install babel-core
var babel = require("babel-core");
//字串形式的 JavaScript 程式碼可以直接使用 babel.transform 來編譯。
babel.transform("code();", options);
// => { code, map, ast }
//如果是檔案的話,可以使用非同步 api:
babel.transformFile("filename.js", options, function(err, result) {
result; // => { code, map, ast }
});
//要是已經有一個 Babel AST(抽象語法樹)了就可以直接從 AST 進行轉換。
babel.transformFromAst(ast, code, options);
// => { code, map, ast }
複製程式碼
配置 Babel
.babelrc
在我們告訴 Babel 該做什麼之前,我們需要建立一個配置檔案。你需要做的就是在專案的根路徑下建立 .babelrc 檔案。然後輸入以下內容作為開始:
{
"presets": [],
"plugins": []
}
//這個檔案就是用來讓 Babel 做你要它做的事情的配置檔案。
複製程式碼
注意:儘管你也可以用其他方式給 Babel 傳遞選項,但 .babelrc 檔案是約定也是最好的方式。
babel-preset-es2015
我們先從讓 Babel 把 ES2015(最新版本的 JavaScript 標準,也叫做 ES6)編譯成 ES5(現今在大多數 JavaScript 環境下可用的版本)開始吧。
npm install --save-dev babel-preset-es2015
{
"presets": [
+ "es2015"
],
"plugins": []
}
複製程式碼
babel-preset-react
$ npm install --save-dev babel-preset-react
然後在 .babelrc 檔案裡補充:
{
"presets": [
"es2015",
+ "react"
],
"plugins": []
}
複製程式碼
babel-preset-stage-x
JavaScript 還有一些提案,正在積極通過 TC39(ECMAScript 標準背後的技術委員會)的流程成為標準的一部分。
這個流程分為 5(0-4)個階段。 隨著提案得到越多的關注就越有可能被標準採納,於是他們就繼續通過各個階段,最終在階段 4 被標準正式採納。
以下是4 個不同階段的(打包的)預設:
babel-preset-stage-0
babel-preset-stage-1
babel-preset-stage-2
babel-preset-stage-3
注意 stage-4 預設是不存在的因為它就是上面的
es2015
預設。
以上每種預設都依賴於緊隨的後期階段預設。例如,babel-preset-stage-1
依賴 babel-preset-stage-2
,後者又依賴 babel-preset-stage-3
。.
使用的時候只需要安裝你想要的階段就可以了:
$ npm install --save-dev babel-preset-stage-2
複製程式碼
然後新增進你的 .babelrc
配置檔案。
{
"presets": [
"es2015",
"react",
+ "stage-2"
],
"plugins": []
}
複製程式碼
執行 Babel 生成的程式碼
babel-polyfill
Babel 幾乎可以編譯所有時新的 JavaScript 語法,但對於 APIs 來說卻並非如此。
比方說,下列含有箭頭函式的需要編譯的程式碼:
function addAll() {
return Array.from(arguments).reduce((a, b) => a + b);
}
複製程式碼
最終會變成這樣:
function addAll() {
return Array.from(arguments).reduce(function(a, b) {
return a + b;
});
}
複製程式碼
然而,它依然無法隨處可用因為不是所有的 JavaScript 環境都支援 Array.from
。
Uncaught TypeError: Array.from is not a function
複製程式碼
為了解決這個問題,我們使用一種叫做 Polyfill(程式碼填充,也可譯作相容性補丁) 的技術。 簡單地說,polyfill 即是在當前執行環境中用來複制(意指模擬性的複製,而不是拷貝)尚不存在的原生 api 的程式碼。 能讓你提前使用還不可用的 APIs,Array.from
就是一個例子。
Babel 用了優秀的 core-js 用作 polyfill,並且還有定製化的 regenerator 來讓 generators(生成器)和 async functions(非同步函式)正常工作。
要使用 Babel polyfill,首先用 npm 安裝它:
$ npm install --save babel-polyfill
複製程式碼
然後只需要在檔案頂部匯入 polyfill 就可以了:
import "babel-polyfill";
複製程式碼
babel-runtime
為了實現 ECMAScript 規範的細節,Babel 會使用“助手”方法來保持生成程式碼的整潔。
由於這些助手方法可能會特別長並且會被新增到每一個檔案的頂部,因此你可以把它們統一移動到一個單一的“執行時(runtime)”中去。
通過安裝 babel-plugin-transform-runtime
和 babel-runtime
來開始。
$ npm install --save-dev babel-plugin-transform-runtime
$ npm install --save babel-runtime
複製程式碼
然後更新 .babelrc
:
{
"plugins": [
+ "transform-runtime",
"transform-es2015-classes"
]
}
複製程式碼
現在,Babel 會把這樣的程式碼:
class Foo {
method() {}
}
複製程式碼
編譯成:
import _classCallCheck from "babel-runtime/helpers/classCallCheck";
import _createClass from "babel-runtime/helpers/createClass";
let Foo = function () {
function Foo() {
_classCallCheck(this, Foo);
}
_createClass(Foo, [{
key: "method",
value: function method() {}
}]);
return Foo;
}();
複製程式碼
這樣就不需要把 _classCallCheck
和 _createClass
這兩個助手方法放進每一個需要的檔案裡去了。