您好,是否可以根据环境在webpack配置中制作插件?
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(),
new webpack.LoaderOptionsPlugin({
debug: true
}),
new CopyWebpackPlugin([
{from: 'src/www/'}
])
// new BundleAnalyzerPlugin(),
// new CompressionPlugin({
// algorithm: 'gzip',
// test: /\.js$|\.css$|\.html$/
// }),
// new UglifyJsPlugin({
// test: /\.js(\?.*)?$/i
// })
]
仅当我将其与NODE_ENV=production
捆绑在一起时,才应使用注释的内容
预先感谢
答案 0 :(得分:1)
使用您的示例,我希望这样:
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(),
new webpack.LoaderOptionsPlugin({
debug: true
}),
new CopyWebpackPlugin([
{from: 'src/www/'}
])
NODE_ENV === 'production' && new BundleAnalyzerPlugin(),
NODE_ENV === 'production' && new CompressionPlugin({
algorithm: 'gzip',
test: /\.js$|\.css$|\.html$/
}),
NODE_ENV === 'production' && new UglifyJsPlugin({
test: /\.js(\?.*)?$/i
})
].filter(n => n)
或者如果您喜欢ES5:
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(),
new webpack.LoaderOptionsPlugin({
debug: true
}),
new CopyWebpackPlugin([
{from: 'src/www/'}
])
NODE_ENV === 'production' && new BundleAnalyzerPlugin(),
NODE_ENV === 'production' && new CompressionPlugin({
algorithm: 'gzip',
test: /\.js$|\.css$|\.html$/
}),
NODE_ENV === 'production' && new UglifyJsPlugin({
test: /\.js(\?.*)?$/i
})
].filter(function (plugin) { return plugin; })
此代码段的作用是在数组中添加条件(NODE_ENV === 'production'
),这只是告诉JS编译器向数组中写入false
或右侧代码。另一方面,filter
函数只是说要过滤掉false
或虚假信息。
假设我们在NODE_ENV = 'development'
上,我们的插件将如下所示:
[HotModuleReplacementPlugin, NamedModulesPlugin, LoaderOptionsPlugin, CopyWebpackPlugin, false, false, false].filter(...)
在过滤器完成工作后,我们有了这个:
[HotModuleReplacementPlugin, NamedModulesPlugin, LoaderOptionsPlugin, CopyWebpackPlugin]
如果我们现在假设我们在NODE_ENV = 'production'
上,我们的插件将如下所示:
[HotModuleReplacementPlugin, NamedModulesPlugin, LoaderOptionsPlugin, CopyWebpackPlugin, BundleAnalyzerPlugin, CompressionPlugin, UglifyJsPlugin].filter(...)
在过滤器完成工作后,我们有了这个:
[HotModuleReplacementPlugin, NamedModulesPlugin, LoaderOptionsPlugin, CopyWebpackPlugin, BundleAnalyzerPlugin, CompressionPlugin, UglifyJsPlugin]
答案 1 :(得分:1)
根据您的要求,如果环境是生产环境,则添加插件,否则返回false,并根据布尔值过滤数组,但是首选方法是为不同的环境创建不同的文件,这将是一种更清洁的方法
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(),
new webpack.LoaderOptionsPlugin({
debug: true
}),
new CopyWebpackPlugin([
{from: 'src/www/'}
])
NODE_ENV==='production' ? new BundleAnalyzerPlugin() : false,
NODE_ENV==='production' ? new CompressionPlugin({
algorithm: 'gzip',
test: /\.js$|\.css$|\.html$/
}) : false,
NODE_ENV==='production' ? new UglifyJsPlugin({
test: /\.js(\?.*)?$/i
}) : false
].filter(Boolean)
答案 2 :(得分:1)
您可以为每个环境配置一个文件
webpack
├── base.config.js
└── prod.config.js
// base.config.js
const webpack = require('webpack');
module.exports = {
plugins: [
new webpack.EnvironmentPlugin([
'NODE_ENV',
]),
],
};
// prod.config.js
const webpack = require('webpack');
const merge = require('webpack-merge');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const baseConfig = require('./base.config.js');
module.exports = merge(baseConfig, {
....
plugins: [
// Minify JS
new UglifyJsPlugin({
sourceMap: false,
compress: true,
})
],
});
然后在您的package.json
"scripts": {
"build": "NODE_ENV=production webpack --config webpack/prod.config.js",
"start": "NODE_ENV=development webpack-dev-server --config webpack/dev.config.js"
}
答案 3 :(得分:0)
这就是我仅在生产中使用插件的方式
// Load this plugin only when running webpack in a production environment
if (process.env.NODE_ENV == 'production') {
module.exports.plugins.push(
new BundleAnalyzerPlugin({
analyzerPort: 4000
}),
);
}