精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

精準(zhǔn)的打包—Webpack 的 Tree Shaking

開發(fā) 前端
前陣子在和朋友聊 Webpack 的時候,突然提到 Tree Shaking,但很慚愧的是我沒有辦法好好說明 Webpack 是如何做到 Tree Shaking 的,因此就趁這個年假的第一天抽空讀 Webpack 的文件,然后把理解到的心得寫下來,如果你也有興趣,就一起看下去吧 。

前陣子在和朋友聊 Webpack 的時候,突然提到 Tree Shaking,但很慚愧的是我沒有辦法好好說明 Webpack 是如何做到 Tree Shaking 的,因此就趁這個年假的第一天抽空讀 Webpack 的文件,然后把理解到的心得寫下來,如果你也有興趣,就一起看下去吧 。

Tree Shaking 是什麼

Tree Shaking 是個優(yōu)化的方式,在 JavaScript 中用來表示移除沒用的代碼的一個常見術(shù)語,之所以叫做 Tree Shaking 的由來似乎是指說“當(dāng)你大力搖晃一棵樹的時候,樹上就只會留著綠色的葉子,其他枯葉都會落到地上”,而那些綠色的葉子就是打包過后的文件中,真正有用到的代碼。

在使用時要注意的是,Tree Shaking 只能夠使用在 static structure(例如:import 和 export 上),像是dynamic structure的 require 就沒辦法被偵測到。舉例來說,import 要載入某個 module 使用的話就一定要在文件的最上方,但 require 可以在任何地方使用,例如以下場景就必須要等到 runtime才會知道 module 是什么:

let module = null;

if (Math.random() * 10 > 5) {
module = require('module1');
} else {
module = require('moudle2');
}

那開始了解 Tree Shaking 的工作前,應(yīng)該會有些人好奇,就算自己從來就沒有特別在 Webpack 中設(shè)置 Tree Shaking,但是沒有用的代碼也都會被移除呀!

那是因?yàn)?Tree Shaking 的執(zhí)行需要 ModuleConcatenationPlugin(圖一),而 Webpack 里另外有個 mode,如果你一直沒有特別去設(shè)置 mode 的值,那 mode 就預(yù)設(shè)會是 production(圖二),然后 production 的預(yù)設(shè)選項(xiàng)中就會開啟 ModuleConcatenationPlugin(也是圖二),因此平常不會特別注意到也不奇怪,因?yàn)?Webpack 都幫你做好了。

Tree Shaking 的運(yùn)作

因?yàn)?Production 會幫你打開 ModuleConcatenationPlugin ,所以待會我們實(shí)驗(yàn)的時候,要把 mode 改成 none(Webpack 文件說 none 為關(guān)掉所有優(yōu)化設(shè)置的模式)。

這邊會附上簡單的 初始化示例配置,有興趣的話,可以把它 clone 下來一起玩看看。

首先在 src 下建立一個 math.js 和 string.js,接著個別寫下一個方法做export,分別是 add 和 composeString:

const add = (a, b) => a + b;

export default { add };
const composeString = (a, b) => `${a} ${b}`;

export default { composeString };

打開 src 下的 index.js,把 add 和 composeString 都 import,但只使用add 方法:

import { add } from './math';
import { addString } from './string';

console.log(add(1, 2))

最后到 terminal 中執(zhí)行 npm run build 或是 webpack 做打包,打包結(jié)束后,會發(fā)現(xiàn)雖然我們只有import add 做使用,但是打包后的檔案內(nèi)容還是會有composeString:

不過這很正常,畢竟我們還沒有做任何處理,Webpack 在打包時也不曉得你哪些代碼到底有沒有用到,就沒辦法幫你把 composeString 移除。

那么到底什么樣的代碼是有用的,怎樣是沒用的呢??

最明顯的定義應(yīng)該是,如果有被執(zhí)行就代表有用到。像是上面例子的 add一樣。

有 side effect 的代碼也是被用到的。像是上方的 index.js,看起來什么方法都沒有提供,但是執(zhí)行時卻會在 console 中留下 log,除此之外,會改變執(zhí)行環(huán)境的 polyfill 也是有 side effect 的 library。

第一種情況相對容易分辨,但如果是第二種情況的話,可以選擇用 Webpack 中的 sideEffects 屬性來設(shè)置。

sideEffects

sideEffects 可以被設(shè)置為 Boolean 或是 Array,當(dāng)你把它設(shè)置為 false 的時候,代表該項(xiàng)目是不會有 sideEffects 的,也就是一律用 export 判斷是否使用。另外 sideEffects 會依賴 providedExports,用來找出項(xiàng)目中所有 export的 module:

