亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

babel之配置文件.babelrc入門詳解

2019-11-19 14:20:18
字體:
來源:轉載
供稿:網友

介紹

es6特性瀏覽器還沒有全部支持,但是使用es6是大勢所趨,所以babel應運而生,用來將es6代碼轉換成瀏覽器能夠識別的代碼
babel有提供專門的命令行工具方便轉碼,可以自行去了解

什么是Babel

官方解釋,是下一代JavaScript 語法的編譯器。

既然是下一代Javascript的標準,瀏覽器因版本的不同對此會有兼容性問題,JavaScript的新的方法都不能使用,但是目前我們在項目開發一直提倡使用最新的語法糖編寫,不但能減少代碼量,而且async,await等新特性還解決了回調的編寫機制,減輕了代碼維護成本。

Babel就因此而生,它可以讓你放心使用大部分的JavaScript的新的標準的方法,然后編譯成兼容絕大多數的主流瀏覽器的代碼。在項目工程腳手架中,一般會使用.babelrc文件,通過配置一些參數配合webpack進行打包壓縮。也通過網上了解,寫法各有不同,參數也大不相同,因此,我重新整理一份資料,詳細的介紹下各個配置項的意義所在,以便清晰了解如果使用。

以下配置主要正對webpack3+寫法。

Babel轉譯器

在.babelrc配置文件中,主要是對預設(presets)和插件(plugins)進行配置,因此不同的轉譯器作用不同的配置項,大致可分為以下三項:

1.語法轉義器。主要對javascript最新的語法糖進行編譯,并不負責轉譯javascript新增的api和全局對象。例如let/const就可以被編譯,而includes/Object.assign等并不能被編譯。常用到的轉譯器包有,babel-preset-env、babel-preset-es2015、babel-preset-es2016、babel-preset-es2017、babel-preset-latest等。在實際開發中可以只選用babel-preset-env來代替余下的,但是還需要配上javascirpt的制作規范一起使用,同時也是官方推薦

{ "presets": ["env", {   "modules": false  }],  "stage-2"}

2.補丁轉義器。主要負責轉譯javascript新增的api和全局對象,例如babel-plugin-transform-runtime這個插件能夠編譯Object.assign,同時也可以引入babel-polyfill進一步對includes這類用法保證在瀏覽器的兼容性。Object.assign 會被編譯成以下代碼:

復制代碼 代碼如下:

__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_assign___default()

3.jsx和flow插件,這類轉譯器用來轉譯JSX語法和移除類型聲明的,使用Rect的時候你將用到它,轉譯器名稱為babel-preset-react

創建預設(presets)

主要通過npm安裝babel-preset-xx插件來配合使用,例如通過 npm install babel-preset-stage-2 babel-preset-env --save-dev 安裝,會有相應如下配置。

{ "presets": [  ["env", options],  "stage-2" ]}

stage-2配置

babel主要提供以下幾種轉義器包,括號里面是對應配置文件的配置項

babel-preset-stage-0(stage-0) babel-preset-stage-1(stage-1) babel-preset-stage-2(stage-2) babel-preset-stage-3(stage-3)

不同階段的轉譯器之間是包含的關系,preset-stage-0轉譯器除了包含了preset-stage-1的所有功能還增加了transform-do-expressions插件和transform-function-bind插件,同樣preset-stage-1轉譯器除了包含preset-stage-2的全部功能外還增加了一些額外的功能。

options配置介紹

官方推薦使用babel-preset-env來替代一些插件包的安裝(es2015-arrow-functions,es2015-block-scoped-functions等等),并且有如下幾種配置信息,介紹幾個常用的,

更多配置可以參考官網https://babeljs.io/docs/plugins/preset-env/

{  "targets": {    "chrome": 52,    "browsers": ["last 2 versions", "safari 7"],    "node":"6.10"  }  "modules": false}

targets可以制定兼容瀏覽器版本,如果設置了browsers,那么就會覆蓋targets原本對瀏覽器的限制配置。

targets.node正對node版本進行編譯

modules通常都會設置為false,因為默認都是支持CommonJS規范,同時還有其他配置參數:"amd" | "umd" | "systemjs" | "commonjs",systemjs我還不知道規范寫法是什么,amd和umd以及commonjs相對比較熟悉,下面簡要列舉下書寫規范。

amd代碼規范,在ng1中會用到比較多,主要用于依賴注入:

