成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【工具向】我所知道的babel總結(jié)

Leo_chen / 1994人閱讀

摘要:這兩天研究了一下這個(gè)工具,因?yàn)槠綍r(shí)項(xiàng)目基本都是腳手架生成的配置文件,真正自己想寫(xiě)點(diǎn)東西的時(shí)候,親自去配卻是一臉懵逼,寫(xiě)下這篇博客記錄一下我的認(rèn)知范圍內(nèi)的總結(jié)。

這兩天研究了一下babel這個(gè)工具,因?yàn)槠綍r(shí)項(xiàng)目基本都是腳手架生成的babel配置文件,真正自己想寫(xiě)點(diǎn)東西的時(shí)候,親自去配卻是一臉懵逼,寫(xiě)下這篇博客記錄一下我的認(rèn)知范圍內(nèi)的babel總結(jié)。
首先,先看幾個(gè)平時(shí)常見(jiàn)的babel配置



圖一:vue的webpack-template生成的babel配置
圖二:react的create-react-app腳手架eject模式生成的babel配置
圖三:一個(gè)常見(jiàn)的普通配置,有presets和plugins
這三張圖看完文章應(yīng)該都可以理解了

babel-core

首先什么是babel?
官網(wǎng)的介紹是:Use next generation JavaScript, today.
簡(jiǎn)單的說(shuō),就是讓你可以在此時(shí)此刻此地使用下一代JavaScript語(yǔ)法和API,babel可以幫助你轉(zhuǎn)換成瀏覽器可以運(yùn)行的穩(wěn)定的版本,因?yàn)楦鞔鬄g覽器對(duì)es6+的支持并不都很好。
且從babel6以及更高版本,babel自身不負(fù)責(zé)轉(zhuǎn)換工作,具體的轉(zhuǎn)換工作由插件來(lái)實(shí)現(xiàn),babel只提供babel-core來(lái)把JavaScript代碼分析為AST(抽象語(yǔ)法樹(shù)),供插件做轉(zhuǎn)換。

如何使用babel

通用的方式是在項(xiàng)目中寫(xiě) .babelrc文件,或者在package.json中配置"babel"選項(xiàng)(圖二react腳手架就是這么做的)

plugins、presets、transform-runtime、stage-X、env和babel-polyfill

npm install babel-core --save-d
寫(xiě)一個(gè)這樣的例子

let a = "a";
let assign = Object.assign({name: "jack"}, {name: "bob"});
let f = () => {
  console.log("arrow func");
}
let i = [].includes;
let p = new Promise();
var q = async function q() {
  console.log("async");
};

這是一段典型的es6語(yǔ)法的代碼,為了將它轉(zhuǎn)換為es5代碼,我們需要使用插件來(lái)轉(zhuǎn)換。

可以看到這有許多的插件供選擇,只需要挑選合適的插件即可,
.babelrc文件配置如下:

{
  "plugins": [
    "some plugin",
    "some plugin",
    ...
  ]
}

但是如果需要很多很多插件的話,一個(gè)一個(gè)寫(xiě)是很費(fèi)力的
所以,presets可以拯救我們,presets可以理解為plugin的集合
繼續(xù)配置.babelrc文件:

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

編譯完的結(jié)果為

可以看到只轉(zhuǎn)換了let、箭頭函數(shù)這樣的語(yǔ)法,assign、includes、Promise、async被原樣輸出
這個(gè)時(shí)候就需要transform-runtime了

{
  "presets": [
    "es2015"
  ],
  "plugins": [
    "transform-runtime"
  ]
}

編譯完的結(jié)果為:

