亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

babel相關(guān)總結(jié)

Richard_Gao / 2872人閱讀

對(duì)babel一直沒具體總結(jié)過,趁周末看了下文檔,記錄一下

babel作為一個(gè)compiler,主要用在轉(zhuǎn)換新的es標(biāo)準(zhǔn)實(shí)現(xiàn)來使所有瀏覽器都支持,這包含兩方面

新的es標(biāo)準(zhǔn)語法,箭頭函數(shù)、擴(kuò)展運(yùn)算符、塊級(jí)作用域等

轉(zhuǎn)化新的es標(biāo)準(zhǔn)方法或正被提議還未納入標(biāo)準(zhǔn)的方法,,Array.from、Map、Promise、String.includes等

babel編譯過程

babel的編譯過程分為三個(gè)階段,解析、轉(zhuǎn)換、生成瀏覽器支持的代碼。官網(wǎng)推薦了一個(gè)the-super-tiny-compiler,描述了類似babel這樣的compiler大體是如何工作的。

解析 解析源代碼,構(gòu)造抽象語法樹

轉(zhuǎn)換 使用各種plugin處理AST,轉(zhuǎn)換成一個(gè)新的AST

生成代碼 根據(jù)新的AST,生成代碼字符串

具體細(xì)節(jié)參見the-super-tiny-compiler

處理新的語法

對(duì)es新增語法的處理是借助babel的各種plugin,各種plugin作用在babel編譯的第二個(gè)階段,轉(zhuǎn)化階段

presets

presets可以看做是一部分plugin的集合,目前官方提供的presets有env、react、flow

在babel還不支持env之前,我們一般在.babelrc中指定

{
    presets:["es2015","es2016","stage-2"]
}

像es2015表示babel會(huì)使用如下這些plugin處理我們代碼中使用的新語法

現(xiàn)在我們可以這樣寫

{
    presets:["env"]
}

等價(jià)于babel-preset-latest,可以轉(zhuǎn)換已經(jīng)在標(biāo)準(zhǔn)中的es6,es7等的新語法,需要注意的是env并不會(huì)處理被提議的stage-x中的新語法,要使用那些語法要自己在presets中執(zhí)行stage-x

并且只是指定env,而不指定相關(guān)的targets信息的話,babel只會(huì)轉(zhuǎn)換新語法,對(duì)新方法不會(huì)做處理

處理新的方法 babel-polyfill

為了支持es新增api的轉(zhuǎn)化,我們可以使用babel-polyfill,這個(gè)庫內(nèi)部使用core-js(那個(gè)作者打廣告說正在找工作的庫)和regenerator來模擬實(shí)現(xiàn)新增api.

使用polyfill的缺點(diǎn)

polyfill需要首先被引入,在文件首部或者webpack中entry: ["babel-polyfill", "./app/js"],整個(gè)文件會(huì)和我們src下的代碼打包在一起,增大文件大小

polyfill會(huì)在js內(nèi)置對(duì)象的原型上增加方法,例如String.prototpe.includes,污染全局作用域

一個(gè)減小使用polyfill后打包代碼過大問題的方法 useBuiltIns=true

useBuiltIns默認(rèn)不開啟,開啟后,我們import "babel-polyfill"會(huì)根據(jù)當(dāng)前targets指定的環(huán)境引入必須的文件

import "babel-polyfill";

輸出:根據(jù)環(huán)境

import "core-js/modules/es7.string.pad-start";
import "core-js/modules/es7.string.pad-end";
import "core-js/modules/web.timers";
import "core-js/modules/web.immediate";
import "core-js/modules/web.dom.iterable";

一定程度上減小打包文件大小

transform-runtime

使用babel-polyfill會(huì)有使打包文件過大和污染全局作用域的問題,所以babel提供了babel-plugin-transform-runtime來解決一些問題

優(yōu)化幫助函數(shù)引用

babel內(nèi)部提供了很多幫助函數(shù)來處理語法轉(zhuǎn)化的需要,transform-runtime會(huì)把對(duì)幫助函數(shù)的調(diào)用替換為對(duì)模塊的引用

class Person {
}

輸出:

"use strict";

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Person = function Person() {
  _classCallCheck(this, Person);
};

_classCallCheck是一個(gè)幫助函數(shù),如果我們多個(gè)js文件中都有定義class類,_classCallCheck就會(huì)在多個(gè)文件中都存在,造成幫助函數(shù)重復(fù),增大打包文件大小。而transform-runtime會(huì)將幫助函數(shù)以引用的方式調(diào)用(引用babel-runtime/helpers/xxx下面的),避免重復(fù)

對(duì)于新增api的轉(zhuǎn)化,transform-runtime使用babel-runtime/core-js下對(duì)應(yīng)的同名方法,而不需要引用babel-polyfill,只會(huì)需要哪個(gè),就require哪個(gè)core-js下對(duì)應(yīng)的實(shí)現(xiàn).避免污染全局作用域

transform-runtime的缺點(diǎn)

