本指南仅显示影响最终用户的主要变更。更多详情请参阅更新日志。
如果您仍在使用 Node.js v4 或更低版本,您需要将 Node.js 安装升级到 Node.js v6 或更高版本。
升级 Node.js 版本的说明可在此处找到。
CLI 已移至单独的包:webpack-cli。在使用 webpack 之前需要安装它,请参阅基本设置。
安装指南可在此处找到。
许多第三方插件需要更新到最新版本才能与 webpack 4 兼容。热门插件的链接可在此处找到。
将新的mode
选项添加到您的配置中。根据您的配置类型将其设置为'production'
、'development'
或'none'
。
webpack.config.js
module.exports = {
// ...
+ mode: 'production',
}
这些插件可以从配置中移除,因为它们在生产模式下是默认的
webpack.config.js
module.exports = {
// ...
plugins: [
- new NoEmitOnErrorsPlugin(),
- new ModuleConcatenationPlugin(),
- new DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("production") })
- new UglifyJsPlugin()
],
}
这些插件在开发模式下是默认的
webpack.config.js
module.exports = {
// ...
plugins: [
- new NamedModulesPlugin()
],
}
这些插件已被弃用且现已移除
webpack.config.js
module.exports = {
// ...
plugins: [
- new NoErrorsPlugin(),
- new NewWatchingPlugin()
],
}
CommonsChunkPlugin
已被移除。取而代之的是,可以使用optimization.splitChunks
选项。
有关optimization.splitChunks
的更多详情,请参阅文档。默认配置可能已满足您的需求。
在 webpack 4 中,当使用 import()
加载非 ESM 模块时,结果已发生变化。现在您需要访问 default
属性来获取 module.exports
的值。
non-esm.js
module.exports = {
sayHello: () => {
console.log('hello world');
},
};
example.js
function sayHello() {
import('./non-esm.js').then((module) => {
module.default.sayHello();
});
}
当使用自定义加载器转换 .json
文件时,您现在需要更改模块 type
webpack.config.js
module.exports = {
// ...
rules: [
{
test: /config\.json$/,
loader: 'special-loader',
+ type: 'javascript/auto',
options: {...}
}
]
};
如果仍在使用 json-loader
,则可以将其移除
webpack.config.js
module.exports = {
// ...
rules: [
{
- test: /\.json$/,
- loader: 'json-loader'
}
]
};
module.loaders
从 webpack 2 开始已被弃用,现在已被移除,取而代之的是module.rules
。