摘要:首先,作為入門的話,的用戶手冊是個很不錯的選擇,里面基本覆蓋了使用的各方面。所以下面主要是我學(xué)習(xí)的一些筆記,姑且當作是一篇入門吧。下面我們正式進入正題。這也是最常用的一個用法之一。有兩個方式進行配置。
首先,作為入門的話,Babel的用戶手冊是個很不錯的選擇,里面基本覆蓋了Babel使用的各方面。所以下面主要是我學(xué)習(xí)Babel的一些筆記,姑且當作是一篇入門吧。
Babel是什么按照Babel官網(wǎng)的說法,Babel是一個Javascript編譯器。它可以把用最新標準編寫的Javascript代碼編譯成現(xiàn)在的瀏覽器或者node環(huán)境下能運行的代碼,這個過程叫做“源碼到源碼”編譯,又稱轉(zhuǎn)譯(transpiling)。通過這個方式,我們就可以提前使用下一代的標準和特性進行編碼,然后在現(xiàn)在的環(huán)境下運行。
安裝Babel通常我們使用Babel的babel-cli工具在命令行下進行文件的編譯。我們可以對babel-cli進行全局安裝,也可以把它安裝到項目里。這里我選擇了把它安裝到項目里。這樣做的好處是:
不同的項目可能會使用不同版本的Babel,使用全局的話只能使用一致的版本
方便項目的部署,使用全局安裝的話意味著對環(huán)境有個隱式的依賴。
除了babel-cli,還有其他使用Babel的方式,具體可以看用戶手冊。
下面我們開始安裝babel-cli。首先新建一個工作目錄,并創(chuàng)建package.json文件:
$ npm init -y
安裝babel-cli:
$ npm install --save-dev babel-cli
安裝完我們可以這樣運行:
$ ./node_modules/babel-cli/bin/babel.js -V 6.11.4 (babel-core 6.11.4)
但是這樣運行很不方便,我們可以通過npm scripts來運行Babel。在package.json文件里,我們增加scripts字段,并添加一個腳本:
{ "scripts": { "build": "babel src -d lib" }, "devDependencies": { "babel-cli": "^6.11.4" } }
這里增加了一條名字為build的腳本,命令的內(nèi)容是把src里的文件通過Babel轉(zhuǎn)譯到lib目錄里。然后我們可以通過以下命令運行腳本:
$ npm run build
當然,現(xiàn)在運行這個命令會報錯,因為我們并沒有src文件夾。下面我們正式進入正題。
Babel的基礎(chǔ)使用 轉(zhuǎn)譯初探首先我們創(chuàng)建src目錄,然后創(chuàng)建一個js文件index.js:
[1,2,3].map(n => n + 1);
然后運行npm run build命令,就會看到lib文件夾里多了一個轉(zhuǎn)譯后的文件index.js。但是打開來看會發(fā)現(xiàn)這個轉(zhuǎn)譯后的文件跟源文件并沒有區(qū)別。因為Babel需要你通過插件(Plugin)或者預(yù)設(shè)(presets)告訴它做什么。例如我們可以通過babel-preset-es2015告訴Babel把ES2015的文件轉(zhuǎn)譯成ES5。這也是Babel最常用的一個用法之一。
配置文件要使用插件或者預(yù)設(shè)(相當于一組插件),我們需要在Bable的配置文件里面進行配置。有兩個方式進行配置。
第一個方式是通過.babelrc文件:
{ "presets": [], "plugins": [] }
第二個方式是使用package.json文件:
{ "name": "my-package", "version": "1.0.0", "babel": { "presets": [], "plugins": [] } }使用預(yù)設(shè)
上面說過,預(yù)設(shè)就是一組插件的集合,例如預(yù)設(shè)babel-preset-es2015就是把一堆跟ES2015有關(guān)的插件組合起來提供編譯ES2015代碼為ES5代碼的功能。下面我們開始使用babel-preset-es2015預(yù)設(shè)來把ES2015轉(zhuǎn)譯成ES5。
首先我們安裝這個預(yù)設(shè):
$ npm install --save-dev babel-preset-es2015
然后在配置文件里添加這個預(yù)設(shè):
{ "presets": [ "es2015" ], "plugins": [] }
最后我們再次運行一次npm run build命令,再次打開lib/index.js文件,我們會看到代碼已經(jīng)被編譯成ES5的語法:
"use strict"; [1, 2, 3].map(function (n) { return n + 1; });Babel的執(zhí)行 Polyfill
像上面那段轉(zhuǎn)譯后的代碼我們可以直接使用在當前的環(huán)境下,但是并不是所有轉(zhuǎn)譯后的文件我們都只能直接使用,因為雖然Babel可以編譯目前幾乎所有的ES2015語法,但是一些新的API可能在當前的Javascript環(huán)境下無法支持。例如下面的代碼(假設(shè)文件為lib/index.js):
function addAll() { return Array.from(arguments).reduce((a, b) => a + b); }
轉(zhuǎn)譯后會變成:
function addAll() { return Array.from(arguments).reduce(function(a, b) { return a + b; }); }
可以看到語法上已經(jīng)轉(zhuǎn)譯成ES5了,但是并不是所有的Javascript環(huán)境都支持Array.from,例如我們在IE上運行如下頁面:
可能會報以下的錯誤:
對象不支持“from”屬性或方法
Babel的解決方法就是使用Polyfill技術(shù)(使用了core-js和regenerator),通過在當前的運行環(huán)境模擬不存在的API來達到使用新API的目的。
首先我們安裝babel-polyfill:
$ npm install --save babel-polyfill
注意這里使用的是--save而不是--save-dev,因為我們需要在代碼里引入babel-polyfill。我們需要在文件頂部導(dǎo)入它:
import "babel-polyfill";
在添加這句代碼后,上面的代碼在轉(zhuǎn)譯后會變成下面這個樣子:
"use strict"; require("babel-polyfill"); function addAll() { return Array.from(arguments).reduce(function (a, b) { return a + b; }); }
因為Babel編譯時默認使用的是CommonJS的模塊規(guī)范,所以會看到轉(zhuǎn)譯后的代碼使用了require方法來加載babel-polyfill。這個在node環(huán)境下運行沒有問題,但是在瀏覽器環(huán)境下運行就會報錯,因為瀏覽器目前還不原生的支持模塊的加載。那在瀏覽器下怎么使用babel-polyfill呢?
我們可以把babel-polyfill通過外部js的方式加載進來,而不是在js代碼里進行引入:
但是如果你打算在項目里使用模塊,上面明顯不是很好的解決方案。下面我們看看如果解決在瀏覽器環(huán)境下模塊的加載問題。
使用模塊要在瀏覽器環(huán)境下加載依賴模塊,有很多方式,例如使用webpack或者browserify之類的打包工具(建議的方式,但是這里我們先不涉及)。或者我們可以使用瀏覽器端的模塊加載器進行加載,例如我們使用AMD模塊規(guī)范進行編譯,然后用RequireJS進行加載。下面我使用SystemJS來做例子。
首先我們安裝es2015-modules-systemjs插件:
$ npm install babel-plugin-transform-es2015-modules-systemjs
然后修改配置文件,在plugins里添加插件:
{ "plugins": ["transform-es2015-modules-systemjs"] }
我們修改下lib/index.js,把addAll方法導(dǎo)出為模塊的方法:
import "babel-polyfill"; export function addAll() { return Array.from(arguments).reduce((a, b) => a + b); }
再次對文件進行編譯,編譯后的lib/index.js變成這樣:
"use strict"; System.register(["babel-polyfill"], function (_export, _context) { "use strict"; return { setters: [function (_babelPolyfill) {}], execute: function () { function addAll() { return Array.from(arguments).reduce(function (a, b) { return a + b; }); } _export("addAll", addAll); } }; });
然后我們需要在HTML里引入system.js。由于SystemJS依賴于Promise,它會加載目錄下system-polyfills.js文件,所以我們需要確保這個文件的存在。在加載system.js后,我們就可以使用SystemJS進行模塊的加載了:
后記出于性能的考慮,也可以用像Bluebird和es6-promise這樣的polyfill做替代,在system.js之前加載。
自此,我們學(xué)習(xí)到了Babel的一些基礎(chǔ)用法,包括安裝和運行,以及配置和預(yù)設(shè)的用法,同時也初探了一些編譯后的文件的運行問題。但是要用好Babel,還有很多問題需要繼續(xù)探討,期待我的下一篇筆記。
參考https://babeljs.io/
https://github.com/thejamesky...
https://github.com/systemjs/s...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/86462.html
摘要:快速體驗安裝依賴新建文件夾,在命令行里進入該文件夾,并執(zhí)行如下命令生成文件是內(nèi)置的一個,可通過命令行操作來編譯文件。入門為了確保轉(zhuǎn)換后的代碼能正常的運行,最好在代碼之前引入這是一個實現(xiàn)了部分特性的包。參考中文網(wǎng)入門 簡介 Babel 是一個 JavaScript 編譯器,可將我們代碼中的 ES6 語法轉(zhuǎn)換為 ES5 的語法,使我們的代碼能在不支持 ES6 語法的環(huán)境中正常運行。配合一些...
先簡單說一下Babel吧 Babel是一個ES6轉(zhuǎn)碼器,可以將ES6代碼轉(zhuǎn)為ES5代碼 此篇教程是在學(xué)習(xí)阮老師的《ES6標準入門》時,不會npm的學(xué)習(xí)總結(jié) 在阮老師的教程上具體補充,通過以下幾個步驟,即可在項目中直接安裝Babel轉(zhuǎn)碼器,一行命令即可進行ES6轉(zhuǎn)碼 第一步:創(chuàng)建package.json package.json 文件是一個描述文件,主要有以下3個作用: 1.描述項目依賴了哪些包 2...
摘要:哈哈,我理解,架構(gòu)就是骨架,如下圖所示譯年月個有趣的和庫前端掘金我們創(chuàng)辦的使命是讓你及時的了解開發(fā)中最新最酷的趨勢。 翻譯 | 上手 Webpack ? 這篇就夠了! - 掘金譯者:小 boy (滬江前端開發(fā)工程師) 本文原創(chuàng),轉(zhuǎn)載請注明作者及出處。 原文地址:https://www.smashingmagazine.... JavaSrip... 讀 Zepto 源碼之代碼結(jié)構(gòu) - ...
摘要:全文的目的是達成使用進行項目開發(fā),并且以我這個前端菜鳥所見所學(xué)來歸納整理。環(huán)境安裝與前期準備我的基礎(chǔ)環(huán)境出的開源的編輯器命令行工具,下一個炒雞好用的神器。只提供組件,對配套技術(shù)不做限定,方便用戶與現(xiàn)有技術(shù)棧快速整合,降低使用成本。 全文的目的是達成使用amazeui-touch進行項目開發(fā),并且以我這個前端菜鳥所見所學(xué)來歸納整理。文章不對詳細內(nèi)容做講解。 環(huán)境安裝與前期準備 我的基礎(chǔ)環(huán)...
閱讀 3690·2021-09-07 10:19
閱讀 3633·2021-09-03 10:42
閱讀 3588·2021-09-03 10:28
閱讀 2555·2019-08-29 14:11
閱讀 814·2019-08-29 13:54
閱讀 1601·2019-08-29 12:14
閱讀 421·2019-08-26 12:12
閱讀 3619·2019-08-26 10:45