『壹』 如何解決webpack打包後,dist文件過大的問題
去除不必要的插件
剛開始用 webpack 的時候,開發環境和生產環境用的是同一個 webpack 配置文件,導致生產環境打包的 JS 文件包含了一大堆沒必要的插件,比如 HotMoleReplacementPlugin, NoErrorsPlugin... 這時候不管用什麼優化方式,都沒多大效果。所以,如果你打包後的文件非常大的話,先檢查下是不是包含了這些插件。
提取第三方庫
像 react 這個庫的核心代碼就有 627 KB,這樣和我們的源代碼放在一起打包,體積肯定會很大。所以可以在 webpack 中設置
{
entry: {
bundle: 'app'
vendor: ['react']
}
plugins: {
new webpack.optimize.CommonsChunkPlugin('vendor', 'vendor.js')
}
}
這樣打包之後就會多出一個 vendor.js 文件,之後在引入我們自己的代碼之前,都要先引入這個文件。比如在 index.html 中
<script src="/build/vendor.js"></script>
<script src="/build/bundle.js"></script>
除了這種方式之外,還可以通過引用外部文件的方式引入第三方庫,比如像下面的配置
{
externals: {
'react': 'React'
}
}
externals 對象的 key 是給 require 時用的,比如 require('react'),對象的 value 表示的是如何在 global 中訪問到該對象,這里是 window.React。這時候 index.html 就變成下面這樣
<script src="//cdn.bootcss.com/react/0.14.7/react.min.js"></script>
<script src="/build/bundle.js"></script>
當然,個人更推薦第一種方式。
代碼壓縮
webpack 自帶了一個壓縮插件 UglifyJsPlugin,只需要在配置文件中引入即可。
{
plugins: [
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
})
]
}
加入了這個插件之後,編譯的速度會明顯變慢,所以一般只在生產環境啟用。
另外,伺服器端還可以開啟 gzip 壓縮,優化的效果更明顯。
代碼分割
什麼是代碼分割呢?我們知道,一般載入一個網頁都會把全部的 js 代碼都載入下來。但是對於 web app 來說,我們更想要的是只載入當前 UI 的代碼,沒有點擊的部分不載入。
看起來好像挺麻煩,但是通過 webpack 的 code split 以及配合 react router 就可以方便實現。具體的例子可以看下 react router 的官方示例 huge apps。不過這里還是講下之前配置踩過的坑。
code split 是不支持 ES6 的模塊系統的,所以在導入和導出的時候千萬要注意,特別是導出。如果你導出組件的時候用 ES6 的方式,這時候不管導入是用 CommomJs 還是 AMD,都會失敗,而且還不會報錯!
當然會踩到這個坑也是因為我剛剛才用 NodeJS,而且一入門就是用 ES6 的風格。除了這個之外,還有一點也要注意,在生產環境的 webpack 配置文件中,要加上 publicPath
output: {
path: xxx,
publicPath: yyy,
filename: 'bundle.js'
}
不然的話,webpack 在載入 chunk 的時候,路徑會出錯。
設置緩存
開始這個小節之前,可以先看下大神的一篇文章:大公司里怎樣開發和部署前端代碼。
對於靜態文件,第一次獲取之後,文件內容沒改變的話,瀏覽器直接讀取緩存文件即可。那如果緩存設置過長,文件要更新怎麼辦呢?嗯,以文件內容的 MD5 作為文件名就是一個不錯的解決方案。來看下用 webpack 應該怎樣實現
output: {
path: xxx,
publicPath: yyy,
filename: '[name]-[chunkhash:6].js'
}
打包後的文件名加入了 hash 值
const bundler = webpack(config)
bundler.run((err, stats) => {
let assets = stats.toJson().assets
let name
for (let i = 0; i < assets.length; i++) {
if (assets[i].name.startsWith('main')) {
name = assets[i].name
break
}
}
fs.stat(config.buildTemplatePath, (err, stats) => {
if (err) {
fs.mkdirSync(config.buildTemplatePath)
}
writeTemplate(name)
})
})
手動調用 webpack 的 API,獲取打包後的文件名,通過 writeTemplate 更新 html 代碼。完整代碼猛戳 gitst。
『貳』 為什麼加了webpack自帶的代碼壓縮插件後打包就出問題了
1. 為什麼用 webpack? 他像 Browserify, 但是將你的應用打包為多個文件. 如果你的單頁面應用有多個頁面, 那麼用戶只從下載對應頁面的代碼. 當他么訪問到另一個頁面, 他們不需要重新下載通用的代碼. 他在很多地方能替代 Grunt 跟 Gulp
『叄』 請教關於webpack壓縮nodejs代碼的問題
webpack 自帶了一個壓縮插件 UglifyJsPlugin,只需要在配置文件中引入即可。
{
plugins: [
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
})
]
}
加入了這個插件之後,編譯的速度會明顯變慢,所以一般只在生產環境啟用。
就OK了。
『肆』 webpack能配置不壓縮指定文件嗎
這里說明了,如果單純使用html-webpack-plugin插件來處理html,那麼在此插件下設置minify為false,就不會壓縮html文件;但是如果使用了loader與html-webpack-plugin一起處理html,那麼html的壓縮還受loader的影響。
『伍』 如何解決webpack打包的文件體積過大的問題
兩步:
1、產品化打包一定要uglify並壓縮,這個是webpack的插件
2、server開gzip
個人測試5M-》1.5M-》500KB
『陸』 webpack 打包可以理解為多個文件的壓縮合並嗎
其實webpack最主要的用途是合理的處理了你所構建的模塊之間的依賴關系,你感覺文件變大了,是因為打包後的文件里包含了 依賴文件而不再僅僅是你寫的那些內容了
『柒』 用webpack的UglifyJsPlugin怎樣壓縮一個全是函數的js文件
lugins:
[
new
webpack.optimize.UglifyJsPlugin({
//
壓縮webpack
後生成的代碼較長時間,通常推到生產環境中才使用
compress:{
warnings:
false
}
}),
new
htmlWebpackPlugin({
//
webpack
指定目錄(package內設置)生成靜態HTML文件
title:
『捌』 webpack怎麼壓縮js
准確來說,在package.json中有一個scripts的一個配置,這個配置中中一個build:webpack -p 需要在cmd中輸入yarn run build命令,就可以進行打包壓縮編譯
『玖』 webpack設置了壓縮,html也會被壓縮,什麼參數能排除html被壓縮
這里說明了,如果單純使用html-webpack-plugin插件來處理html,那麼在此插件下設置minify為false,就不會壓縮html文件;但是如果使用了loader與html-webpack-plugin一起處理html,那麼html的壓縮還受loader的影響。
從你的描述來看,我估計是受了loader的影響了。
『拾』 webpack 如何打包html,在html中可以壓縮哪些東西如何配置
1. 安裝: html-webpack-plugin 插件完成打包
2. 命令:npm install html-webpack-plugin –save-dev
3. 配置:
引入:const HtmlWebpackPlugin = require('html-webpack-plugin');
mole.exports = {
entry: 'index.js',
output: {
path: __dirname + '/dist',
filename: 'index_bundle.js'
},
plugins: [
new HtmlWebpackPlugin({
title: 'My App',(生成的頁面標題)
filename: 'assets/admin.html',(生成的文件名)
template: 'src/assets/test.html',(原來的index.html)
minify: {
collapseWhitespace: true,
removeComments: true,
removeRendantAttributes: true,
removeScriptTypeAttributes: true,
removeStyleLinkTypeAttributes: true,
useShortDoctype: true
}
})
]
} (BY三人行慕課)