1. 程式人生 > >[轉] babel入門基礎

[轉] babel入門基礎

orm 需要 target ssi all promise npm babel strong

背景

  babel的官網說babel是下一代的js語法編譯器,現在自己也在很多項目中使用了babel,可是自己對babel的認識呢,只停留在從google和別人項目中copy的配置代碼上,內心感到很不安,最近花了點時間整理了一下,分享給大夥。

babel常用配置

通常在前端或node項目中,進行以下配置:

入口文件app.babel.js裏面配置:
1 2 3 4 5 6 7 // babel require(‘babel-core/register‘)({ presets: [‘es2015‘, ‘stage-0‘]
}); require(‘babel-polyfill‘); require(‘./app.js‘);
.babelrc文件中的設置:
1 2 3 { "presets": ["es2015", "stage-0"] }

babel基礎概念

1.babel-core

  新的js語法之前是不存在的,需要將js代碼分析抽象的語法樹 ,方便各個插件分析語法進行相應的處理成低版本的js;

2.babel-register

  改寫了require命令,會對.js、jsx、.es、es6 後綴的模塊都會先轉碼,但並不會對當前文件進行轉碼;由於該轉碼是實時的,所以不能用在生產環境中。

3.babelrc文件

  babel-core只是生成了語法樹,並沒有轉碼,轉碼工作由插件完成。自從babel升級到6.x之後,babel的插件都是可以插拔的,只有設置了相應的插件,babel才能知道如何處理js代碼。   .babelrc主要對presets、plugins進行設置,其中presets主要是一套預設置的插件,如es-2015、stage-0等,plugins可以讓用戶選取需要的單個插件。

  目前babel提供了幾個官方的preset,主要包括:env es2015 es2016 es2017 flow latest react 。設置presets的時候需要提前npm安裝相應的插件,插件名格式:babel-preset-xxx;如下:

1 2 3 { "presets": ["es2015"] } npm install babel-preset-es2015

  

  如果不需要一套plugins的預設置,可以通過plugins屬性引入所需的plugin,比如以下的設置就會引入編譯class函數的功能。
1 { "plugins": ["transform-es2015-classes"] }

  

  需要註意的是,某些插件是不被presets預置的,如常用的transform-runtime插件和transform-remove-console插件。   關於presets和plugins的優先順序一般遵從3個原則:
  • plugins優先於presets進行編譯。
  • plugins按照數組的index增序(從數組第一個到最後一個)進行編譯。
  • presets按照數組的index倒序(從數組最後一個到第一個)進行編譯。
  • 詳細信息可以查看官方文檔

4.babel-polyfill

  polyfill擁有自定義的regenerator runtime 和core-js;它模擬了ES2015的環境,一般使用在應用程序中,而不是當做庫和工具使用;比如說babel-node中自帶了babel-polyfill,babel-polyfill為node提供了ES6的REPL環境。REPL,即read-eval-print-loop交互式解釋器。詳情可參考阮老師的文章。   babel幾乎能翻譯所有的js新語法,但是對於APIs卻並非如此,如新增對象Promise、Set、Map等,靜態方法Object.assign等,這就需要創造一個ES6的運行環境。 可以通過babel-polyfill來轉碼新API,其實現辦法就是向全局變量上掛新增的對象或在原型鏈上增加方法,如在node環境下將Promise掛在global對象上。缺點就是汙染全局變量。   還有一個避免全局汙染的方法就是使用babel-runtime + babel-plugins-runtime-transform;babel-runtime 更像是分散的polyfill 模塊,我們可以在自己的模塊裏單獨引入,比如 require(‘babel-runtime/core-js/promise’) ,它們不會在全局環境添加未實現的方法,只是這樣手動引用每個 polyfill 會非常麻煩。我們借助 Runtime transform 插件來自動化處理這一切。

webpack中如何使用babel

1.使用babel-runtime

需要安裝babel-runtime和babel-plugin-transform-runtime
1 2 3 4 5 6 7 8 9 10 module: { loaders: [{ loader: ‘babel‘, test: /\.js/, include: path.join(__dirname, ‘src‘), query: { plugins: [‘transform-runtime‘], presets: [ ‘es2015‘, ‘stage-0‘], }}] }

2.使用babel-polyfi

將babel-polyfill放在入口設置處
1 2 3 4 5 6 7 8 9 10 11 entry: [ ‘babel-polyfill‘,‘src/index.js‘, ], module: { loaders: [{ loader: ‘babel‘, test: /\.js/, include: path.join(__dirname, ‘src‘), query: { presets: [‘es2015‘, ‘stage-0‘] }}] }

  

參考資料: http://www.tuicool.com/articles/vmA3U3R https://segmentfault.com/a/1190000008159877 https://github.com/brunoyang/blog/issues/20

[轉] babel入門基礎