因?yàn)椴粫?huì)在js原生對(duì)象原型上添加方法,所以transform-runtime不會(huì)轉(zhuǎn)化新增的實(shí)例方法,例如不能處理"foobar".includes("foo")

對(duì)于新增api如何處理

如果項(xiàng)目中使用了大量新增api,并使用大量新增的實(shí)例方法,應(yīng)該使用polyfill,為了一定程度上減小打包文件的體積,應(yīng)該啟用useBuiltIns=true,并指定代碼的最低運(yùn)行環(huán)境,盡量減少不必要的polyfill,同時(shí)加入transform-runtime,設(shè)置polyfill=false

{
    "presets":[
        ["env",{
            "targets":{
                "browsers": [
                    "last 2 versions",//各個(gè)瀏覽器的最新兩個(gè)版本
                    "safari >= 7"
                ]
            },
            "debug": true,
            "useBuiltIns": true
        }]
    ],
    "plugins":[
        ["transform-runtime", { //不處理新的方法,只處理幫助函數(shù)
            "helpers": true,
            "polyfill": false,
            "regenerator": false,
            "moduleName": "babel-runtime"
        }]
    ]
}

如果項(xiàng)目并不使用新增實(shí)例方法(很少這樣的情況),并不想污染全局作用域,應(yīng)該使用transform-runtime

{
    "presets":["env"],//處理新的語法,但新的方法由transform-runtime插件處理
    "plugins":[
        ["transform-runtime", {
            "helpers": true,
            "polyfill": true,
            "regenerator": true,
            "moduleName": "babel-runtime"
        }]
    ]
}

原文地址

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

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

相關(guān)文章

  • babel歸納總結(jié)

    摘要:歸納總結(jié)在前端的發(fā)展過程中,的兼容性,一直是前端頭痛的問題,在以前的一些有些項(xiàng)目中,為解決瀏覽器兼容而花費(fèi)的時(shí)間甚至還要多余實(shí)際的業(yè)務(wù)邏輯開發(fā)時(shí)間,就是其中處理兼容的轉(zhuǎn)譯工具或者叫平臺(tái)。初稿完成初步規(guī)范。完成將被添加到下一年度發(fā)布。 github: babel歸納總結(jié) 在前端的發(fā)展過程中,javascript的兼容性,一直是前端頭痛的問題,在以前的一些有些項(xiàng)目中,為解決瀏覽器兼容而花費(fèi)...

    v1 評(píng)論0 收藏0
  • 提高代碼質(zhì)量——使用Jest和Sinon給已有的代碼添加單元測(cè)試

    摘要:現(xiàn)在,我們可以使用單元測(cè)試來提高自己的代碼質(zhì)量。它在單元測(cè)試的編寫中通常用來模擬等相關(guān)請(qǐng)求。通過這篇文章,你應(yīng)該學(xué)會(huì)了如何針對(duì)已有代碼從零開始編寫一套完整的單元測(cè)試用例。 概述 在日常的功能開發(fā)中,我們的代碼測(cè)試都依賴于自己或者QA進(jìn)行測(cè)試。這些操作不僅費(fèi)時(shí)費(fèi)力,而且還依賴開發(fā)者自身的驅(qū)動(dòng)。在開發(fā)一些第三方依賴的庫時(shí),我們也沒有辦法給第三方提供完整的代碼質(zhì)量報(bào)告。 現(xiàn)在,我們可以使用單...

    voyagelab 評(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采用編譯后的文件,然后打開sourceMaps,同時(shí)在babel編譯的時(shí)候自己搞--watc...

    chenatu 評(píng)論0 收藏0
  • 用 ES6 編寫 Webpack 的配置文件

    摘要:在執(zhí)行時(shí)會(huì)先用把配置文件轉(zhuǎn)成代碼再繼續(xù)處理。只要你把配置文件命名成,就會(huì)用相應(yīng)的去轉(zhuǎn)換一遍配置文件。它沒改的文件名,但配置文件和各種腳本都是完全的語法。這是提供的一個(gè)命令行工具,你可以用它代替去執(zhí)行文件。總結(jié)得益于,幾乎已經(jīng)是現(xiàn)在的標(biāo)配了。 概述 我最近在整理一個(gè) Ionic + Webpack 的項(xiàng)目模板,因?yàn)轫?xiàng)目代碼都是 ES6 的,所以我也想在其他地方也用 ES6 。其中一個(gè)地方...

    Rocture 評(píng)論0 收藏0
  • 我的es6總結(jié)

    摘要:補(bǔ)充普通方法是實(shí)例化出來的對(duì)象,靜態(tài)方法屬于類,亦可以被繼承。類的基本定義生成實(shí)例構(gòu)造函數(shù)。默認(rèn)值小王的時(shí)候自動(dòng)執(zhí)行構(gòu)造函數(shù)。構(gòu)造函數(shù)和實(shí)例繼承繼承上一級(jí),可以調(diào)用父類的構(gòu)造函數(shù)。 一. es6編譯環(huán)境搭建 1 . 初始化 npm 創(chuàng)建package.json文件 npm init 2. 安裝webpack cnpm install webpack -D 3. 安...

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

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

0條評(píng)論

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