可以看到let、箭頭函數(shù)、Object.assign、Promise都被正確編譯,但是async、includes依然沒(méi)有變化
此時(shí)可以引入stage-X的概念了,Stage-x preset 中的任何轉(zhuǎn)換都是對(duì)未被批準(zhǔn)為 JavaScript 版本一部分的語(yǔ)言的變化,大白話就是還未被發(fā)布的版本中的語(yǔ)法,比如現(xiàn)在JavaScript的最新規(guī)范版本的es6,所以es7的一些語(yǔ)法我們就需要引入stage-X來(lái)使用,比如async這樣的語(yǔ)法。
不成熟的想法(stage-0:Strawman)——>通過(guò)之后變成提議(stage-1:Proposal)——>通過(guò)進(jìn)入草案(stage-2: Draft)——>通過(guò)進(jìn)入候選(stage-3: Candidate)——>進(jìn)入標(biāo)準(zhǔn)(stage-4:finished)可以看到這里面有個(gè)層層篩選的過(guò)程,所以stage-0包含的功能最多,要是不知道哪個(gè)階段的功能,直接stage-0
至于stage-0、stage-1、stage-2、stage-3分別具體的使用,看文檔babel-stage
繼續(xù)配置.babelrc

{
  "presets": [
    "es2015"
    "stage-0"
  ],
  "plugins": [
    "transform-runtime"
  ]
}

編譯結(jié)果:

圖雖然沒(méi)截全,但是可以看到async方法被轉(zhuǎn)換過(guò)來(lái)了,然而includes方法依然沒(méi)有轉(zhuǎn)換。
此時(shí)就要使用babel-polyfill了,babel-polyfill會(huì)仿效一個(gè)完整的 ES2015+ 環(huán)境,這意味著你可以使用新的內(nèi)置對(duì)象比如 Promise 或者 WeakMap, 靜態(tài)方法比如 Array.from 或者Object.assign, 實(shí)例方法比如 Array.prototype.includes 和生成器函數(shù)。簡(jiǎn)言之,babel-polyfill就像lodash這種庫(kù)一樣,引入之后可以隨心所欲的使用es6+的方法。
使用方法:

import "babel-polyfill"

module.exports = {
    entry: ["babel-polyfill", "./index.js"]
};

最后,env是什么意思呢?它是environment的縮寫(xiě),根據(jù)你支持的環(huán)境自動(dòng)決定適合你的 Babel 插件的 Babel presets,其實(shí)就是根據(jù)你的環(huán)境來(lái)自動(dòng)決定插件集合。

總結(jié)

plugin:真正做轉(zhuǎn)換工作的,寫(xiě)在plugins數(shù)組中,實(shí)現(xiàn)一些語(yǔ)法的轉(zhuǎn)換
presets:一組插件
stage-X:轉(zhuǎn)換一些還未正式發(fā)布的語(yǔ)法,例如async
presets-env:根據(jù)你支持的環(huán)境自動(dòng)決定適合你的 Babel 插件的 Babel presets
transform-runtime:轉(zhuǎn)換一些對(duì)象以及方法,例如Promise、Set,并且它動(dòng)態(tài)提供你所使用的插件,且不會(huì)強(qiáng)行的修改全局對(duì)象的prototype,但是runtime不會(huì)轉(zhuǎn)換實(shí)例方法,只會(huì)轉(zhuǎn)換靜態(tài)方法。最后,寫(xiě)工具庫(kù)的時(shí)候考慮使用transform-runtime,不會(huì)沖突
babel-polyfill:這是一個(gè)庫(kù),安裝的時(shí)候我們需要讓它成為一個(gè) dependency, 而不是一個(gè) devDependency,且它直接在全局對(duì)象上擴(kuò)展,可以很自由的使用es6+,可以轉(zhuǎn)換實(shí)例方法和靜態(tài)方法,使用它可以取代transform-runtime和presets。但是它的問(wèn)題是體積較大回帶來(lái)許多我們并用不到的東西以及可能會(huì)帶來(lái)沖突,需要兼容平臺(tái)和環(huán)境較多時(shí)考慮使用

參考:
https://juejin.im/entry/5a290...
https://github.com/youngwind/...
https://segmentfault.com/a/11...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94434.html

