以前一直使用create-react-app
這個腳手架進行react
開發,後面因為一些自定義的配置,轉而使用webpack
搭建一套自己的腳手架。但是在使用webpack
打包之後發現,納尼?怎麼檔案這麼大???
於是研究了一下如何處理webpack
打包之後檔案太大的情況,簡單記錄下來。
首先配置全域性變數
首先,通過指定環境,告訴webpack
我們當前處於production
環境中,要按照production
的方式去打包。
//指定環境,將process.env.NODE_ENV環境與library關聯
new Webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production'),
}),
複製程式碼
優化devtool
中的source-map
.
dev-tool
提供了很多種選項,用來增強我們debug
的能力,我們熟知的有:source-map
,inline-source-map
,cheap-source-map
等等。詳細的用法可以參考
Devtool官方文件,
Devtool配置對比,
webpack sourcemap 選項多種模式的一些解釋,
https://webpack.github.io/docs/configuration.html#devtool
如果你的檔案在打包之後突然變成好幾M,那麼不用想,肯定是因為source-map
的原因。source-map
在開發階段確實很好用,除錯起來很方便,但是在生產環境下就沒必要部署了。
建議在prod
環境下關閉source-map
。
剝離css檔案,單獨打包
安裝webpack
外掛extract-text-webpack-plugin
。
npm install extract-text-webpack-plugin --save-dev
。
使用方法:
plugins:[
new ExtractTextPlugin('static/css/styles.[contenthash].css'),
]
複製程式碼
這裡使用了contenthash
,webpack
會根據內容去生成hash
值。
使用UglifyJSPlugin
壓縮。
通過UglifyJSPlugin
可以壓縮我們的*.js
檔案。
安裝方法: npm install uglifyjs-webpack-plugin --save-dev
。
用法:
UglifyJSPlugin詳細用法
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
module.exports = {
plugins: [
new UglifyJSPlugin({
parallel: 4,
uglifyOptions: {
output: {
comments: false,
beautify: false,
},
compress: {
warnings: false
},
},
cache: true,
}),
]
}
複製程式碼
提取公共依賴
使用CommonsChunkPlugin
外掛,將多個js
檔案進行提取,建立一個獨立的檔案。這個檔案包含一些共用模組,瀏這樣覽器只在剛開始的時候載入一次,便快取起來供後續使用。而不用每次訪問一個新介面時,再去載入一個更大的檔案。
entry:{
app:'./entry',
vendor:['react','other-lib'],
},
plugins:[
new Webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
}),
]
複製程式碼
開啟gzip壓縮
我們使用compression-webpack-plugin
外掛進行壓縮。
安裝:npm install compression-webpack-plugin --save-dev
。
compression-webpack-plugin 詳細用法
使用:
const CompressionPlugin = require("compression-webpack-plugin");
plugins:[
new CompressionPlugin({
asset: '[path].gz[query]', //目標資源名稱。[file] 會被替換成原資源。[path] 會被替換成原資源路徑,[query] 替換成原查詢字串
algorithm: 'gzip',//演算法
test: new RegExp(
'\\.(js|css)$' //壓縮 js 與 css
),
threshold: 10240,//只處理比這個值大的資源。按位元組計算
minRatio: 0.8//只有壓縮率比這個值小的資源才會被處理
})
]
複製程式碼
壓縮結果:
開啟html壓縮,自動新增上面生成的靜態資源
新增外掛html-webpack-plugin
安裝: npm install html-webpack-plugin --save-dev
用法:
plugins:[
new HtmlWebpackPlugin({
title: '',
template: __dirname + '/../public/index.html',
minify: {
removeComments: true,
collapseWhitespace: true,
removeRedundantAttributes: true,
useShortDoctype: true,
removeEmptyAttributes: true,
removeStyleLinkTypeAttributes: true,
keepClosingSlash: true,
minifyJS: true,
minifyCSS: true,
minifyURLs: true,
},
chunksSortMode:'dependency'
}),
]
複製程式碼