Webpack4 使用Babel處理ES6語(yǔ)法的方法示例
修改 index.js 內(nèi)容,寫一些 ES6
的語(yǔ)法:
const arr = [ new Promise(() => {}), new Promise(() => {}) ]; arr.map(item => { console.log(item); })
ES6
很強(qiáng)大,但目前并不是所有的瀏覽器都支持,所以需要用到 Babel
,讓舊的瀏覽器或環(huán)境中將 ES6
代碼轉(zhuǎn)換為向后兼容版本的 JavaScript
代碼。
來(lái)試一下吧,先安裝需要用的 Babel
包:
npm install babel-loader @babel/core -D
配置 webpack.config.js,增加一條 rulues :
module: { rules: [{ test: /\.js$/, exclude: /node_modules/, // 排除該目錄下的所有代碼 loader: "babel-loader" }] }
babel-loader
告訴了 webpack
怎么處理 ES6
代碼,但它并不會(huì)將ES6
代碼翻譯成向后兼容版本的代碼,如果想要執(zhí)行這一步,還需要安裝一個(gè)模塊 preset-env,它包含了所有 ES6
代碼轉(zhuǎn)換的規(guī)則:
npm install @babel/preset-env -D
安裝完之后配置一下:
rules: [{ test: /\.js$/, exclude: /node_modules/, // 排除該目錄下的所有代碼 loader: 'babel-loader', options:{ 'presets': ['@babel/preset-env'] } }]
這樣,運(yùn)行打包命令,就可以把 ES6
語(yǔ)法翻譯成 ES5
了,看一下打包的結(jié)果:
沒(méi)問(wèn)題,語(yǔ)法已經(jīng)翻譯成了當(dāng)前所有瀏覽器能識(shí)別的語(yǔ)法,但是做到了這一點(diǎn)還是不夠,因?yàn)槟切┍容^新的對(duì)象和函數(shù),比如這里的 Promise
和 map
,在低版本的瀏覽器里實(shí)際還是不存在的。所以這時(shí)不僅要進(jìn)行語(yǔ)法的轉(zhuǎn)換,還要想辦法把這些新的特性,補(bǔ)充到低版本的瀏覽器里。怎么做呢? babel
提供了一個(gè)工具叫 polyfill
,安裝:
npm install @babel/polyfill -D
然后在 index.js 的最頂部,引入這個(gè)包:
import '@babel/polyfill'
保存代碼,再次進(jìn)行打包查看結(jié)果,可以發(fā)現(xiàn)打包后的 main.js 里面,有了很多代碼來(lái)幫助實(shí)現(xiàn)比如 Promise
和 map
這些新特性。看一下 main.js 文件的大?。?/p>
859KB,再看一下沒(méi)有使用 polyfill
之前的 main.js 大?。?/p>
只有4.36KB,使用 polyfill
之后文件變大了很多,這說(shuō)明了 polyfill
使用了非常多的代碼來(lái)填入新特性。
但是,index.js 里只使用了 Promise
和 map
,其它的新特性都沒(méi)用,能不能把那些沒(méi)用到的實(shí)現(xiàn)方法都剔除了呢? 可以,給 preset-env 增加一個(gè) useBuiltIns 配置:
rules: [{ test: /\.js$/, exclude: /node_modules/, // 排除該目錄下的所有代碼 loader: 'babel-loader', options: { 'presets': [ ['@babel/preset-env', { useBuiltIns: 'usage' }] ] } }]
useBuiltIns: 'usage'
的意思就是說(shuō),當(dāng)使用 polyfill
往低版本瀏覽器填入一些不存在的特性時(shí),不是全部都填入,而是根據(jù)業(yè)務(wù)代碼使用到的特性去選擇填入,比如這里使用了 Promise
和 map
,那就只填入這兩個(gè),其它的都不用。 再次打包查看結(jié)果:
可以看到,main.js 的大小只有 138KB了。
這里還可以配置一些其它的參數(shù),比如 targets 參數(shù):
rules: [{ test: /\.js$/, exclude: /node_modules/, // 排除該目錄下的所有代碼 loader: 'babel-loader', options: { 'presets': [ ['@babel/preset-env', { useBuiltIns: 'usage', targets:{ edge: '17', // edge高于17的版本 firefox: '60', // firefox 高于60的版本 chrome: '67' // chrome高于67的版本 } }] ] } }]
targets 是指打包會(huì)運(yùn)行在什么樣的瀏覽器,這有三個(gè)瀏覽器,并注明了最低版本。在打包的過(guò)程中,babel
會(huì)去看這些瀏覽器對(duì) ES6
代碼的支持情況,是否有必要進(jìn)行語(yǔ)法轉(zhuǎn)換、填入一些新特性。 運(yùn)行打包命令查看結(jié)果:
發(fā)現(xiàn)還是輸出的 Promise
和 map
,并沒(méi)有進(jìn)行新特性的填入,說(shuō)明這三個(gè)版本的瀏覽器對(duì) ES6
的支持已經(jīng)很好了,不需要在進(jìn)行額外的處理,main.js 的大小是變成了最初的4.36KB。
到此為止,webpack
對(duì) ES6
的簡(jiǎn)單處理就完成了。
關(guān)于 babel
還有很多東西和配置項(xiàng),更多的知識(shí)要到 https://babel.docschina.org 來(lái)學(xué)習(xí)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Webpack4+Babel7+ES6兼容IE8的實(shí)現(xiàn)
- 詳解用Webpack與Babel配置ES6開(kāi)發(fā)環(huán)境
- 詳解webpack+ES6+Sass搭建多頁(yè)面應(yīng)用
- webpack4與babel配合使es6代碼可運(yùn)行于低版本瀏覽器的方法
- 詳解Webpack + ES6 最新環(huán)境搭建與配置
- webpack使用 babel-loader 轉(zhuǎn)換 ES6代碼示例
- es6+angular1.X+webpack 實(shí)現(xiàn)按路由功能打包項(xiàng)目的示例
- 詳解webpack 配合babel 將es6轉(zhuǎn)成es5 超簡(jiǎn)單實(shí)例
- Webpack打包過(guò)程中處理ES6模塊的循環(huán)依賴問(wèn)題小結(jié)
相關(guān)文章
通用于ie和firefox的函數(shù) GetCurrentStyle (obj, prop)
通用于ie和firefox的函數(shù) GetCurrentStyle (obj, prop)...2006-12-12JS實(shí)現(xiàn)把一個(gè)頁(yè)面層數(shù)據(jù)傳遞到另一個(gè)頁(yè)面的兩種方式
這篇文章主要介紹了JS實(shí)現(xiàn)把一個(gè)頁(yè)面層數(shù)據(jù)傳遞到另一個(gè)頁(yè)面的方式,本文給大家提供了兩種方式,需要的朋友可以參考下2018-08-08JavaScript如何將后端獲取到的byte數(shù)組轉(zhuǎn)為文件
這篇文章主要給大家介紹了關(guān)于JavaScript如何將后端獲取到的byte數(shù)組轉(zhuǎn)為文件的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-04-04bootstrap weebox 支持ajax的模態(tài)彈出框
本篇介紹的bootstrap weebox(支持ajax的模態(tài)彈出框),歷經(jīng)多次修改,目前版本已經(jīng)穩(wěn)定,整合了bootstrap的響應(yīng)式,界面簡(jiǎn)單,功能卻無(wú)比豐富,支持ajax、圖片預(yù)覽等等2017-02-02JavaScript多種濾鏡算法實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了JavaScript多種濾鏡算法實(shí)現(xiàn)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12easyui window refresh 刷新兩次的解決方法(推薦)
下面小編就為大家?guī)?lái)一篇easyui window refresh 刷新兩次的解決方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05JavaScript實(shí)現(xiàn)簡(jiǎn)易的水印覆蓋功能
本文將簡(jiǎn)單實(shí)現(xiàn)一個(gè)覆蓋水印的小功能,水印一般都是添加在圖片上,然后直接加載處理過(guò)的圖片url即可,這里并沒(méi)有修改圖片,而是直接的在待添加水印的?dom?上添加一個(gè)?canvas?蒙版,需要的可以參考一下2022-12-12淺談layui分頁(yè)控件field參數(shù)接收對(duì)象的問(wèn)題
今天小編就為大家分享一篇淺談layui分頁(yè)控件field參數(shù)接收對(duì)象的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09JavaScript?Echarts柱狀圖label優(yōu)化中問(wèn)題針對(duì)講解
這篇文章主要介紹了JavaScript?Echarts柱狀圖label優(yōu)化中問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12