相關(guān)文章

  • 【譯】使用TypeScript兩年后-值得嗎?

    摘要:弄了一個(gè)持續(xù)更新的筆記,可以去看看,鏈接地址此篇文章的地址使用兩年后值得嗎基礎(chǔ)筆記的地址可以也可以。使用,你可以使用抽象類(lèi)等功能。有關(guān)抽象類(lèi)的更多信息支持,和方法,只讀屬性。 弄了一個(gè)持續(xù)更新的github筆記,可以去看看,鏈接地址:Front-End-Basics 此篇文章的地址:使用TypeScript兩年后-值得嗎? 基礎(chǔ)筆記的github地址:https://githu...

    RyanQ 評(píng)論0 收藏0
  • Vue 2.x 實(shí)戰(zhàn)之后臺(tái)管理系統(tǒng)開(kāi)發(fā)(一)

    摘要:導(dǎo)語(yǔ)下文實(shí)戰(zhàn)之后臺(tái)管理系統(tǒng)開(kāi)發(fā)二該文章將從頭到尾梳理我是如何使用開(kāi)發(fā)一個(gè)后臺(tái)管理項(xiàng)目的,我會(huì)將自己遇到的問(wèn)題貼出,希望可以幫助到其他人。構(gòu)建項(xiàng)目框架準(zhǔn)備對(duì)于大陸用戶,建議將的注冊(cè)表源設(shè)置為國(guó)內(nèi)的鏡像,如淘寶鏡像,可以大幅提升安裝速度。 1. 導(dǎo)語(yǔ) 下文:Vue 2.x 實(shí)戰(zhàn)之后臺(tái)管理系統(tǒng)開(kāi)發(fā)(二) 該文章將從頭到尾梳理我是如何使用 Vue 2 開(kāi)發(fā)一個(gè)后臺(tái)管理項(xiàng)目的,我會(huì)將自己遇到的問(wèn)...

    darkbaby123 評(píng)論0 收藏0
  • 我所理解簡(jiǎn)單項(xiàng)目結(jié)構(gòu)

    摘要:將圖片都放入文件夾下指定公共的名字。匹配刪除的文件根目錄開(kāi)啟在控制臺(tái)輸出信息啟用刪除文件插入開(kāi)關(guān)說(shuō)一些可能沒(méi)用的站在前端角度不懂的很多很多時(shí)候一個(gè)項(xiàng)目都是由一個(gè)小組完成的,小組成員可能包括產(chǎn)品,前端,后端,測(cè)試,運(yùn)營(yíng)等等。 不急,先聽(tīng)我嘮會(huì)嗑~ 隨著js發(fā)展的如此迅速,市場(chǎng)上越來(lái)越多的前端框架可以方便開(kāi)發(fā)者使用。 本人大四渣渣一名,先后實(shí)習(xí)了兩個(gè)地方,第一家公司用vuejs,實(shí)話...

    _DangJin 評(píng)論0 收藏0
  • 查漏補(bǔ)缺 - 收藏集 - 掘金

    摘要:醞釀許久之后,筆者準(zhǔn)備接下來(lái)撰寫(xiě)前端面試題系列文章,內(nèi)容涵蓋瀏覽器框架分鐘搞定常用基礎(chǔ)知識(shí)前端掘金基礎(chǔ)智商劃重點(diǎn)在實(shí)際開(kāi)發(fā)中,已經(jīng)非常普及了。 這道題--致敬各位10年阿里的前端開(kāi)發(fā) - 掘金很巧合,我在認(rèn)識(shí)了兩位同是10年工作經(jīng)驗(yàn)的阿里前端開(kāi)發(fā)小伙伴,不但要向前輩學(xué)習(xí),我有時(shí)候還會(huì)選擇另一種方法逗逗他們,拿了網(wǎng)上一道經(jīng)典面試題,可能我連去阿里面試的機(jī)會(huì)都沒(méi)有,但是我感受到了一次面試1...

    YuboonaZhang 評(píng)論0 收藏0
  • 利用vscode調(diào)試nodejs代碼實(shí)踐總結(jié)

    摘要:支持,和三種環(huán)境,并且可以安裝擴(kuò)展插件,因而可以滿足絕大多數(shù)人的要求,安裝配置非本文所要講述的內(nèi)容,請(qǐng)自行查找,本文著重討論如何用更好的調(diào)試代碼,希望能對(duì)大家有所幫助。 2018.5.12更新 最近在用vscode 1.23版本的時(shí)候發(fā)現(xiàn)outDir不可以使用了,建議這么改吧,直接program采用編譯后的文件,然后打開(kāi)sourceMaps,同時(shí)在babel編譯的時(shí)候自己搞--watc...

    chenatu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<