博客講解內(nèi)容如下: 1、babel是什么2、javascript制作規(guī)范3、babel轉(zhuǎn)譯器4、babel的使用5、常見的幾種babel轉(zhuǎn)譯器和插件6、babel最常見配置選項7、babel的其他8、在webpack中使用babel9、總結(jié)凡是看到這個標題點進來的同學(xué),相信對babel都有了一定的了解。babel使用起來很簡單,簡單到都沒有必要寫一篇文章去介紹,直接看看官方文檔就可以。所以我也在懷疑到底該不該寫這篇文章。想來想去還是決定動手寫寫,原因是很簡單,自己在剛開始接觸babel也出現(xiàn)過懵逼的狀態(tài),所以希望這篇文檔能給其他人以幫助。 1、babel是什么babel官網(wǎng)正中間一行黃色大字寫著“babel is a javascript compiler”,翻譯一下就是babel是一個javascript轉(zhuǎn)譯器。為什么會有babel存在呢?原因是javascript在不斷的發(fā)展,但是瀏覽器的發(fā)展速度跟不上。以es6為例,es6中為javascript增加了箭頭函數(shù)、塊級作用域等新的語法和Symbol、Promise等新的數(shù)據(jù)類型,但是這些語法和數(shù)據(jù)類型并不能夠馬上被現(xiàn)在的瀏覽器全部支持,為了能在現(xiàn)有的瀏覽器上使用js新的語法和新的數(shù)據(jù)類型,就需要使用一個轉(zhuǎn)譯器,將javascript中新增的特性轉(zhuǎn)為現(xiàn)代瀏覽器能理解的形式。babel就是做這個方面的轉(zhuǎn)化工作。 2、javascript制作規(guī)范在這里有必要簡單講一下javascript版本,我只是大體講下,javascript是網(wǎng)景公司開發(fā)的一種腳本語言,1996年的時候以ECMAScript的名字正式成為一種標準。2007年的時候發(fā)布了版本es5,然后在隨后近10年里js并沒有大的變化。所以現(xiàn)在的瀏覽器都可以很好的支持es5。這一局面直到2015年被打破。2015年6月,TC39(javascript標準的制定組織)公布了新版本的js語言——ES6。而且從ES6開始,TC39規(guī)定每年都要發(fā)布一個js的新版本,新版本將包含年號,都是以ESxxxx的方式進行命名。所以2015年發(fā)布的ES6又叫ES2015,2016年發(fā)布的新的js版本就叫ES2016,2017年發(fā)布的新的js版本就叫ES2017……。 因為版本都是向前兼容的,就是老版本js版本中規(guī)定的語法和api在新版本的js中同樣也會合理的。所以我們可以想到后面的規(guī)范肯定是包含前面的規(guī)范的,也就是ES2016版本的js規(guī)范是包含ES2015(ES6)規(guī)范的,ES2017是包含ES2016的也包含ES2015的。針對不同的規(guī)范,Babel也提供了對應(yīng)的轉(zhuǎn)換器。
在轉(zhuǎn)譯過程中遇到更高版本的js語法,babel是會直接忽略的。 在這里在簡單講一下js新規(guī)范的制作過程。 js規(guī)范的制作分4個階段。
針對js規(guī)范的不同階段,babel也提供了對應(yīng)的轉(zhuǎn)譯器
不同階段的轉(zhuǎn)譯器之間是包含的關(guān)系,preset-stage-0轉(zhuǎn)譯器除了包含了preset-stage-1的所有功能還增加了transform-do-expressions插件和transform-function-bind插件,同樣preset-stage-1轉(zhuǎn)譯器除了包含preset-stage-2的全部功能外還增加了一些額外的功能……。 好了,javascript的制作規(guī)范大體講完了,現(xiàn)在我們來講下babel轉(zhuǎn)譯器。 3、babel轉(zhuǎn)譯器為了便于說明,首先我們來定義兩個概念。
js規(guī)范新增的每個語法都有對應(yīng)的babel插件,因此babel插件眾多。為了便于管理,會把某些插件集合在一起,構(gòu)成一個轉(zhuǎn)譯器。要不然如果我們想轉(zhuǎn)譯es2015的語法就要安裝一大堆插件了,有了轉(zhuǎn)譯器之后我們只需要安裝一個轉(zhuǎn)譯器就可以了。babel的轉(zhuǎn)譯器根據(jù)用途的不同也分了不同給的類,這些類非常多,所以babel看起來很混亂。不過大體上babel的轉(zhuǎn)譯器分為3類。
另外你可以對babel已有的轉(zhuǎn)譯器進行改造或者創(chuàng)建新的轉(zhuǎn)譯器。如何創(chuàng)建babel轉(zhuǎn)譯器可以點這里。 4、babel的使用babel支持的使用場景非常多,可以在瀏覽器中使用(browser)也可以在命令行(cli),還可以是我們常見的gulp和webpack中。 以下以安裝babel-cli為例進行說明。babel更多的使用方法請點擊這里。 4.1、創(chuàng)建bebel項目在本地磁盤上創(chuàng)建一個文件夾es6(名字任意),在該文件夾下打開命令行工具,初始化項目。
這個命令目的就是創(chuàng)建一個默認的package.json文件。 4.2、本地安裝babel命令行工具安裝babel的命令行工具的目的是為了在命令行使用babel。 babel命令行工具可以全局安裝也可以本地安裝,官方文檔推薦本地安裝,原因有2點;
在命令行中繼續(xù)執(zhí)行如下命令
如果你已經(jīng)全局安裝了babel,可以使用如下的命令進行卸載
這樣就已經(jīng)在本地安裝好babel了。 此時我的package.json文件如下(請忽略main字段)。
4.3、在命令行中調(diào)用babel本地安裝的babel是不能夠在直接命令行中運行的,為了在命令行中運行babel,我們有兩個方法,1是需要配置下package.json文件的scripts項。比如如下代碼,配置了一個build命令,運行該命令(npm run build)的時候就會在命令行執(zhí)行
第2個方法是你需要可以進入node_modules文件夾,再進入.bin文件夾,然后執(zhí)行在命令行中執(zhí)行 推薦使用npm run build的方法。 這里需要解釋 關(guān)于babel的命令行使用方法請點這里 ps:此時無論你是運行npm run build 還是運行babel src -d lib命令(其實兩個方法本質(zhì)上都是一樣的,都是運行babel src -d lib)命令行都會報錯,原因是現(xiàn)在還沒有src文件夾??梢韵炔挥霉芩院笪覀冊傩陆╯rc文件夾。 4.4、創(chuàng)建.babelrc配置文件在cmd中鍵入以下命令。
這個時候你的文件夾里就多了一個.babelrc文件了。windows是不能直接創(chuàng)建空文件名的文件的,所以必須通過命令行創(chuàng)建。 4.5、安裝babel的轉(zhuǎn)譯器這里我們以babel-preset-env為例。 在命令行中執(zhí)行如下代碼就會安裝babel-preset-env轉(zhuǎn)譯器。
注意:babel命令行工具(babel-cli)跟babel轉(zhuǎn)譯器是兩個不同的東西,命令行工具并不具有轉(zhuǎn)譯代碼的功能,只是為了在命令行中使用babel。要轉(zhuǎn)碼必須安裝轉(zhuǎn)譯器,比如babel-preset-env轉(zhuǎn)譯器或者babel-preset-react轉(zhuǎn)譯器。要轉(zhuǎn)譯的時候,還要在.babelrc文件或者命令行中配置這些轉(zhuǎn)譯器(presets)選項 4.6、配置.babelrc文件.babelrc用于配置除回調(diào)以外的所有babel api 選項。例如plugins和presets。plugins用于配置我們轉(zhuǎn)譯所需要的插件,presets用于配置我們所需要的轉(zhuǎn)譯器。 .babelrc不是必須的,我們在.babelrc中配置的選項都可以通過命令行添加,比如在命令行執(zhí)行 babel在轉(zhuǎn)譯代碼的過程中會自動讀取當前目錄.babelrc配置文件,如果當前目錄沒有的話就遍歷整個目錄樹去尋找,直到找到.babelrc文件或者含有"babel"字段的package.json文件,然后使用這些配置選項來轉(zhuǎn)譯代碼。 關(guān)于.babelrc的注意點如下。 1、如果沒有.babelrc文件,或者沒有在其他文件中設(shè)置過babel的presets的配置選型,并且命令行中也沒有配置--presets,那么代碼是不會轉(zhuǎn)譯的。原es6代碼什么樣,轉(zhuǎn)譯后的代碼還是什么樣。 2、如果你的.babelrc或者你的命令行使用了你沒有安裝的轉(zhuǎn)譯器(presets),代碼就會報錯 3、但.babelrc中的配置跟你在命令行中使用的配置沖突的時候,以.babelrc中的配置為準
關(guān)于.babelrc文件的更多使用方法請點擊這里 4.7、.babelrc的替代方案如果你不想生成.babelrc文件,你可以在你的package.json文件中對babel進行配置。如果你使用gulp或者webpack之類的管理工具的話,也可以在這里工具的配置選項里添加babel的配置選項。 以下以在package.json中配置為例。
在package.json中配置babel等同于使用.babelrc文件 4.8、編寫es6代碼因為我們使用的babel命令是 |-node_modules |-src |-.babelrc |-package.json 在src文件夾下我們創(chuàng)建一個person.js文件(文件名任意),編寫如下es6代碼(代碼任意,只有是es6代碼即可,方便看出編譯后的效果)。編輯好代碼后保存。
4.9、轉(zhuǎn)譯es6代碼在命令行工具中執(zhí)行
轉(zhuǎn)譯后的代碼如下:
5、常見的幾種babel轉(zhuǎn)譯器和插件經(jīng)過上面的步驟我們已經(jīng)完成了轉(zhuǎn)譯代碼的工作,現(xiàn)在我們介紹下babel中常用的轉(zhuǎn)譯器和配置選項 5.1、babel-preset-env轉(zhuǎn)譯器,最常用的轉(zhuǎn)譯器。通過在.babelrc中配置env選項,可以讓代碼兼容不同版本的瀏覽器或者node。瀏覽器或者node已經(jīng)支持的語法將不再轉(zhuǎn)譯了,不支持的才轉(zhuǎn)譯。如果不配置env選項,該轉(zhuǎn)譯器等同于babel-preset-latest。更多詳情和方法點這里
5.2、babel-preset-es2015轉(zhuǎn)譯器,將es2015版本的js代碼轉(zhuǎn)譯為es5代碼,對于es2016版本的代碼或者es2017版本的代碼不轉(zhuǎn)譯。 5.3、babel-preset-latest轉(zhuǎn)譯器,將最新版本的js代碼轉(zhuǎn)譯為es5代碼。不推薦使用,已經(jīng)廢除。建議使用babel-preset-env代替 5.4、babel-preset-react轉(zhuǎn)譯器,剝離流類型并將JSX轉(zhuǎn)換為createElement調(diào)用,主要在轉(zhuǎn)譯react代碼的時候使用。 5.5、兼容ie瀏覽器的轉(zhuǎn)譯器要兼容老版本的ie瀏覽器,可以使用對應(yīng)的es3和es5插件 5.6、總結(jié)轉(zhuǎn)譯器就是一堆轉(zhuǎn)譯插件的集合。babel轉(zhuǎn)譯器很多,但是我們常用的就那幾個。如果要轉(zhuǎn)譯新版本的js的話,只需要使用babel-presets-env這一個轉(zhuǎn)譯器就可以了。 關(guān)于babel的更多轉(zhuǎn)譯器介紹,可以點擊這里查看。你可以點擊每一個轉(zhuǎn)譯器進去查看轉(zhuǎn)譯器的適用場景是使用方法 6、babel最常見配置選項babel的配置選項在命令行的使用規(guī)則是
babel的配置選項非常多,每個轉(zhuǎn)譯器也都有自己的配置選項,關(guān)于babel的配置選項的詳細功能和使用方法,請點擊這里查看。我這里只介紹幾個常見的。 6.1、babelrc默認值為true,用于配置是否適用.babelrc和.babelignore文件,當命令行中添加--no-babelrc選項的時候,表示忽略.babelrc和.babelignore文件。在.babelrc文件中配置babelrc個人測試沒有卵用。 6.2、env默認值為一個空對象{}. env用于配置代碼需要兼容的環(huán)境,比如你的代碼要在chrome52上運行,可以這樣配置.babelrc。
配置代碼兼容最新的node,可以這樣設(shè)置.babelrc
6.3、ignore忽略某些文件,默認值為null,比如src文件夾下有person.js和foo.js兩個文件,轉(zhuǎn)譯的時候你要忽略src文件夾下的foo.js,可以這樣配置.babelrc。這樣就不再轉(zhuǎn)譯foo.js文件了
與ignore相對應(yīng)的是only選項,only表示只轉(zhuǎn)譯某些文件。 6.4、minified是否壓縮轉(zhuǎn)譯后的代碼,默認值為false
6.5、plugins配置轉(zhuǎn)譯所需要的插件。使用插件的順序是按照插件在數(shù)組中的順序依次調(diào)用的。比如如下命令,轉(zhuǎn)譯的時候先使用transform-decorators-legacy轉(zhuǎn)譯,再使用transform-class-properties轉(zhuǎn)譯
6.6、presets配置你要使用的轉(zhuǎn)譯器。使用轉(zhuǎn)譯器的順序是按照轉(zhuǎn)譯器在數(shù)組中的反順序進行調(diào)用的。先使用數(shù)組最末尾的轉(zhuǎn)譯器,然后使用倒數(shù)第2個,倒數(shù)第3個,依次類推。比如使用下面命令的時候,先使用stage-2轉(zhuǎn)譯器轉(zhuǎn)譯,再react轉(zhuǎn)譯器轉(zhuǎn)譯,最后使用es2015轉(zhuǎn)譯器轉(zhuǎn)譯。
6.7、補充:plugins和presets的順序詳情點這里
7、babel的其他7.1、babel-nodebable-node是babel-cli自帶的命令,提供了一個支持ES6的REPL環(huán)境,它支持node的REPL環(huán)境的所有功能,而且可以直接運行ES6代碼。為了體驗下這個功能,我們需要全局安裝babel-cli。然后在命令行執(zhí)行下面的命令。 安裝
執(zhí)行命令就會輸出我們代碼執(zhí)行的結(jié)果
babel-node的詳細用法點擊這里 7.2、babel-register引用自阮一峰babel講解 babel-register模塊會改寫require命令,為它加上一個鉤子。此后每當使用require加載 安裝
使用的時候必須先加載babel-register。
然后,就不需要手動對 需要注意的是, babel-register的詳細使用方法點擊這里 7.3、babel-corebabel-core主要在node等環(huán)境中使用,可以用來開發(fā)自己的babel轉(zhuǎn)譯器。直接調(diào)用babel的api對某些代碼或者某些文件進行轉(zhuǎn)譯。 安裝
使用方法
babel-core的詳細使用方法點擊這里 8、在webpack中使用babel。8.1、安裝webpack
8.2、安裝babel-preset-env和babel-loader。如果你是跟著我這份教程一路看下來的,那么你babel-preset-env已經(jīng)安裝了。已經(jīng)安裝的話就不用再安裝了。記得要安裝babel-loader就好。
此時你的package.json如下。確保devDependencies中有babel-loader、babel-preset-env和webpack即可,其他的可以跟我不同。
8.3、創(chuàng)建webpack.config.js文件在根目錄下創(chuàng)建webpack.config.js文件,內(nèi)容如下。
entry為入口文件,我們選擇當前目錄下,src文件夾下的person.js文件作為入口。output為輸出選項,path為輸出的目錄,filename為輸出文件名。query選項為.babelrc中的配置選項。在webpack中設(shè)置了query字段后,就不再需要.babelrc文件了。 此時我們的目錄結(jié)構(gòu)是這樣子的。 -lib -node_modules -src -person.js -foo.js -package.json -webpack.config.js 8.4、運行webpack。在命令行中執(zhí)行webpack,webpack會自動讀取webpack.config.js文件中的配置。然后對我們配置的文件進行轉(zhuǎn)譯。
打開lib文件夾,我們發(fā)現(xiàn)多了一個轉(zhuǎn)譯后的文件person.compiled.js。 -lib -person.compiled.js -node_modules -src -person.js -foo.js -package.json -webpack.config.js 8.5、使用webpack轉(zhuǎn)譯多個文件我們src文件夾下除了有person.js文件外,還有一個foo.js文件。但是我們上面的操作只轉(zhuǎn)譯了person.js文件,為了同時轉(zhuǎn)譯foo.js文件我們需要在person.js文件中引入foo.js foo.js文件代碼如下:
我們在person.js文件頂部中添加
這樣在編譯后的文件person.compiled.js文件里,就包含了foo.js的代碼。 關(guān)于webpack的更多使用方法,請點擊查看webpack文檔 9、總結(jié)關(guān)于babel的知識點大概就這些。
以上講的都是常用的,關(guān)于babel更細的知識點還需要你自己查看babel官方文檔。 |
|