define(['jquery'], function ($) {  //  方法  function myFunc(){};   //  暴露公共方法  return myFunc;})

commonjs規范,也是node環境中尊崇的一種規范:

var $ = require('jquery');//  方法function myFunc(){}; //  暴露公共方法(一個)module.exports = myFunc;{% endcodeblock %}>umd規范,兼容amd以及commonjs規范,目前在第三方插件編寫使用比較多:{% codeblock lang:javascript %}(function (root, factory) {  if (typeof define === 'function' && define.amd) {    // AMD    define(['jquery'], factory);  } else if (typeof exports === 'object') {    // Node, CommonJS之類的    module.exports = factory(require('jquery'));  } else {    // 瀏覽器全局變量(root 即 window)    root.returnExports = factory(root.jQuery);  }}(this, function ($) {  //  方法  function myFunc(){};   //  暴露公共方法  return myFunc;}));

插件(plugins)

插件配置項同預設配置項一樣,需要搭配babel相應的插件進行配置,可以選擇配置插件來滿足單個需求,例如早期我們會有如下配置:

{ "plugins": [  "check-es2015-constants",  "es2015-arrow-functions",  "es2015-block-scoped-functions",  // ... ]}

但是這些插件從維護到書寫極為麻煩,后來官方統一推薦使用env,全部替代了這些單一的插件功能,可以簡化配置如下,也就是我前面提到了babel-preset-env:

{ "presets": [  "es2015" ]}

這里主要介紹兩款常用插件,分別是babel-plugin-transform-runtime,babel-plugin-syntax-dynamic-import。

基本配置代碼如下:

{ "plugins": [  "syntax-dynamic-import",["transform-runtime"] ]}

transform-runtime

為了解決這種全局對象或者全局對象方法編譯不足的情況,才出現了transform-runtime這個插件,但是它只會對es6的語法進行轉換,而不會對新api進行轉換。如果需要轉換新api,也可以通過使用babel-polyfill來規避兼容性問題。

對Object.assign進行編譯,配置與未配置經過webpack編譯后的代碼片段如下:

// 未設置代碼片段:__webpack_require__("ez/6");var aaa = 1;function fna() { var dd = 33333; var cc = Object.assign({ key: 2 }); var xx = String.prototype.repeat.call('b', 3); if ("foobar".String.prototype.includes("foo")) {  var vv = 1; } return dd;}// 設置代碼片段:/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_assign___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_assign__);__webpack_require__("ez/6");var aaa = 1;function fna() { var dd = 33333; var cc = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_assign___default()({ key: 2 }); var xx = String.prototype.repeat.call('b', 3); if ("foobar".String.prototype.includes("foo")) {  var vv = 1; } return dd;}

對class定義類會進行編譯,配置與未配置經過webpack編譯后的代碼片段如下:

// 未設置代碼片段:function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }var Canvas = function Canvas(height, width) { _classCallCheck(this, Canvas); this.height = height; this.width = width;};var Canvas2 = function Canvas2(height, width) { _classCallCheck(this, Canvas2); this.height = height; this.width = width;};
// 設置代碼片段:/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck__);var Canvas = function Canvas(height, width) { __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, Canvas); this.height = height; this.width = width;};var Canvas2 = function Canvas2(height, width) { __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_classCallCheck___default()(this, Canvas2); this.height = height; this.width = width;};

對Generator函數也有同上的編譯效果,目前項目中使用該函數較小,一般使用promise替代,以及async await所以未對該函數做測試。

官方說對promise也會產生編譯,但是實際測試結果卻沒有效果

經過webpack打包最終測試,引入transform-runtime該配置項后,打包入口js文件大小會略微增大,并不像官方說的能夠縮小文件體積

未配置的最終打包效果:

配置后的最終打包效果:

雖然文件大小會有所增大,但是解決一些兼容性的問題,同時,從以上給出的測試代碼例子來看,使用transform-runtime后,可以減少內部全局函數的定義,從結構上看尊崇了webpack的模塊化思想,所以還是建議使用該插件。

syntax-dynamic-import

這個插件主要解決動態引入模塊的問題

function nDate() { import('moment').then(function(moment) {  console.log(moment().format()); }).catch(function(err) {  console.log('Failed to load moment', err); });}nDate();

如果.babelrc配置項中使用了"stage-2",也可以不實用該插件,同樣支持動態模塊引入。

不然就會報以下錯誤:

  1. Module build failed: SyntaxError: 'import' and 'export' may only appear at the top level, or (import 和 export只能在最外層,也就是不能用在函數或者塊中)
  2. Module build failed: SyntaxError: Unexpected token, expected {

其他配置項

ignore

主要作用就是可以指定不編譯那些代碼

{ "ignore":["./module/a.js"]}

let,Object.assign,class定義都未編譯,編譯效果如下:

__webpack_require__("ez/6");const aaa = 1;function fna () { let dd = 33333 let cc = Object.assign({key:2}) let xx = String.prototype.repeat.call('b', 3) if ("foobar".String.prototype.includes("foo")) {  let vv = 1 } return dd}function fna2 () { return fna() + aaa + __WEBPACK_IMPORTED_MODULE_0__b__["a" /* default */]}class Canvas { constructor(height, width) {  this.height = height;  this.width = width; }}class Canvas2 { constructor(height, width) {  this.height = height;  this.width = width; }}

minified

主要設置編譯后是否是壓縮,boolean類型,如果使用babel-cli進行打包編譯文件這個配置項能夠起到作用,但是目前大部分還是會依賴第三方打包工具,例如webpack,所以這個配置參數一般不用設置,webpack插件中的UglifyJsPlugin做了壓縮的工作。

comments

在生成的文件中,不產生注釋,boolean類型,webpack插件中的UglifyJsPlugin也同樣集成了這個功能。

env

基本配置如下:

{ "env": {  // test 是提前設置的環境變量,如果沒有設置BABEL_ENV則使用NODE_ENV,如果都沒有設置默認就是development  "test": {   "presets": ["env", "stage-2"],   // instanbul是一個用來測試轉碼后代碼的工具   "plugins": ["istanbul"]  } }}

再談兼容性問題

Babel默認只轉換新的JavaScript語法,而不轉換新的API,比如Iterator、Generator、Set、Maps、Promise等等全局對象,以及一些定義在全局對象上的方法(比如Object.assign)都不會轉碼,具體的可以參考babel-plugin-transform-runtime模塊的 definitions.js 文件。

這里主要涉及到babel編譯后依然會存在瀏覽器兼容性問題,一般會使用transform-runtime和babel-polyfill配合使用,對于后者只需要在項目入口文件require引入即可。

當然在使用類似Object.assign函數功能時,可以使用lodash庫來替代,promise可以使用Q.js替代等等方案,這樣依賴可以不需要引入以上插件,具體可以根據項目具體安排

總結

.babelrc配置文件主要還是以presets和plugins組成,通過和webpack配合進行使用,分享下我們在項目中常用的配置。以上都是通過學習總結出來的,有什么不對的地方希望指出。

vue項目開發使用的配置如下:

{ "presets": [  ["env", {   "modules": false  }],  "stage-2" ], // 下面指的是在生成的文件中,不產生注釋 "comments": false, "plugins": ["transform-runtime","syntax-dynamic-import"], "env": {  // test 是提前設置的環境變量,如果沒有設置BABEL_ENV則使用NODE_ENV,如果都沒有設置默認就是development  "test": {   "presets": ["env", "stage-2"],   // instanbul是一個用來測試轉碼后代碼的工具   "plugins": ["istanbul"]  } }}

react項目開發使用的配置如下:

{ "presets": [  ["env", { "modules": false }],  "stage-2",  "react" ], "plugins": ["transform-runtime"], "comments": false, "env": {  "test": {   "presets": ["env", "stage-2"],   "plugins": [ "istanbul" ]  } }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩亚洲激情| 中文一区二区视频| 欧美肥老太性生活视频| 91老司机精品视频| 欧洲亚洲妇女av| 亚洲日韩欧美视频一区| 国产成人中文字幕| 红桃视频成人在线观看| 97在线观看视频| 91夜夜未满十八勿入爽爽影院| 57pao国产精品一区| 日韩资源在线观看| 亚洲欧美自拍一区| 91精品国产91久久久| 国产精品一区二区三区在线播放| 欧美性猛交xxxx免费看| 亚洲国产女人aaa毛片在线| 最新国产成人av网站网址麻豆| 精品国内亚洲在观看18黄| 欧美电影免费看| 成人黄色免费网站在线观看| 欧美黄色三级网站| 久久久国产精彩视频美女艺术照福利| 国产精品99久久久久久久久| 成人性生交大片免费看视频直播| 高清一区二区三区四区五区| 国产精品国产自产拍高清av水多| 日韩欧美中文免费| 26uuu国产精品视频| 日韩中文字幕国产| 亚洲三级免费看| 欧美精品手机在线| 国产成人av网址| 免费av一区二区| 成人免费网站在线看| 久久久久成人网| 亚洲一二三在线| 国产亚洲激情视频在线| 欧美日韩国产区| 国产精品久久久久久久7电影| 日本欧美黄网站| 亚洲国产精品嫩草影院久久| 亚洲第一精品久久忘忧草社区| 丝袜美腿亚洲一区二区| 日韩一区二区久久久| 97激碰免费视频| 国产亚洲精品va在线观看| 国产一区二区三区丝袜| 久久久久久久久久久免费精品| 欧美性在线视频| 自拍偷拍亚洲区| 久久久久久一区二区三区| 精品久久久999| 一区二区三区在线播放欧美| 久久久久久久久久久网站| 国产91在线播放| 国产精品免费小视频| 日韩美女av在线免费观看| 91免费的视频在线播放| 久久国产精品久久国产精品| 久久综合久久美利坚合众国| 成人国产亚洲精品a区天堂华泰| 亚洲成色www8888| 日韩在线视频观看| 91精品久久久久久久久久另类| 欧美大片欧美激情性色a∨久久| 中文在线资源观看视频网站免费不卡| 国产精品对白刺激| 欧美精品国产精品日韩精品| 欧美中在线观看| 欧美色欧美亚洲高清在线视频| 欧美激情精品久久久| 亚洲欧美日韩综合| 国产精品一区电影| 日韩av免费在线播放| 全球成人中文在线| 国产精品青青在线观看爽香蕉| 欧美成人午夜激情| 国产亚洲综合久久| 91在线|亚洲| 国产精品白丝jk喷水视频一区| 精品久久国产精品| 欧美黄色三级网站| 亚洲国产精品热久久| 国产97在线亚洲| 91久久国产婷婷一区二区| 日韩电影中文字幕在线| 国产精品久久久久久久久久尿| 欧美—级a级欧美特级ar全黄| 日韩风俗一区 二区| 亚洲欧洲日韩国产| 69av在线播放| 国产va免费精品高清在线观看| 欧美视频免费在线观看| 91九色单男在线观看| 原创国产精品91| 中文字幕av一区中文字幕天堂| 成人综合国产精品| 亚洲乱码一区av黑人高潮| 成人免费看吃奶视频网站| 在线播放日韩专区| 亚洲欧美在线一区二区| 国产精品尤物福利片在线观看| 啊v视频在线一区二区三区| 亚洲精品成人久久电影| 国产日韩欧美自拍| 91高潮精品免费porn| 国产精品福利久久久| 日韩精品视频在线观看网址| 一区二区三区美女xx视频| 日韩在线观看成人| 国产91色在线|| 国产亚洲精品久久久久久| 性色av一区二区三区免费| 欧美黄色性视频| 亚洲精品www久久久久久广东| 久久精品免费电影| 久久久久久久久久久网站| 久久69精品久久久久久久电影好| 精品久久久久久久久中文字幕| 亚洲字幕在线观看| 欧美日韩国产一中文字不卡| 欧美视频专区一二在线观看| 欧美激情亚洲精品| 中文字幕亚洲欧美日韩2019| 欧美黑人巨大xxx极品| 欧美日韩中国免费专区在线看| 久久av在线播放| 国产精品美女免费看| 一区二区三区无码高清视频| 九九精品在线视频| 久久视频在线免费观看| 51久久精品夜色国产麻豆| 国产69久久精品成人| 国产亚洲精品久久| 精品亚洲精品福利线在观看| 日韩av色在线| 国产精品久久婷婷六月丁香| 97香蕉超级碰碰久久免费的优势| 中文字幕亚洲色图| 国产精品免费一区豆花| 久久69精品久久久久久久电影好| 国产成人精品一区二区在线| 亚洲老头老太hd| 免费不卡欧美自拍视频| 成人av资源在线播放| 亚洲欧美一区二区激情| 欧美成人精品在线观看| 欧美精品在线观看| 久久久免费在线观看| 国产一区二区三区在线观看视频| 久久久成人的性感天堂| 国内免费久久久久久久久久久| 国产欧美日韩亚洲精品| 亚洲aa中文字幕| 成人中文字幕在线观看| 亚洲一区中文字幕在线观看| 国产女人精品视频| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲视频欧洲视频| 久久国产精品久久精品| 国产精品第一页在线| 97免费在线视频| 国产人妖伪娘一区91|