使用Webpack和Babel編譯javaScript代碼

ECMAScript

ECMAScript是一個由 TC39委員會發(fā)布的標準,JavaScript是對 ECMAScript標準的一個實現(xiàn)子集,可以理解為JavaScript = ECMAScript + 宿主 API(瀏覽器的Dom + Bom API 或者 node的API)宅楞。ECMAScript標準從第三個版本也就是ES3到ES6(也稱為ECMAScript 2015)時隔六年,ES6給 JavaScript帶來革命性的進步蒲肋,加入了類、靜態(tài)模塊體系、塊級作用域等特性兜粘,雖然瀏覽器自身的功能增強申窘、 V8 等 JavaScript 引擎性能提升,但是不同廠商的瀏覽器對于ES6的支持程度參差不齊孔轴,且瀏覽器對規(guī)范的實現(xiàn)速度仍遠遠趕不上規(guī)范更新的速度剃法,很多新新特性不能在全部瀏覽器中運行,在這個環(huán)境因素下路鹰,JavaScript語法編譯器被大廣泛應用贷洲。

Babel

作用

Babel是一款JavaScript語法編譯器,主要用于將 ECMAScript 2015+ 版本的代碼轉換為向后兼容的 JavaScript 語法晋柱,以便能夠運行在當前和舊版本的瀏覽器或其他環(huán)境中(輸入以下一代 JavaScript 語法書寫的代碼 => 輸出瀏覽器兼容的 JavaScript 代碼)优构,先來看看使用babel將es6代碼編譯為es5的效果:

// es6的箭頭函數(shù)[1, 2, 3].map((n) => n + 1);

輸出代碼:

//編譯后的es5代碼"use strict";[1,2,3].map(function(n){returnn +1;});

Babel除了對新語法的轉換,還可以通過 Polyfill 方式在目標環(huán)境中添加缺失的特性雁竞。

插件和preset

Babel本身將代碼解析之后再輸出同樣的代碼钦椭,什么都沒有做基本上類似于:

constbabel =code=>code;

我們實際上是使用的Babel插件或者preset(一組插件)轉換我們的代碼,插件分為轉換插件和語法插件(轉換插件會自動啟用語法插件)碑诉。

常用插件列表

react-jsx

arrow-functions

block-scoped-functions

block-scoping

classes

computed-properties

destructuring

duplicate-keys

for-of

function-name

instanceof

literals

常用preset列表

@babel/preset-env

@babel/preset-flow

@babel/preset-react

@babel/preset-typescript

在使用Babel插件進行編譯時彪腔,插件的使用順序很重要,意思是:如果兩個轉換插件都將處理“程序(Program)”的某個代碼片段进栽,則將根據(jù)轉換插件或preset的排列順序依次執(zhí)行德挣。

插件在 Presets 前運行。

插件順序從前往后排列快毛。

Preset 順序是顛倒的(從后往前)盲厌。

插件和preset都可以接受參數(shù),參數(shù)由插件名和參數(shù)對象組成一個數(shù)組祸泪,可以在配置文件中設置吗浩,參數(shù)對象為一個以參數(shù)名作為鍵(key)的對象。

{"plugins": [? ? ["transform-async-to-module-method",? ? ? {"module":"bluebird","method":"coroutine"}? ? ]? ]}

自定義插件

1没隘、利用?astexplorer.net?創(chuàng)建一個插件

//一個插件就是一個函數(shù)exportdefaultfunction({types: t}) {return{? ? visitor: {? ? ? Identifier(path) {? ? ? ? letname=path.node.name; //reversethename: JavaScript -> tpircSavaJpath.node.name =name.split('').reverse().join('');? ? ? }? ? }? };}

2懂扼、使用 generator-babel-plugin 生成一個插件模板

3、參考 babel-handbook 學習如何創(chuàng)建自己的插件https://github.com/jamiebuilds/babel-handbook/blob/master/translations/zh-Hans/plugin-handbook.md

自定義preset

如需創(chuàng)建一個自己的 preset右蒲,就是導出一個對象阀湿,對象中包括:插件數(shù)組或者其他presets

