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

資訊專欄INFORMATION COLUMN

babel-polyfill的相關(guān)知識(shí)

seal_de / 1214人閱讀

摘要:與簡(jiǎn)單來(lái)說包括了和轉(zhuǎn)義和的包。雖然實(shí)際壓縮已經(jīng)能夠優(yōu)化掉大部分體積的,但是對(duì)于一些最新瀏覽器版本來(lái)說,任何的都是浪費(fèi)資源的。以服務(wù)端渲染的方式從請(qǐng)求中獲取到的信息,然后返回對(duì)應(yīng)的。

使用@babel/polyfill可以讓你在任何es2015+的環(huán)境中編寫代碼,而不需要擔(dān)心兼容性問題。它會(huì)在全局變量上添加一些類似于原生的方法。但是webpack一直以來(lái)配置都特別復(fù)雜,直到webpack4才開始做0配置。項(xiàng)目中如果需要webpack的配置可能都是ctrl+c ctrl+v,沒有及時(shí)去更新,會(huì)對(duì)polyfill有一些誤解,比如說,項(xiàng)目中會(huì)同時(shí)出現(xiàn)babel-plugin-transform-runtimebabel-polyfill,在已經(jīng)使用了babel-polyfill的基礎(chǔ)上還是會(huì)擔(dān)心使用新語(yǔ)法帶來(lái)的問題。這篇文章將會(huì)解答一些與babel-polyfill相關(guān)的問題。

polyfill與core-js

簡(jiǎn)單來(lái)說polyfill包括了core-jsregenerator-runtime(轉(zhuǎn)義async和await的包)。

而且babel7.4.0開始@babel/polyfill改成直接引入core-jsregenerator-runtime

As of Babel 7.4.0, this package has been deprecated in favor of directly including core-js/stable (to polyfill ECMAScript features) and regenerator-runtime/runtime (needed to use transpiled generator functions):
import "core-js/stable";
import "regenerator-runtime/runtime";

polyfill與preset-env

preset-env中我們需要關(guān)注以下兩個(gè)屬性

targets

targets可以設(shè)置polyfill引入哪些方法的轉(zhuǎn)義,因?yàn)?b>preset-env有一個(gè)內(nèi)置的json文件,可以根據(jù)用戶設(shè)置過濾所需要polyfill的方法

// corejs2-built-ins.json
    {
    "es6.array.copy-within": {
        "chrome": "45",
        "edge": "12",
        "firefox": "32",
        "safari": "9",
        "node": "4",
        "ios": "9",
        "samsung": "5",
        "opera": "32",
        "electron": "0.35"
      },
      "es6.array.every": {
        "chrome": "5",
        "opera": "10.10",
        "edge": "12",
        "firefox": "2",
        "safari": "3.1",
        "node": "0.10",
        "ie": "9",
        "android": "4",
        "ios": "6",
        "phantom": "2",
        "samsung": "2.1",
        "electron": "1.1"
      },
    ……
    }

// 根據(jù)項(xiàng)目需要兼容的最低版本
{
  "targets": {
    "chrome": "58",
    "ie": "11"
  }
}
useBuiltIns

useBuiltIns有兩個(gè)特別有用的屬性,usage和entry,使用兩個(gè)屬性都是直接引用core-js對(duì)應(yīng)的包。

entry的用法:項(xiàng)目中import "@babel/polyfill";persets的options中使用useBuiltIns: "entry",配合targets選項(xiàng),只import最低版本所需要的方法墊片

