摘要:快速體驗安裝依賴新建文件夾,在命令行里進入該文件夾,并執行如下命令生成文件是內置的一個,可通過命令行操作來編譯文件。入門為了確保轉換后的代碼能正常的運行,最好在代碼之前引入這是一個實現了部分特性的包。參考中文網入門
簡介
Babel 是一個 JavaScript 編譯器,可將我們代碼中的 ES6 語法轉換為 ES5 的語法,使我們的代碼能在不支持 ES6 語法的環境中正常運行。配合一些插件,我們甚至能直接使用 ES6 標準的一些新特性,而無需等待各大瀏覽器的實現,也無需擔憂兼容性。
快速體驗 1. 安裝依賴新建 babel_test 文件夾,在命令行里進入該文件夾,并執行如下命令:
npm init -y # 生成 package.json 文件 npm i -D babel-cli babel-preset-env npm i -S babel-polyfill
babel-cli 是 Babel 內置的一個 CLI,可通過命令行操作來編譯文件。這是一個可選的開發依賴包,在實際開發中可根據需求決定是否安裝。
babel-preset-env 會根據我們配置的環境自動將該環境不支持的語法轉換 ES5 的語法。
babel-polyfill 是一個相對完整的 ES6 環境,可以為代碼的運行環境補充缺少的 API。這是一個可選的依賴包,但個人建議最好安裝并引入到代碼中,詳解見下文。
在編寫本文章時,上面依賴包的最新版本分別為 babel-cli 6.26.0、babel-preset-env 1.6.1、babel-polyfill 6.26.0,如果安裝的版本不一致,可能會得到不一樣的結果。2. 配置 Babel
新建 .bablerc 文件,內容如下:
{ "presets": ["env"] }
.bablerc 是 Babel 的默認配置文件,運行 Babel 時會自動讀取該文件的配置。上面 .bablerc 文件配置的意思是對代碼進行完全的轉換。
3. 編寫代碼新建 source.js 文件,內容如下:
// 這里的代碼無任何意義,只用作示例 const sayHi = () => { const str = "Hello World!"; const arr = [...str]; alert(arr.join("")); };
... 是 ES6 語法,詳情可參考 http://es6.ruanyifeng.com/#docs/array4. 編譯
執行以下命令就可以把 source.js 的代碼轉換為 ES5 的語法,并把結果輸出到 target.js 。
./node_modules/babel-cli/bin/babel.js source.js -o target.js
babel-cli 的詳細命令可參考 https://babeljs.cn/docs/usage/cli/
target.js 的內容最終如下:
"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 函數,并將 [...str] 替換成了 [].concat(_toConsumableArray(str)) 。到這里我們已經成功的將代碼中的 ES6 語法轉換為 ES5 語法,Babel 的使用就是這么簡單。
babel-polyfill如果我們仔細查看上文中的 target.js ,會發現 Babel 添加的 _toConsumableArray 函數竟然使用了 ES6 的特性 Array.from ,也就是說我們使用 Babel 轉換后代碼里可能還會存在 ES6 的東西!這個問題可以參考 https://www.zhihu.com/question/49382420。
這里我們需要重點注意的是:
Babel 默認只轉換新的 JavaScript 句法(syntax),而不轉換新的 API,比如Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局對象,以及一些定義在全局對象上的方法(比如Object.assign)都不會轉碼。—— 《ECMAScript 6入門》
為了確保轉換后的代碼能正常的運行,最好在代碼之前引入 babel-polyfill(這是一個實現了部分 ES6 特性的包)。
至此,我們可以放心的隨意使用 ES6 的特性了。
優化其實現代瀏覽器或多或少都實現了部分 ES6 標準,如 Chrome v64 甚至已實現了 97% 的功能。如果我們確定我們的代碼只運行在 Chrome v64 ,那么像 source.js 中的箭頭函數則無需轉換,因為 Chrome v64 已經支持這樣的語法了。同理我們也無需引入整個 babel-polyfill ,只需引入其中 Chrome v64 不支持的部分即可。
Babel 的強大之處在這里更能得到體現。當我們配置了代碼的運行環境之后,Babel 會自動判斷該環境對 ES6 的實現程度,然后只把源代碼中該環境不支持的語法進行轉換。如果我們在源代碼中利用模塊化的方式引入 babel-polyfill ,Babel 也會對其進行優化,只引入該環境尚未實現的模塊。下面就讓我們來體現一下這強大的功能。
修改配置文件 .babelrc ,內容如下:
{ "presets": [ [ "env", { "targets": { // 配置代碼的運行環境 "chrome": 64 }, "useBuiltIns": true // 開啟對 babel-polyfill 的優化 } ] ] }
修改source.js,內容如下:
// 使用 ES6 的模塊化標準引入 babel-polyfill import "babel-polyfill"; const sayHi = () => { const str = "Hello World!"; const arr = [...str]; alert(arr.join("")); };
運行命令編譯成功后,target.js 的內容如下:
"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("")); };
可以看到,箭頭函數和 ...str 都沒有變化,因為 Chrome v64 已經支持這樣的語法。import "babel-polyfill" 則變成了用 CommonJS 的方式引入了三個小模塊,這是 Babel 通過查詢 compat-table 得知 Chrome v64 尚未實現的特性后添加的模塊。
以上便是 Babel 的一些基本使用了。
最后說明一下:
模塊化并不是 Babel 的工作,Babel 僅負責轉換語法。Babel 輸出的 target.js 使用了 CommonJS 的模塊化規范,這還需要一些構建工具對其進一步編譯才能在 Chrome v64 上運行。
core-js 是真正實現了 ES6 特性的包,是 babel-polyfill 的依賴,babel-polyfill 對其進行了一些包裝。
參考Babel中文網
ECMAScript 6 入門
compat-table
browserslist
core-js
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93027.html
先簡單說一下Babel吧 Babel是一個ES6轉碼器,可以將ES6代碼轉為ES5代碼 此篇教程是在學習阮老師的《ES6標準入門》時,不會npm的學習總結 在阮老師的教程上具體補充,通過以下幾個步驟,即可在項目中直接安裝Babel轉碼器,一行命令即可進行ES6轉碼 第一步:創建package.json package.json 文件是一個描述文件,主要有以下3個作用: 1.描述項目依賴了哪些包 2...
摘要:哈哈,我理解,架構就是骨架,如下圖所示譯年月個有趣的和庫前端掘金我們創辦的使命是讓你及時的了解開發中最新最酷的趨勢。 翻譯 | 上手 Webpack ? 這篇就夠了! - 掘金譯者:小 boy (滬江前端開發工程師) 本文原創,轉載請注明作者及出處。 原文地址:https://www.smashingmagazine.... JavaSrip... 讀 Zepto 源碼之代碼結構 - ...
摘要:全文的目的是達成使用進行項目開發,并且以我這個前端菜鳥所見所學來歸納整理。環境安裝與前期準備我的基礎環境出的開源的編輯器命令行工具,下一個炒雞好用的神器。只提供組件,對配套技術不做限定,方便用戶與現有技術棧快速整合,降低使用成本。 全文的目的是達成使用amazeui-touch進行項目開發,并且以我這個前端菜鳥所見所學來歸納整理。文章不對詳細內容做講解。 環境安裝與前期準備 我的基礎環...
閱讀 1455·2021-09-10 11:27
閱讀 2410·2019-08-30 15:53
閱讀 1322·2019-08-30 13:10
閱讀 2974·2019-08-30 11:09
閱讀 1085·2019-08-29 17:23
閱讀 668·2019-08-29 17:05
閱讀 2949·2019-08-29 15:10
閱讀 2346·2019-08-29 13:22