以下是 sideEffects 的使用方式:

{
"name": "tree-shaking",
"sideEffects": false,
"version": "1.0.0",
...
}

只要在package.json中加上 sideEffects,并且將值設(shè)定為 flase,就代表該項(xiàng)目內(nèi)所有的代碼都沒有 side effect,因此 Webpack 在打包的時候,就可以把沒有用到的 export 代碼給移除。

加上 sideEffects 后打包,就不會看到 composeString 在結(jié)果裡了:

那現(xiàn)在我們再到 src 中建立另一個polyfill.js,在ployfill.js 里為 Array 建立自定義的方法,再把它 import 到index.js 中:

index.js

import './polyfill';
import { add } from './math';
import { addString } from './string';

console.log([].customMethod());

**polyfill.js **

Array.prototype.customMethod = () => {
console.log('customMethods');
};

如果我們?nèi)ゴ虬戏降拇a,polyfill.js 會因?yàn)闆]有任何 export,所以不會被providedExports 抓到,也就不會被打包到 Production,這會導(dǎo)致項(xiàng)目如果有使用到 Array 的 customMethod,在執(zhí)行時就會出錯。面對這種情況,就必須要在 sideEffects 屬性中告知,polyfill.js 是有 side effect 的。設(shè)置方法如下:

{
"name": "tree-shaking",
"sideEffects": ["./src/polyfill.js"],
"version": "1.0.0",
...
}

如此一來,polyfill.js 就會直接被打包了:

最后要注意兩件事情:

如果各位的項(xiàng)目中也有 import.css 樣式來用的話,也記得要將 .css 結(jié)尾的文件名放到 sideEffects,例如 sideEffects: ["*.css"]。

在webpack.config.js 裡的 optimization 也有 sideEffects,但在這裡設(shè)置的值是針對 node_modules 中的。

useExported

useExported 的作用和 sideEffects 都是用來判斷是否該移除代碼,但根據(jù) Webpack 文件內(nèi)的說明,useExported 才是真正的 Tree Shaking:

usedExports 會使用 terser 判斷代碼有沒有side effect,如果沒有用到,又沒有side effect 的話,就會在打包時替它標(biāo)記上unused harmony,并在minify(用 Uglifyjs 或其他工具)的時候移除。

在測試 usedExports 之前,先到math.js 裡加入 square 并 export:

const add = (a, b) => a + b;

const square = (a, b) => a * b;

export { add, square };

接下來到 webpack.config.js 中加入optimization.usedExports:

module.exports = {
...
optimization: {
usedExports: true,
}
};

然后對項(xiàng)目進(jìn)行打包,就會發(fā)現(xiàn)僅僅是 export,但沒有使用的 square 會被標(biāo)記上 unused harmony export:

接著我們使用 uglifyjs-webpack-plugin,把沒有用到的 square 從樹上搖晃下來:

npm install -d uglifyjs-webpack-plugin

webpack.config.js的設(shè)置如下:

const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

module.exports = {
...
optimization: {
usedExports: true,
minimize: true,
minimizer: [
new UglifyJsPlugin({
uglifyOptions: {
compress: { unused: true },
mangle: false,
output: {
beautify: true
}
},
})
],
}
};

設(shè)置完 minimizer 后,再打包一次,就能看見 square 已經(jīng)被移除了:

usedExports 與 sideEffects 不同的是,usedExports 可以以陳述句為單位去判斷是否有 side effect,但是 sideEffects 可以讓 Webpack 在打包的時候,直接略過一整個文件,只要是出現(xiàn)在 sideEffect 裡的文件就是直接打包,也不用透過 terser 評估副作用。

總結(jié)

Tree Shaking 只能在static structure使用,如果項(xiàng)目中的 babel 會將static structure 編譯成dynamic structure 的話,要另外設(shè)置。

使用 sideEffects 時,要寫在package.json,如果是要對第三方函式庫優(yōu)化,要寫在 webpack.config.js裡的 optimization。

usedExports 才是 Tree Shacking,使用時會自動判斷沒使用的代碼,并標(biāo)記 unused harmony 的注解,要移除的話要另外使用 minify。

作者:神Q超人 譯者:前端小智 來源:medium

原文:https://medium.com/starbugs/%E7%B2%BE%E6%B96%E7%9A%84%E6%89%93%E5%8C%85-webpack-%E7%9A%84-tree-shaking-ad39e185f284


責(zé)任編輯:武曉燕 來源: ·前端小智
相關(guān)推薦

