webpack打包優(yōu)化

一.可視化 webpack 輸出文件的大小

添加webpack-bundle-analyzer

yarn add webpack-bundle-analyzer --dev

可視化只在項目本地打包的時候,在測試或者語法或者生產(chǎn)打包的時候,不應(yīng)該添加可視化配置怠惶,因此需用cross-env配置可視化環(huán)境變量

package.json scripts 添加:

"analyze": "cross-env TC_NODE_ENV=analyze react-app-rewired build",

webpack配置文件:

const{BundleAnalyzerPlugin}=require('webpack-bundle-analyzer');if(process.env.TC_NODE_ENV==='analyze'){config.plugins.push(newBundleAnalyzerPlugin(),);}

運行 yarn run analyze 即可看到,剩下的事情就是想辦法減小這些包的體積

二.在不改動業(yè)務(wù)代碼的情況下家制,減小公共依賴

生產(chǎn)環(huán)境啟用壓縮等插件,去除不必要插件

webpack 開啟 gzip 壓縮

拆分業(yè)務(wù)代碼與第三方庫及公共模塊

按需加載

1 壓縮

uglifyjs-webpack-plugin

gzip壓縮:比較耗性能泡一,所以在開發(fā)環(huán)境并不開啟颤殴,只在生產(chǎn)環(huán)境開啟:

