Tree-Shaking?機(jī)制快速掌握
寫在前面
最近在讀霍老師的《Vue.js設(shè)計(jì)與實(shí)現(xiàn)》,感覺(jué)收獲很多,由于霍老師是官方Vue
維護(hù)成員,會(huì)從很通俗易懂的角度去講Vue
的實(shí)現(xiàn)細(xì)節(jié)。而不是按照源碼死講解,很不錯(cuò),推薦給大伙!
直奔主題
Tree-Shaking
的本質(zhì)其實(shí)就是消除無(wú)用代碼也就是dead code
,減小打包后文件,不太清楚dead code
概念的不用擔(dān)心,下面會(huì)講到。Tree-Shaking
是打包構(gòu)建工具常用的優(yōu)化手段。在我們?nèi)粘5拈_(kāi)發(fā)最常使用的,可能就是ESM
的使用,會(huì)觸發(fā)默認(rèn)的Tree-Shaking
機(jī)制并對(duì)無(wú)效代碼進(jìn)行處理。
//utils.js const str = "Hello Word"; export function fun1(){ console.log(str); } export function fun2(){ console.log(str); } //index.js import { fun2 } from 'utils.js'
這里的fun1
并不會(huì)被打包到最后生成 build 文件,證明fun1
滿足了dead code
的條件,從而觸發(fā)了Tree-Shaking
機(jī)制。
dead code 條件
1.代碼不會(huì)被執(zhí)行,不可到達(dá)
2.代碼執(zhí)行的結(jié)果不會(huì)被用到
3.代碼只會(huì)影響死變量(只寫不讀)
這里有一個(gè)例外 就是js
由于是動(dòng)態(tài)類型的語(yǔ)言 很難從純編譯下解析到當(dāng)前是否是dead code
如:
//utils.js function fun1(){ console.log(str); } fun1.prototype.run = function(){ console.log("run"); } Array.prototype.stop = function(){ console.log("stop"); } export const fun1;
雖然沒(méi)有被調(diào)用,但是在打包后生成的build
文件中依舊會(huì)包含這段代碼,是因?yàn)闊o(wú)法靜態(tài)解析這段代碼是否真正無(wú)用,如果刪除掉了utils.js
會(huì)導(dǎo)致Array
原型上方法也失效。所以,這就引出了另一個(gè)很重要的概念就是,副作用,如果一個(gè) 函數(shù)調(diào)用會(huì)產(chǎn)生副作用,那么就不能將其移除。什么是副作用?簡(jiǎn)單 地說(shuō),副作用就是,當(dāng)調(diào)用函數(shù)的時(shí)候會(huì)對(duì)外部產(chǎn)生影響
當(dāng)我們遇到打包工具無(wú)法靜態(tài)解析的代碼,可以通過(guò)打包工具的另一個(gè)機(jī)制去做手動(dòng)告知
import {fun1} from './utils' /*#__PURE__*/ fun1()
這里的/*#__PURE__*/
就是告知打包工具 這段代碼的調(diào)用不會(huì)產(chǎn)生副作用,你隨便刪,設(shè)置過(guò)完后再次重新打包就會(huì)發(fā)現(xiàn),Array
原型上聲明stop
就不包含在內(nèi)了!
知道了這些,那我們?nèi)粘?yīng)該如何利用Tree-Shaking
機(jī)制呢?
如在我們的代碼中,封裝根據(jù)開(kāi)發(fā)環(huán)境,設(shè)置動(dòng)態(tài)api
、不同調(diào)試log
??梢酝ㄟ^(guò)打包工具的預(yù)構(gòu)建常量,配合判斷,如果環(huán)境不是測(cè)試環(huán)境,會(huì)被檢測(cè)為dead code
從而移出構(gòu)建最終的構(gòu)建文件中。實(shí)現(xiàn)優(yōu)化打包體積,并且不會(huì)影響我們開(kāi)發(fā)的環(huán)境。
//webpack.config.js new webpack.DefinePlugin({ __DEV_OPTIONS_: JSON.stringify(true) }) //index.js if(__DEV_OPTIONS_){ //初始化開(kāi)發(fā)環(huán)境下的相關(guān)配置 initLog(); setApi(); }
最后
以上就是本篇文章的全部?jī)?nèi)容了!學(xué)習(xí)思路來(lái)自《Vue.js設(shè)計(jì)與實(shí)現(xiàn)》分享給大家!
更多關(guān)于Tree-Shaking 機(jī)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue通過(guò)路由實(shí)現(xiàn)頁(yè)面間參數(shù)的傳遞
這篇文章主要介紹了Vue通過(guò)路由實(shí)現(xiàn)頁(yè)面間參數(shù)的傳遞,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04vue3容器布局和導(dǎo)航路由實(shí)現(xiàn)示例
這篇文章主要為大家介紹了vue3容器布局和導(dǎo)航路由實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06vue實(shí)現(xiàn)頁(yè)面內(nèi)容禁止選中功能,僅輸入框和文本域可選
今天小編就為大家分享一篇vue實(shí)現(xiàn)頁(yè)面內(nèi)容禁止選中功能,僅輸入框和文本域可選,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11vue.js 2.*項(xiàng)目環(huán)境搭建、運(yùn)行、打包發(fā)布的詳細(xì)步驟
這篇文章主要介紹了vue.js 2.*項(xiàng)目環(huán)境搭建、運(yùn)行、打包發(fā)布的詳細(xì)步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05Element?UI表單驗(yàn)證規(guī)則動(dòng)態(tài)失效問(wèn)題的解決辦法
這篇文章主要給大家介紹了關(guān)于Element?UI表單驗(yàn)證規(guī)則動(dòng)態(tài)失效問(wèn)題的解決辦法,Element UI提供了強(qiáng)大的表單驗(yàn)證功能,可以輕松地對(duì)表單進(jìn)行驗(yàn)證,需要的朋友可以參考下2023-09-09vue下axios攔截器token刷新機(jī)制的實(shí)例代碼
這篇文章主要介紹了vue下axios攔截器token刷新機(jī)制的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01vue+golang實(shí)現(xiàn)上傳微信頭像功能
這篇文章主要介紹了vue+golang實(shí)現(xiàn)上傳微信頭像功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-10-10解決vue動(dòng)態(tài)路由異步加載import組件,加載不到module的問(wèn)題
這篇文章主要介紹了解決vue動(dòng)態(tài)路由異步加載import組件,加載不到module的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07