usage的用法:只需要在persets的options中使用useBuiltIns: "usage"即可將所有項(xiàng)目中用到所需要在最低瀏覽器版本不兼容的方法墊片,例如 includes 方法就會(huì)自動(dòng)import "core-js/modules/es6.string.includes";`

//demo
// index.js
console.log("test123".includes("test"));
// webpack.config.js
use: {
    loader: "babel-loader",
    options: {
        presets: [
            [
                "@babel/preset-env",
                {
                    targets: {
                        chrome: "58",
                        ie: "11"
                    },
                    useBuiltIns: "usage"
                }
            ]
        ]
    }
}

因?yàn)?includes 在 ie11 中不兼容,打包結(jié)果:

不使用@babel/preset-env,打包后文件 _900 多 bytes 不到 1kb_,不能兼容低版本瀏覽器

使用preset-env+useBuiltIns: "usage",babel 識(shí)別到使用了 includes 方法,加入 polyfill 的方法有[ "es6.string.includes", "es7.array.includes" ],打包后文件為 6.56kb

使用preset-env+useBuiltIns: "entry",并且手動(dòng) import @babel/polyfill(使用 useBuiltIns webpack 都會(huì)建議不需要手動(dòng) import polyfill,如果它檢測(cè)到用戶已經(jīng) import 了會(huì)提示 useBuiltIns 選用 entry 屬性),polyfill 的幾十個(gè)方法,也就是按照 targets 的配置將所有需要 polyfill 方法都打包進(jìn)來(lái),打包后文件為 76.7kb

{
  "es6.array.copy-within",
  "es6.array.fill",
  "es6.array.find",
  "es6.array.find-index",
  "es7.array.flat-map",
  "es6.array.from",
  "es7.array.includes",
  ……
}

只使用 babel-loader+@babel/preset-env,打包文件大小為 86.3kb

因此,如果項(xiàng)目本身是有兼容性要求的話,一般都會(huì)使用 babel-loader 做兼容,因?yàn)楹艹R姷?array.from 也是要做 polyfill 的,加上 preset-env + useBuiltIns 按需加載使用一些新語(yǔ)法其實(shí)不需要太擔(dān)心包大小的問題,也不需要手動(dòng) import @babel/polyfill

雖然在babel-preset-env官方文檔中看到usage還是experiment狀態(tài),但是可以在vue-cli的源碼看到默認(rèn)打包的app的presets配置里useBuiltIns是usage,所以可以放心的用(其實(shí)babel6的時(shí)候usage就已經(jīng)是experiment,babel7也還是)

/vue-cli/packages/@vue/babel-preset-app/index.js

需要注意的是如果你使用的不是TC39 stage4的提案,你還是需要自己手動(dòng)去設(shè)置babel-plugin,preset-env不會(huì)幫你引入其他stage的語(yǔ)法墊片

polyfill 與 plugin-transform-runtime

如果有長(zhǎng)時(shí)間使用過webpack,一定不會(huì)對(duì)babel-plugin-transform-runtime這個(gè)插件陌生,大家都有做兼容的環(huán)境的作用,甚至有些項(xiàng)目還會(huì)看到同時(shí)使用babel-polyfillbabel-plugin-transform-runtime,這種做法貌似在babel-preset-env出來(lái)之前是有一定道理的。

實(shí)際上transform-runtime的轉(zhuǎn)換是非侵入性的,也就是它不會(huì)污染你的原有的方法,比如掛在Array原型上的includes方法就只能使用babel-polyfill

transform-runtime的使用場(chǎng)景應(yīng)該是庫(kù),遇到需要轉(zhuǎn)換的方法它會(huì)另起一個(gè)名字,否則會(huì)直接影響使用庫(kù)的業(yè)務(wù)代碼,平常的項(xiàng)目使用babel-polyfill即可。

polyfill.io

雖然presets-env+實(shí)際壓縮已經(jīng)能夠優(yōu)化掉大部分體積的polyfill,但是對(duì)于一些最新瀏覽器版本來(lái)說,任何的polyfill都是浪費(fèi)資源的。

這時(shí)候polyfill.io能夠解決這個(gè)問題。polyfill.io以服務(wù)端渲染的方式從請(qǐng)求中獲取到useragent的信息,然后返回對(duì)應(yīng)的polyfill。但據(jù)說是因?yàn)闉g覽器版本太多,國(guó)內(nèi)還有套殼的360/qq等瀏覽器,ua要是判斷失誤沒有其他回退的方案,因此沒有辦法廣泛應(yīng)用起來(lái)。

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

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

相關(guān)文章

  • Babel使用

    摘要:使用的時(shí)候只需要安裝你想要的階段就可以了然后添加進(jìn)你的配置文件。為了顯出的能耐,我們分別配個(gè)用和支持的先來(lái)配使用的首先安裝然后配置需要注意的是,雖然沒有出現(xiàn)在配置里,但仍然需要安裝,因?yàn)橐蕾囁? Babel介紹 Babel 把用最新標(biāo)準(zhǔn)編寫的 JavaScript 代碼向下編譯成可以在今天隨處可用的版本。 這一過程叫做源碼到源碼編譯, 也被稱為轉(zhuǎn)換編譯。 15 年 11 月,Babel...

    Y3G 評(píng)論0 收藏0
  • webpack4 系列教程(二): 編譯 ES6

    摘要:今天介紹怎么編譯的各種函數(shù)和語(yǔ)法。對(duì)于相關(guān)的匹配規(guī)則,除了匹配結(jié)尾的文件,還應(yīng)該去除文件夾下的第三庫(kù)的文件發(fā)布前已經(jīng)被處理好了。它需要在我們項(xiàng)目的入口文件中被引入,或者在中配置。個(gè)人網(wǎng)站原文鏈接系列教程二編譯 今天介紹webpack怎么編譯ES6的各種函數(shù)和語(yǔ)法。敲黑板:這是webpack4版本哦, 有一些不同于webpack3的地方。 >>> 本節(jié)課源碼 >>> 所有課程源碼 1....

    graf 評(píng)論0 收藏0
  • babel相關(guān)總結(jié)

    對(duì)babel一直沒具體總結(jié)過,趁周末看了下文檔,記錄一下 babel作為一個(gè)compiler,主要用在轉(zhuǎn)換新的es標(biāo)準(zhǔn)實(shí)現(xiàn)來(lái)使所有瀏覽器都支持,這包含兩方面 新的es標(biāo)準(zhǔn)語(yǔ)法,箭頭函數(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è)階段...

    Richard_Gao 評(píng)論0 收藏0
  • babel學(xué)習(xí)筆記

    摘要:經(jīng)過一番折騰,總算是把自己項(xiàng)目里的配置調(diào)整好了,所有文件從原來(lái)的縮小到。折騰了不少時(shí)間,改動(dòng)其實(shí)就一個(gè)地方,就是配置文件,記錄一下自己折騰的過程。本以為那這兩種方式取其一就行了。這感覺和想象中的不一樣啊,說好的一個(gè)搞定一切的呢。。。 先是看到前端早讀課【第1065期】再見,babel-preset-2015,聽說現(xiàn)在有了babel-preset-env,別的什么preset都不需要了,...

    Aomine 評(píng)論0 收藏0
  • Babel 配置工程師應(yīng)知應(yīng)會(huì)

    摘要:,標(biāo)題黨了,本文僅介紹相關(guān)生態(tài)和一些配置心得。函數(shù)是在時(shí)候常用的工具函數(shù),對(duì)編譯模塊時(shí),會(huì)將用到的放到模塊頂部。用來(lái)看最終引入了哪些必須配合,貌似加入了此項(xiàng)以后,會(huì)得到類似于的效果。 Babel Sorry,標(biāo)題黨了,本文僅介紹 Babel 相關(guān)生態(tài)和一些配置心得。 Babel 各個(gè) package 的用途 babel-core: 核心部分 babel-cli: 允許使用命令行 ...

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

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

0條評(píng)論

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