if(env==='production'){config.plugins.push(newUglifyESPlugin({uglifyOptions:{compress:{warnings:false,drop_console:true,collapse_vars:true,reduce_vars:true,},output:{beautify:false,comments:false,},},sourceMap:true,}),// gzipnewCompressionPlugin({filename:'[path].gz[query]',algorithm:'gzip',test:newRegExp('\\.('+['js','css'].join('|')+')$'),threshold:10240,minRatio:0.8,}));}

2.這些包不可能不引入,但是他們都是全局依賴的鼻忠,可以使用瀏覽器自己的緩存來實現(xiàn)不重復(fù)加載涵但。將項目中需要的一些公共依賴包,并且不常變動的,單獨取出贤笆,不再每次都打包編譯(如React蝇棉,Redux等)。而是通過使用 script 標(biāo)簽形式 cdn 引入芥永,這樣在有緩存的情況下篡殷,這些資源均走緩存,不必加載埋涧。但如 antd 這樣的庫板辽,整個包體積較大,庫文件也會按需加載棘催,不必單獨取出劲弦,并且里面可能會有 bug,需要更新醇坝。

2.1 cdn 引入方式

找到對應(yīng)的cdn加速服務(wù)邑跪,如在https://www.bootcdn.cn/中找,配置 webpack呼猪,使其打包的時候不在將這些資源打包:

config.externals={'react':'React','react-dom':'ReactDOM',}

鍵表示 require 或者 import 時候的字符串画畅,值表示的當(dāng)前環(huán)境下的變量,比如引入 React 之后宋距,React 被作為全局對象轴踱,webpack 就回去尋找React對象。

2.2 公共模塊CommonsChunkPlugin

why? 路由按需加載之后谚赎,每個頁面的js有相同的包引入淫僻,導(dǎo)致每個js文件都有重復(fù)的代碼,抽離這部分代碼到公共模塊壶唤。

在webpack配置文件中entry加入雳灵,例:

plugin加入:

newwebpack.optimize.CommonsChunkPlugin({name:'vendor',filename:'[name].[hash].js',minChunks:({resource})=>(resource&&resource.indexOf('node_modules')>=0&&resource.match(/\.js$/)),}),// 完成打包并發(fā)送到瀏覽器時,會在運行時通過 Manifest 來解析和加載模塊newwebpack.optimize.CommonsChunkPlugin({name:'manifest',filename:'[name].[hash].js',minChunks:Infinity,}),newwebpack.optimize.CommonsChunkPlugin({name:'main',async:'vendor-async',children:true,minChunks:({resource},count)=>(resource&&resource.indexOf('node_modules')>=0&&resource.match(/\.js$/)&&count>=2),}),newwebpack.optimize.CommonsChunkPlugin({name:'main',async:'common',minChunks:(module,count)=>(count>=2),}),

2.3 DLLPlugin

DLLPlugin 是能把第三方代碼完全分離開闸盔,即每次只打包項目自身的代碼细办。Dll這個概念是借鑒了Windows系統(tǒng)的dll,一個dll包蕾殴,就是一個純純的依賴庫,它本身不能運行岛啸,是用來給你的app引用的钓觉。

新建 webpack.config.dll.js

constpath=require('path');constwebpack=require('webpack');constCompressionPlugin=require('compression-webpack-plugin');module.exports={entry:{vendor:['echarts'],},output:{path:path.resolve('./public/static'),filename:'[name].dll.js',library:'[name]_[hash]',},plugins:[newwebpack.DllPlugin({path:path.resolve('./public/static','[name]-manifest.json'),name:'[name]_[hash]',}),newwebpack.optimize.UglifyJsPlugin({compress:{warnings:false,},}),newCompressionPlugin({filename:'[path].gz[query]',algorithm:'gzip',test:newRegExp('\\.('+['js','css'].join('|')+')$'),threshold:10240,minRatio:0.8,}),],};

在webpcak配置文件中加入

newwebpack.DllReferencePlugin({manifest:require('./public/static/vendor-manifest.json')})

在入口html文件中引入 vendor.dll.js

<scripttype="text/javascript"src="/static/vendor.dll.js"></script>

package.json加入

"build:dll":"webpack --config webpack.dll.config.js"

打包的時候先執(zhí)行 npm run build:dll,會在打包目錄下生成 vendor-manifest.json 文件與 vendor.dll.js 文件坚踩。

再執(zhí)行npm run build

注意:npm run build:dll 為開發(fā)人員本地打包vendor荡灾,打包完成之后會在/public/static文件下生成vendor.dll.js、vendor.dll.js.gz和vendor-manifest.json三個文件,線上打包不必在執(zhí)行此命令批幌,如果vendor沒有更新础锐,不必在 npm run build:dll,利用瀏覽器緩存荧缘。

已加入cdn的不必再配置vendor皆警。

2.4 抽離css樣式(extract-text-webpack-plugin)

constExtractTextPlugin=require('extract-text-webpack-plugin');newExtractTextPlugin({filename:'static/css/[name].[contenthash:8].css',allChunks:true,}),

3.按需引入

如antd、lodash截粗、echarts都有按需加載的方式信姓,可以去官方看

4.按需加載

思路:import(*).then(),返回一個Promise绸罗,加載成功后可以在then方法中獲取加載的內(nèi)容意推,Webpack內(nèi)置對import( *)語句的支持。

asyncComponent.js

importReactfrom'react';exportdefaultfunctionasyncComponent(importComponent){classAsyncComponentextendsReact.Component{constructor(props){super(props);this.state={Component:null,};}asynccomponentDidMount(){const{default:Component}=awaitimportComponent();this.setState({Component,});}render(){const{Component}=this.state;returnComponent?<Component{...this.props}/>:null;}}returnAsyncComponent;}

路由引入方式:

AsyncComponent(()=>import('../containers/Home/Home'))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末珊蟀,一起剝皮案震驚了整個濱河市菊值,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌育灸,老刑警劉巖腻窒,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異描扯,居然都是意外死亡定页,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門绽诚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來典徊,“玉大人,你說我怎么就攤上這事恩够∽渎洌” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵蜂桶,是天一觀的道長儡毕。 經(jīng)常有香客問我,道長扑媚,這世上最難降的妖魔是什么腰湾? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮疆股,結(jié)果婚禮上费坊,老公的妹妹穿的比我還像新娘。我一直安慰自己旬痹,他們只是感情好附井,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布讨越。 她就那樣靜靜地躺著,像睡著了一般永毅。 火紅的嫁衣襯著肌膚如雪把跨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天沼死,我揣著相機與錄音着逐,去河邊找鬼。 笑死漫雕,一個胖子當(dāng)著我的面吹牛滨嘱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浸间,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼太雨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了魁蒜?” 一聲冷哼從身側(cè)響起囊扳,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兜看,沒想到半個月后锥咸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡细移,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年搏予,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弧轧。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡雪侥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出精绎,到底是詐尸還是另有隱情速缨,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布代乃,位于F島的核電站旬牲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏搁吓。R本人自食惡果不足惜原茅,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望堕仔。 院中可真熱鬧擂橘,春花似錦、人聲如沸贮预。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仿吞。三九已至滑频,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唤冈,已是汗流浹背峡迷。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留你虹,地道東北人绘搞。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像傅物,于是被迫代替她去往敵國和親夯辖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容