webpack的tree shaking的實(shí)現(xiàn)方法
webpack的tree shaking
util.js
export const a = () => { console.log("a123456方法"); }; export const b = () => { console.log("b123456方法"); };
main.js
import {a} from './utils'; a();
sideEffects
一般而言,上述代碼,在 webpack 進(jìn)行 tree shaking 能夠不打包 function b 的代碼,這是因?yàn)?nbsp;webpack 對(duì)代碼進(jìn)行了分析, b 沒(méi)有引用不會(huì)打包。
但是npm包中,通過(guò)這種方式去引用,你會(huì)發(fā)現(xiàn) tree shaking 并沒(méi)有生效, 這是因?yàn)閣ebpack無(wú)法識(shí)別你的代碼是否存在副作用,故而無(wú)法執(zhí)行tree shaking ,解決方法是給你的npm包 package.json 加上 sideEffects: false ,告訴webpack是無(wú)副作用的, webpack 可以放心處理。
什么是副作用( side effect ),即你的函數(shù)會(huì)對(duì)外部變量造成影響,比如
function a() {} a.location = window.location a.location.hash = 'll'
這就是一個(gè)副作用函數(shù),所以編寫(xiě)純函數(shù)
es6
如果你的npm包使用了es6的特性,比如類,最終你打包出來(lái)的代碼只打包了成了es5的,那么恭喜你,基本上你的npm包和 tree shaking 無(wú)緣了。
es6轉(zhuǎn)es5(babel),會(huì)產(chǎn)生大量的副作用,所以基本上大部分包都提供es6版本的代碼, tree shaking 交給你本地的webpack去處理。
當(dāng)然也不是完全沒(méi)有辦法,antd老大哥就開(kāi)發(fā)了一個(gè)babel-plugin-import,實(shí)現(xiàn)精確引用的代碼的方式,但是你必須將每個(gè)模塊單獨(dú)分成一個(gè)文件。
總結(jié)
基本上tree shaking的解決方法就是導(dǎo)出es6模塊,同時(shí)標(biāo)明自己是無(wú)副作用的,如果加上babel-plugin-import就更完美了
rollup的一個(gè)提案蠻有趣的!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ExtJS實(shí)現(xiàn)文件下載的方法實(shí)例
這篇文章介紹了ExtJS實(shí)現(xiàn)文件下載的方法實(shí)例,有需要的朋友可以參考一下2013-11-11setTimeout()與setInterval()方法區(qū)別介紹
計(jì)時(shí)器setTimeout()和setInterval()兩個(gè)都是js的計(jì)時(shí)功能的函數(shù)兩個(gè)有些區(qū)別,下面為大家簡(jiǎn)單介紹下,希望對(duì)大家有所幫助2013-12-12Js,alert出現(xiàn)亂碼問(wèn)題的解決方法
Js,alert出現(xiàn)亂碼問(wèn)題的解決方法,需要的朋友可以參考一下2013-06-06分享10個(gè)優(yōu)化代碼的CSS和JavaScript工具
如果你想在保持文件的時(shí)候或執(zhí) 行的階段lint代碼,那么linting工具也可以如你所愿。這取決于個(gè)人的選擇。如果你正在找尋用于CSS和JavaScript最好的 linting工具,那么請(qǐng)繼續(xù)閱讀2016-05-05KnockoutJS 3.X API 第四章之事件event綁定
event綁定即為事件綁定,即當(dāng)觸發(fā)相關(guān)DOM事件的時(shí)候回調(diào)函數(shù),這篇文章主要介紹了KnockoutJS 3.X API 第四章之事件event綁定的相關(guān)知識(shí),感興趣的朋友一起看看吧2016-10-10js中的關(guān)聯(lián)數(shù)組與普通數(shù)組詳解
下面小編就為大家?guī)?lái)一篇js中的關(guān)聯(lián)數(shù)組與普通數(shù)組詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07js重寫(xiě)alert控件(適合學(xué)習(xí)js的新手朋友)
這篇文章主要介紹js重寫(xiě)alert控件的過(guò)程比較適合學(xué)習(xí)js的新手朋友,需要的朋友可以參考下2014-08-08