//只有插件數(shù)組module.exports = function() {? return {? ? plugins: [? ? ? "pluginA",? ? ? "pluginB",? ? ? "pluginC",? ? ]? };}//或者包括其他presets和參數(shù)module.exports = () => ({? presets: [? ? require("@babel/preset-env"),? ],? plugins: [? ? [require("@babel/plugin-proposal-class-properties"), { loose: true }],? ? require("@babel/plugin-proposal-object-rest-spread"),? ],});

Babel官方配置方式

使用Babel進行語法編譯時可以根據(jù)項目自身要針對的瀏覽器情況,來配置Babel參數(shù)決定編譯輸出的具體語法瑰妄。

在項目根目錄創(chuàng)建babel.config.json

{"presets": [...],"plugins": [...]}

在項目中創(chuàng)建通過創(chuàng)建.babelrc.json

{"presets": [...],"plugins": [...]}

或者直接在package.json中的babel屬性

{"babel": {"presets": [ ... ],"plugins": [ ... ],? } }

使用 CLI (@babel/cli)

npminstall --save-dev @babel/core @babel/cli

npx babel script.js--out-file script-compiled.js--source-maps

使用 API (@babel/core)

require("@babel/core").transform("code", {plugins:["@babel/plugin-transform-arrow-functions"]});

原理

編譯過程分為三個階段:解析陷嘴、轉換和打印輸出

可以參考:https://github.com/jamiebuilds/babel-handbook/blob/master/translations/zh-Hans/plugin-handbook.md

結合 webpack 和 Babel 進行 JavaScript 編譯

在使用webpack進行構建時,可以使用Babel提供的babel-loader插件在webpack構建過程中的源碼轉換階段對JavaScript進行編譯间坐,使用方式同常規(guī)的webpack loader 也就是babel-loader灾挨,來看一下webpack.config.js 的配置:

// webpack.config.js{? ? module: {? ? ? ? rules: [? ? ? ? ? ? {? ? ? ? ? ? ? ? test:/\.js$/,exclude:/(node_modules|bower_components)/,? ? ? ? ? ? ? ? use: {? ? ? ? ? ? ? ? ? ? loader:'babel-loader',options: {"presets": ["es2015","stage-2"]? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? }? ? ? ? ? ? }? ? ? ? ]? ? }}

Babel-loader

參見:https://ishare.58corp.com/articleDetail?id=26208

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末邑退,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子劳澄,更是在濱河造成了極大的恐慌地技,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秒拔,死亡現(xiàn)場離奇詭異莫矗,居然都是意外死亡,警方通過查閱死者的電腦和手機砂缩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門作谚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人庵芭,你說我怎么就攤上這事食磕。” “怎么了喳挑?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵彬伦,是天一觀的道長。 經(jīng)常有香客問我伊诵,道長单绑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任曹宴,我火速辦了婚禮搂橙,結果婚禮上,老公的妹妹穿的比我還像新娘笛坦。我一直安慰自己区转,他們只是感情好,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布版扩。 她就那樣靜靜地躺著废离,像睡著了一般。 火紅的嫁衣襯著肌膚如雪礁芦。 梳的紋絲不亂的頭發(fā)上蜻韭,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音柿扣,去河邊找鬼肖方。 笑死,一個胖子當著我的面吹牛未状,可吹牛的內容都是我干的俯画。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼司草,長吁一口氣:“原來是場噩夢啊……” “哼艰垂!你這毒婦竟也來了泡仗?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤材泄,失蹤者是張志新(化名)和其女友劉穎沮焕,沒想到半個月后吨岭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拉宗,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年辣辫,在試婚紗的時候發(fā)現(xiàn)自己被綠了旦事。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡急灭,死狀恐怖姐浮,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情葬馋,我是刑警寧澤卖鲤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站畴嘶,受9級特大地震影響蛋逾,放射性物質發(fā)生泄漏。R本人自食惡果不足惜窗悯,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一区匣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒋院,春花似錦亏钩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辞友,卻和暖如春彻坛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背踏枣。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工昌屉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茵瀑。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓间驮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親马昨。 傳聞我的和親對象是個殘疾皇子竞帽,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內容