2021-06-28 07:01:50

Webpack 前端Tree shakin

2021-08-26 10:30:29

WebpackTree-Shakin前端

2022-06-01 12:04:02

項(xiàng)目Webpack

2025-01-13 00:00:00

2025-05-13 08:00:00

2022-05-03 20:48:17

Webpackcommonjsesmodule

2021-12-24 08:01:44

Webpack優(yōu)化打包

2021-12-25 22:29:04

WebpackRollup 前端

2021-10-12 09:52:30

Webpack 前端多進(jìn)程打包

2020-07-10 12:06:28

WebpackBundleless瀏覽器

2024-05-27 00:00:01

2021-12-16 22:02:28

webpack原理模塊化

2021-06-28 05:59:17

Webpack 前端打包與工程化

2022-03-08 09:16:20

webpack前端開發(fā)

2021-10-11 07:55:42

瀏覽器語法Webpack

2015-06-11 11:18:04

友盟精準(zhǔn)推送

2023-01-04 08:33:31

Linuxtree命令

2022-06-10 09:30:59

IBM

2022-08-26 13:24:03

version源碼sources

2021-08-07 07:23:08

Webpack中間件模型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

欧美va天堂在线| 欧美成人福利| 久久亚洲精精品中文字幕早川悠里 | 欧美伦理片在线看| 九七久久人人| 99热这里都是精品| 国产精品情侣自拍| 九九免费精品视频| 国产欧美日韩精品一区二区三区| 欧美精品高清视频| av免费播放网址| 免费在线看黄色| 97久久精品人人做人人爽50路| 国产精品视频地址| 国偷自拍第113页| 亚洲午夜精品一区 二区 三区| 亚洲男人的天堂网站| 五月天激情播播| 午夜日韩成人影院| 亚洲一区二区三区四区不卡 | 999成人网| 亚洲精品一区二区网址 | 99久精品国产| 99久久精品无码一区二区毛片| 亚洲欧美日韩激情| 亚洲高清电影| 色综合天天狠天天透天天伊人| 最近中文字幕免费| 亚洲区小说区| 亚洲国产高清高潮精品美女| 亚洲国产日韩在线一区| 99riav视频一区二区| 色综合久久综合网97色综合| 人妻av无码专区| h片在线免费观看| 国产精品入口麻豆原神| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 久久久久女教师免费一区| 国产成人精品视频免费| 小说区图片区色综合区| 亚洲成人av片在线观看| 中国免费黄色片| 一区二区三区国产好| 7777女厕盗摄久久久| 伊人国产在线视频| 成人在线观看免费视频| 91福利视频久久久久| 欧美 激情 在线| 亚洲一区站长工具| 欧美视频在线观看免费网址| 水蜜桃色314在线观看| 大香伊人久久| 欧美日韩精品在线| 久草资源站在线观看| 成人观看网址| 亚洲一区二区在线免费观看视频| 日本天堂免费a| 俺来也官网欧美久久精品| 亚洲愉拍自拍另类高清精品| 99久久免费观看| 国产理论电影在线| 欧美视频在线视频| 精品这里只有精品| 欧美日韩大片| 欧美日韩国产一区二区三区地区| 成年网站免费在线观看| 欧美成人精品午夜一区二区| 日韩欧美的一区二区| 亚洲成年人av| 天海翼精品一区二区三区| 亚洲欧美综合图区| 中国美女黄色一级片| 亚洲综合婷婷| 97久久精品人人澡人人爽缅北| 九九精品免费视频| 日韩av一区二区三区| 成人免费淫片aa视频免费| www.天天干.com| 99国产麻豆精品| 日韩精品在在线一区二区中文| 免费在线观看av网站| 成人爽a毛片免费啪啪动漫| 国产在线一二三| 不卡在线观看av| 久久精品国产99精品国产亚洲性色| 青草久久伊人| 一色桃子久久精品亚洲| 国产精品三级一区二区| 在线视频超级| 欧美日韩不卡在线| 99精品一区二区三区无码吞精 | 好吊色欧美一区二区三区| 男女视频在线观看免费| 国产精品久久看| 三上悠亚久久精品| 欧美天堂一区二区| 欧美精品一区二区三区蜜桃视频 | 98精品视频| 97精品伊人久久久大香线蕉| 中文字幕一区2区3区| 国产成人a级片| 日韩欧美国产二区| 黄色成人在线网| 欧美日韩中字一区| 好吊色视频一区二区三区| 久久综合电影| 欧美在线亚洲在线| 精品久久久免费视频| 久久久精品天堂| 日本免费a视频| 久久av日韩| 亚洲女成人图区| 二区三区四区视频| 噜噜爱69成人精品| 国产精品精品软件视频| 欧美精品videos另类| 欧美日韩加勒比精品一区| 永久免费看片在线观看| 精品一区二区三| 欧美中文字幕在线| 成人爽a毛片一区二区| 国产精品高潮呻吟| 777米奇影视第四色| 在这里有精品| 不卡av电影在线观看| 亚洲精品国产欧美在线观看| 97se亚洲国产综合自在线不卡| 一本大道东京热无码aⅴ| a∨色狠狠一区二区三区| 精品视频在线播放| 亚洲国产精品午夜在线观看| 国产精品一区一区| 日韩视频在线免费播放| 在线一区视频观看| 亚洲视频网站在线观看| 五月激情六月丁香| 91免费视频网址| 国产老熟妇精品观看| 亚洲精品高潮| 欧美区在线播放| 国产丰满美女做爰| 亚洲婷婷综合久久一本伊一区| 嫩草影院国产精品| 国产一区二区三区四区二区 | 国产日韩亚洲欧美在线| 欧美在线在线| 欧美国产日本高清在线| 国产高清免费观看| 亚洲最新视频在线观看| 久久av一区二区三| 亚洲国产国产亚洲一二三| 国产成人看片| 国产网站在线| 亚洲精选中文字幕| 国产一级一级国产| 国产欧美va欧美不卡在线| 久久久精品三级| 成人一区二区| 91欧美激情另类亚洲| a视频在线播放| 精品欧美一区二区在线观看| 日本一区二区不卡在线| av男人天堂一区| 亚洲国产精品久久久久爰色欲| 久久91精品| 国产精品一区二区三区毛片淫片| 五月香视频在线观看| 91精品福利在线一区二区三区| 国产盗摄一区二区三区在线| 懂色av中文一区二区三区| 欧美一级欧美一级| 曰本一区二区三区视频| 国产精品日韩欧美| 制服丝袜在线播放| 亚洲国产精品嫩草影院久久| 一级成人黄色片| 国产精品午夜在线观看| 国产乱女淫av麻豆国产| 国产综合自拍| 日韩av电影免费在线观看| 国产999精品在线观看| 欧美极品少妇与黑人| 美女欧美视频在线观看免费| 欧美精品xxxxbbbb| 日本三级欧美三级| 国产欧美va欧美不卡在线| 丰满人妻一区二区三区大胸| 国产精品久久久久9999高清| 亚洲精品中字| 激情av综合| 国产精品网红福利| 123区在线| 在线免费观看羞羞视频一区二区| wwwxxxx国产| 日本久久一区二区三区| 超碰在线国产97| 国产午夜精品久久久久久免费视| 中文av字幕在线观看| 国产精品夜夜夜| 国产精品波多野结衣| 国产精品欧美在线观看| 亚洲自拍偷拍区| 亚洲www啪成人一区二区| 欧美第一淫aaasss性| 在线日本视频| 日韩电影免费在线观看中文字幕| 一女二男一黄一片| 日韩欧美视频一区二区三区| 青娱乐在线视频免费观看| 国产欧美日韩亚州综合 | 久久久三级国产网站| 日本成人在线免费| 日本va欧美va瓶| 国产素人在线观看| 中文在线日韩| 亚洲a∨一区二区三区| 欧美人妖在线观看| 亚洲一区二区自拍| 精品福利在线| 国产成人精品999| 女厕盗摄一区二区三区| 欧美日韩成人免费| 求av网址在线观看| 一区二区三区久久精品| 日本又骚又刺激的视频在线观看| 欧美成人艳星乳罩| 99久久婷婷国产一区二区三区| 日本精品免费观看高清观看| 天天干天天干天天干天天| 亚洲午夜一区二区| 久久亚洲av午夜福利精品一区| 《视频一区视频二区| 九九热久久免费视频| 中文字幕电影一区| 网爆门在线观看| 国产拍欧美日韩视频二区| 亚洲天堂网一区二区| 99久久久国产精品| 久久久老熟女一区二区三区91| 大陆成人av片| zjzjzjzjzj亚洲女人| 成人晚上爱看视频| 亚洲精品无码一区二区| 成人免费视频播放| 日本黄色录像片| 91麻豆蜜桃一区二区三区| 国产高清自拍视频| 91网站黄www| av女人的天堂| 国产精品网站一区| 一起操在线播放| 一区二区三区视频在线观看 | 91豆麻精品91久久久久久| 无码无套少妇毛多18pxxxx| 在线免费观看一区| 在线播放国产一区| 91精品婷婷国产综合久久| av在线资源观看| 日韩精品一区二区三区中文不卡| 国产www免费观看| 精品国产青草久久久久福利| 日日夜夜精品免费| 亚洲小视频在线| 免费黄网站在线| 欧美肥臀大乳一区二区免费视频| 福利在线导航136| 国产91精品久久久久久久| 欧美va在线观看| 成人免费看吃奶视频网站| 一区二区三区四区高清视频 | 国产精品夜间视频香蕉| 天天综合91| 国产欧美日本在线| 精品久久一区| 国产女人18毛片| 国产精品亚洲产品| 污污的视频免费| 成人av免费在线观看| 人人人妻人人澡人人爽欧美一区| 国产精品久久久久精k8| 久久精品第一页| 一本一道久久a久久精品综合蜜臀| 中文在线a天堂| 精品国产乱码久久久久久闺蜜| 欧洲天堂在线观看| 久久精品视频va| 少妇视频在线观看| 成人激情在线播放| 少妇精品导航| 熟妇熟女乱妇乱女网站| 国产日韩欧美一区在线| 成人不卡免费视频| 91免费在线看| 九九热精品在线观看| 欧美性猛交xxxxx免费看| 国产伦一区二区| 精品呦交小u女在线| 91三级在线| 国产成人97精品免费看片| 97久久超碰| 一区二区三区四区免费视频| 99国产精品| 欧美人与性动交α欧美精品| 国产日韩欧美精品电影三级在线 | 国产精品a久久久久| 免费看a级黄色片| 成人av影院在线| 免费中文字幕在线| 欧美网站大全在线观看| 五月婷婷免费视频| 欧美老女人性视频| 国产精品麻豆成人av电影艾秋| 久久99精品久久久水蜜桃| 中文字幕一区二区av| 99视频精品免费| 91日韩精品一区| 久久久久久久久久久久国产| 欧美日韩激情一区| 国产九色在线| 欧美在线一级视频| 任你躁在线精品免费| 日本免费a视频| 国产成人在线视频网站| 青青青视频在线播放| 一本高清dvd不卡在线观看| 欧美一级一区二区三区| 欧美老少配视频| 国产一区二区三区| 一本一道久久久a久久久精品91| 久久蜜桃精品| 搡老熟女老女人一区二区| 婷婷中文字幕一区三区| 亚洲欧美激情国产综合久久久| 欧美成人在线影院| 99久热在线精品视频观看| 亚洲精品中文综合第一页| 日本不卡高清视频| 国产第一页精品| 欧美日韩免费一区二区三区| www.在线视频.com| 国产精品v日韩精品| 精品国产中文字幕第一页 | 欧美a级理论片| 女人十八毛片嫩草av| 91福利精品第一导航| caoporn国产精品免费视频| 国产精品久久久久久久久影视| 欧美精品momsxxx| 麻豆一区二区三区视频| 国产精品色在线观看| 国产精品嫩草影院桃色| 久久这里只有精品99| 国产一区一区| 日韩一级特黄毛片| 成人av电影免费在线播放| 国产乡下妇女做爰毛片| 日韩经典中文字幕在线观看| 少妇淫片在线影院| 日韩免费毛片| 激情久久久久久久久久久久久久久久| 情侣偷拍对白清晰饥渴难耐| 91精品国产欧美一区二区成人| 性欧美videoshd高清| 国产乱码精品一区二区三区卡 | 91po在线观看91精品国产性色| 另类尿喷潮videofree| 久久久久久久激情| 国产精品素人一区二区| 国产高清在线观看视频| 91精品国产91久久久久久久久| 亚洲人成网站77777在线观看| 国产成人av影视| 中文字幕一区av| 韩国中文字幕hd久久精品| 日本久久91av| 91精品推荐| 三叶草欧洲码在线| 欧美日本在线一区| f2c人成在线观看免费视频| 日韩高清国产一区在线观看| 韩国精品在线观看| 日本三级一区二区| xx视频.9999.com| 欧美大胆视频| 中日韩av在线播放| 欧美日韩国产中文精品字幕自在自线 | 国产美女久久久久| 欧美日韩精品区| 久久久成人精品视频| 欧美美女在线直播| 999热精品视频| 91成人国产精品| 欧美性video| 亚洲精品欧美精品| 成人97人人超碰人人99| 在线播放亚洲精品| 欧美怡红院视频一区二区三区| 久久久久国产精品| 日韩av在线看免费观看| 日韩欧美aaaaaa|