webpack@v4升級踩坑(小結(jié))
之前看到各大公眾號都在狂推 webpack 新版發(fā)布的相關(guān)內(nèi)容,之前就嘗試了升級,由于部分插件的原因,未能成功,現(xiàn)在想必過了這么久已經(jīng)可以了,今天就來試一下在我的項目中升級會遇到哪些坑。
查閱更新日志
在安裝更新之前,先大致瀏覽了一下更新日志,對大部分用戶來說遷移上需要注意的應(yīng)該就是這些點:
- 在命令行界面運行打包指令需要安裝
webpack-cli; - 打包需要指定打包模式
productionordevelopment,在不同模式下會添加不同的默認(rèn)配置,webpack.DefinePlugin插件的process.env.NODE_ENV的值不需要再定義,將根據(jù)模式自動添加; - 不再需要在
plugin中設(shè)置new webpack.optimize.UglifyJsPlugin,只需要在配置中設(shè)置開關(guān)即可,并且production模式自動開啟,可以通過optimization.minimizer指定其他壓縮庫; - 刪除了
CommonsChunkPlugin,功能已遷移至optimization.splitChunks ,optimization.runtimeChunk。
遷移
- 安裝最新的
webpack、webpack-cli、webpack-dev-server; - 為開發(fā)中和發(fā)布分別配置
mode,刪除webpack.DefinePlugin配置,并且去掉package.json中啟動腳本的NODE_ENV區(qū)別環(huán)境變量定義; - 去掉
new webpack.optimize.UglifyJsPlugin、ModuleConcatenationPlugin配置。
爬坑

在這些配置好之后我遇到的第一個問題就是打包時 extract-text-webpack-plugin 插件炸了!這里提供了這里有兩種解決方案:
- 方法一:安裝指定
extract-text-webpack-plugin版本@next; - 方法二:使用
mini-css-extract-plugin替代。
如果使用方法二注意在發(fā)布打包時需要指定 css 壓縮庫配置,并且需要同時寫入 js 壓縮庫,因為你一旦指定了 optimization.minimizer 就會棄用內(nèi)置的代碼壓縮:
/* webpack.config.js */
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = () => {
const config = {
module: {
rules: [
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader?importLoaders=1',
'postcss-loader'
]
},
{
test: /\.less$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader?importLoaders=1',
'postcss-loader',
'less-loader'
]
}
]
},
resolve: {
extensions: ['.js', '.jsx', '.less']
}
};
if (process.env.NODE_ENV === 'development') {
config.module.rules[0].use = [
'css-hot-loader',
MiniCssExtractPlugin.loader,
'css-loader?importLoaders=1',
'postcss-loader'
];
config.module.rules[1].use = [
'css-hot-loader',
MiniCssExtractPlugin.loader,
'css-loader?importLoaders=1',
'postcss-loader',
{
loader: 'less-loader',
options: {
modifyVars: theme
}
}
];
}
return config;
};
/* webpack.config.prod.js */
const merge = require('webpack-merge');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const webpackBaseConfig = require('./webpack.config')();
module.exports = merge(webpackBaseConfig, {
mode: 'production',
optimization: {
minimizer: [
new UglifyJsPlugin({
cache: true,
parallel: true,
uglifyOptions: {
compress: {
warnings: false,
drop_debugger: true,
drop_console: false
}
}
}),
new OptimizeCSSAssetsPlugin({})
]
},
plugins: [
new MiniCssExtractPlugin({
filename: 'css/[name].css'
})
]
});
happypack 炸了,小場面,升級就好 @5.0.0-beta.3(happypack 和 extract-text-webpack-plugin 搭配使用更佳,mini-css-extract-plugin 未測試)。webpack-browser-plugin 炸了,小場面,棄用就好,然后在 devServer 中配置 open 和 openPage 。
上面的配置中可以看到我使用判斷語句 process.env.NODE_ENV === 'development' 在開發(fā)配置中加入了 css-hot-loader ,但是這里實際上是獲取到的是 undefined ,咦?這是什么鬼?查閱更新日志是怎么說的:
process.env.NODE_ENV are set to production or development (only in built code, not in config)
意思就是說我們在使用的工程項目代碼中會獲取到這個變量,但是打包配置中使用這個變量還是獲取不到的,我也實際驗證了這個結(jié)果,so,我在 package.json 的開發(fā)啟動腳本中還是加上了 NODE_ENV='development' 。
最后
總體來說現(xiàn)在的升級時機已經(jīng)成熟,大多需要用到的功能和插件都有平滑的升級或替代方案,建議在開始升級前安裝最新發(fā)布的插件版本,也可以參考下我的項目配置react-with-mobx-template。
還有對插件的一些 API 也做了一些更改,如果你是插件開發(fā)者也可以嘗試發(fā)布新的插件版本,我在使用自己的版本號提取插件webpack-version-plugin時發(fā)現(xiàn) compiler.plugin 已經(jīng)被提示過氣了, webpack@v4 使用最新的 compiler.hooks.emit.tap 觸發(fā)事件,嗯,最后的這部分廣告真硬!
相關(guān)文章
JavaScript在for循環(huán)中綁定事件解決事件參數(shù)不同的情況
響應(yīng)一堆相似的事件,但是每個事件的參數(shù)都不同,在這種情況下就可以使用JavaScript 在for循環(huán)中綁定事件,下面有個不錯的示例,大家可以參考下2014-01-01
聊聊那些使用前端Javascript實現(xiàn)的機器學(xué)習(xí)類庫
本文介紹了前端Javascript實現(xiàn)的機器學(xué)習(xí)類庫,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
IE6瀏覽器中window.location.href無效的解決方法
這篇文章主要介紹了IE6瀏覽器中window.location.href無效的解決方法,給出了正確與錯誤的實例對比,分析跳轉(zhuǎn)無效的原因與解決方法,是非常實用的技巧,需要的朋友可以參考下2014-11-11
淺析JavaScript回調(diào)函數(shù)應(yīng)用
這篇文章主要為大家詳細(xì)介紹了JavaScript回調(diào)函數(shù)應(yīng)用,感興趣的朋友可以參考一下2016-05-05
ES6 javascript中class靜態(tài)方法、屬性與實例屬性用法示例
這篇文章主要介紹了ES6 javascript中class靜態(tài)方法、屬性與實例屬性用法,結(jié)合實例形式分析了ES6中類的靜態(tài)方法、靜態(tài)屬性概念、功能、使用方法與相關(guān)注意事項,需要的朋友可以參考下2017-10-10
快速查找數(shù)組中的某個元素并返回下標(biāo)示例
最近在寫jquery的combobox插件時遇到效率問題,再加上jquery選擇器的類帥選,導(dǎo)致效率很慢,采用以下方式二,可以輕松解決此問題2013-09-09

