摘要:快速體驗(yàn)安裝依賴新建文件夾,在命令行里進(jìn)入該文件夾,并執(zhí)行如下命令生成文件是內(nèi)置的一個(gè),可通過命令行操作來編譯文件。入門為了確保轉(zhuǎn)換后的代碼能正常的運(yùn)行,最好在代碼之前引入這是一個(gè)實(shí)現(xiàn)了部分特性的包。參考中文網(wǎng)入門
簡(jiǎn)介
Babel 是一個(gè) JavaScript 編譯器,可將我們代碼中的 ES6 語法轉(zhuǎn)換為 ES5 的語法,使我們的代碼能在不支持 ES6 語法的環(huán)境中正常運(yùn)行。配合一些插件,我們甚至能直接使用 ES6 標(biāo)準(zhǔn)的一些新特性,而無需等待各大瀏覽器的實(shí)現(xiàn),也無需擔(dān)憂兼容性。
快速體驗(yàn) 1. 安裝依賴新建 babel_test 文件夾,在命令行里進(jìn)入該文件夾,并執(zhí)行如下命令:
npm init -y # 生成 package.json 文件 npm i -D babel-cli babel-preset-env npm i -S babel-polyfill
babel-cli 是 Babel 內(nèi)置的一個(gè) CLI,可通過命令行操作來編譯文件。這是一個(gè)可選的開發(fā)依賴包,在實(shí)際開發(fā)中可根據(jù)需求決定是否安裝。
babel-preset-env 會(huì)根據(jù)我們配置的環(huán)境自動(dòng)將該環(huán)境不支持的語法轉(zhuǎn)換 ES5 的語法。
babel-polyfill 是一個(gè)相對(duì)完整的 ES6 環(huán)境,可以為代碼的運(yùn)行環(huán)境補(bǔ)充缺少的 API。這是一個(gè)可選的依賴包,但個(gè)人建議最好安裝并引入到代碼中,詳解見下文。
在編寫本文章時(shí),上面依賴包的最新版本分別為 babel-cli 6.26.0、babel-preset-env 1.6.1、babel-polyfill 6.26.0,如果安裝的版本不一致,可能會(huì)得到不一樣的結(jié)果。2. 配置 Babel
新建 .bablerc 文件,內(nèi)容如下:
{ "presets": ["env"] }
.bablerc 是 Babel 的默認(rèn)配置文件,運(yùn)行 Babel 時(shí)會(huì)自動(dòng)讀取該文件的配置。上面 .bablerc 文件配置的意思是對(duì)代碼進(jìn)行完全的轉(zhuǎn)換。
3. 編寫代碼新建 source.js 文件,內(nèi)容如下:
// 這里的代碼無任何意義,只用作示例 const sayHi = () => { const str = "Hello World!"; const arr = [...str]; alert(arr.join("")); };
... 是 ES6 語法,詳情可參考 http://es6.ruanyifeng.com/#docs/array4. 編譯
執(zhí)行以下命令就可以把 source.js 的代碼轉(zhuǎn)換為 ES5 的語法,并把結(jié)果輸出到 target.js 。
./node_modules/babel-cli/bin/babel.js source.js -o target.js
babel-cli 的詳細(xì)命令可參考 https://babeljs.cn/docs/usage/cli/
target.js 的內(nèi)容最終如下:
"use strict"; function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } var sayHi = function sayHi() { var str = "Hello World!"; var arr = [].concat(_toConsumableArray(str)); alert(arr.join("")); };
可以看到 Babel 在 target.js 添加了 _toConsumableArray 函數(shù),并將 [...str] 替換成了 [].concat(_toConsumableArray(str)) 。到這里我們已經(jīng)成功的將代碼中的 ES6 語法轉(zhuǎn)換為 ES5 語法,Babel 的使用就是這么簡(jiǎn)單。
babel-polyfill如果我們仔細(xì)查看上文中的 target.js ,會(huì)發(fā)現(xiàn) Babel 添加的 _toConsumableArray 函數(shù)竟然使用了 ES6 的特性 Array.from ,也就是說我們使用 Babel 轉(zhuǎn)換后代碼里可能還會(huì)存在 ES6 的東西!這個(gè)問題可以參考 https://www.zhihu.com/question/49382420。
這里我們需要重點(diǎn)注意的是:
Babel 默認(rèn)只轉(zhuǎn)換新的 JavaScript 句法(syntax),而不轉(zhuǎn)換新的 API,比如Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局對(duì)象,以及一些定義在全局對(duì)象上的方法(比如Object.assign)都不會(huì)轉(zhuǎn)碼?!?《ECMAScript 6入門》
為了確保轉(zhuǎn)換后的代碼能正常的運(yùn)行,最好在代碼之前引入 babel-polyfill(這是一個(gè)實(shí)現(xiàn)了部分 ES6 特性的包)。
至此,我們可以放心的隨意使用 ES6 的特性了。
優(yōu)化其實(shí)現(xiàn)代瀏覽器或多或少都實(shí)現(xiàn)了部分 ES6 標(biāo)準(zhǔn),如 Chrome v64 甚至已實(shí)現(xiàn)了 97% 的功能。如果我們確定我們的代碼只運(yùn)行在 Chrome v64 ,那么像 source.js 中的箭頭函數(shù)則無需轉(zhuǎn)換,因?yàn)? Chrome v64 已經(jīng)支持這樣的語法了。同理我們也無需引入整個(gè) babel-polyfill ,只需引入其中 Chrome v64 不支持的部分即可。
Babel 的強(qiáng)大之處在這里更能得到體現(xiàn)。當(dāng)我們配置了代碼的運(yùn)行環(huán)境之后,Babel 會(huì)自動(dòng)判斷該環(huán)境對(duì) ES6 的實(shí)現(xiàn)程度,然后只把源代碼中該環(huán)境不支持的語法進(jìn)行轉(zhuǎn)換。如果我們?cè)谠创a中利用模塊化的方式引入 babel-polyfill ,Babel 也會(huì)對(duì)其進(jìn)行優(yōu)化,只引入該環(huán)境尚未實(shí)現(xiàn)的模塊。下面就讓我們來體現(xiàn)一下這強(qiáng)大的功能。
修改配置文件 .babelrc ,內(nèi)容如下:
{ "presets": [ [ "env", { "targets": { // 配置代碼的運(yùn)行環(huán)境 "chrome": 64 }, "useBuiltIns": true // 開啟對(duì) babel-polyfill 的優(yōu)化 } ] ] }
修改source.js,內(nèi)容如下:
// 使用 ES6 的模塊化標(biāo)準(zhǔn)引入 babel-polyfill import "babel-polyfill"; const sayHi = () => { const str = "Hello World!"; const arr = [...str]; alert(arr.join("")); };
運(yùn)行命令編譯成功后,target.js 的內(nèi)容如下:
"use strict"; require("core-js/modules/web.timers"); require("core-js/modules/web.immediate"); require("core-js/modules/web.dom.iterable"); const sayHi = () => { const str = "Hello World!"; const arr = [...str]; alert(arr.join("")); };
可以看到,箭頭函數(shù)和 ...str 都沒有變化,因?yàn)?Chrome v64 已經(jīng)支持這樣的語法。import "babel-polyfill" 則變成了用 CommonJS 的方式引入了三個(gè)小模塊,這是 Babel 通過查詢 compat-table 得知 Chrome v64 尚未實(shí)現(xiàn)的特性后添加的模塊。
以上便是 Babel 的一些基本使用了。
最后說明一下:
模塊化并不是 Babel 的工作,Babel 僅負(fù)責(zé)轉(zhuǎn)換語法。Babel 輸出的 target.js 使用了 CommonJS 的模塊化規(guī)范,這還需要一些構(gòu)建工具對(duì)其進(jìn)一步編譯才能在 Chrome v64 上運(yùn)行。
core-js 是真正實(shí)現(xiàn)了 ES6 特性的包,是 babel-polyfill 的依賴,babel-polyfill 對(duì)其進(jìn)行了一些包裝。
參考Babel中文網(wǎng)
ECMAScript 6 入門
compat-table
browserslist
core-js
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/93027.html
摘要:首先,作為入門的話,的用戶手冊(cè)是個(gè)很不錯(cuò)的選擇,里面基本覆蓋了使用的各方面。所以下面主要是我學(xué)習(xí)的一些筆記,姑且當(dāng)作是一篇入門吧。下面我們正式進(jìn)入正題。這也是最常用的一個(gè)用法之一。有兩個(gè)方式進(jìn)行配置。 首先,作為入門的話,Babel的用戶手冊(cè)是個(gè)很不錯(cuò)的選擇,里面基本覆蓋了Babel使用的各方面。所以下面主要是我學(xué)習(xí)Babel的一些筆記,姑且當(dāng)作是一篇入門吧。 Babel是什么 按照B...
摘要:快速入門簡(jiǎn)介以下簡(jiǎn)稱是語言的下一代標(biāo)準(zhǔn),已經(jīng)在年月正式發(fā)布了。而且聲明后必須立即初始化賦值,不能后面賦值。方法默認(rèn)返回實(shí)例對(duì)象即,可以指定返回另外一個(gè)對(duì)象。參數(shù)搭配的變量是一個(gè)數(shù)組,該變量將多余的參數(shù)放入數(shù)組中。 es6快速入門 showImg(https://segmentfault.com/img/remote/1460000008519223?w=560&h=314); ES6簡(jiǎn)...
先簡(jiǎn)單說一下Babel吧 Babel是一個(gè)ES6轉(zhuǎn)碼器,可以將ES6代碼轉(zhuǎn)為ES5代碼 此篇教程是在學(xué)習(xí)阮老師的《ES6標(biāo)準(zhǔn)入門》時(shí),不會(huì)npm的學(xué)習(xí)總結(jié) 在阮老師的教程上具體補(bǔ)充,通過以下幾個(gè)步驟,即可在項(xiàng)目中直接安裝Babel轉(zhuǎn)碼器,一行命令即可進(jìn)行ES6轉(zhuǎn)碼 第一步:創(chuàng)建package.json package.json 文件是一個(gè)描述文件,主要有以下3個(gè)作用: 1.描述項(xiàng)目依賴了哪些包 2...
摘要:哈哈,我理解,架構(gòu)就是骨架,如下圖所示譯年月個(gè)有趣的和庫前端掘金我們創(chuàng)辦的使命是讓你及時(shí)的了解開發(fā)中最新最酷的趨勢(shì)。 翻譯 | 上手 Webpack ? 這篇就夠了! - 掘金譯者:小 boy (滬江前端開發(fā)工程師) 本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明作者及出處。 原文地址:https://www.smashingmagazine.... JavaSrip... 讀 Zepto 源碼之代碼結(jié)構(gòu) - ...
摘要:全文的目的是達(dá)成使用進(jìn)行項(xiàng)目開發(fā),并且以我這個(gè)前端菜鳥所見所學(xué)來歸納整理。環(huán)境安裝與前期準(zhǔn)備我的基礎(chǔ)環(huán)境出的開源的編輯器命令行工具,下一個(gè)炒雞好用的神器。只提供組件,對(duì)配套技術(shù)不做限定,方便用戶與現(xiàn)有技術(shù)??焖僬?,降低使用成本。 全文的目的是達(dá)成使用amazeui-touch進(jìn)行項(xiàng)目開發(fā),并且以我這個(gè)前端菜鳥所見所學(xué)來歸納整理。文章不對(duì)詳細(xì)內(nèi)容做講解。 環(huán)境安裝與前期準(zhǔn)備 我的基礎(chǔ)環(huán)...
閱讀 1529·2021-09-10 11:27
閱讀 2556·2019-08-30 15:53
閱讀 1438·2019-08-30 13:10
閱讀 3045·2019-08-30 11:09
閱讀 1198·2019-08-29 17:23
閱讀 726·2019-08-29 17:05
閱讀 3006·2019-08-29 15:10
閱讀 2409·2019-08-29 13:22