Webpack:我们如何*有条件地*使用插件?

use*_*023 15 javascript webpack

在Webpack中,我有以下插件:

plugins: [
        new ExtractTextPlugin('styles.css'),
        new webpack.optimize.UglifyJsPlugin({
            compress: {
                warnings: false
            },
            drop_console: true,
        }),
    ]
Run Code Online (Sandbox Code Playgroud)

我想UglifyJsPlugin 仅针对特定目标应用,所以我尝试使用我想要的条件:

plugins: [
        new ExtractTextPlugin('styles.css'),
        (TARGET === 'build') && new webpack.optimize.UglifyJsPlugin({
            compress: {
                warnings: false
            },
            drop_console: true,
        }),
    ]
Run Code Online (Sandbox Code Playgroud)

但是,此操作失败,显示以下错误消息:

E:\myProject\node_modules\tapable\lib\Tapable.js:164
            arguments[i].apply(this);
                         ^

TypeError: arguments[i].apply is not a function
Run Code Online (Sandbox Code Playgroud)

请注意,上面的代码类似于falseplugins数组的末尾(发出相同的错误):

plugins: [
        new ExtractTextPlugin('styles.css'),
        false
    ]
Run Code Online (Sandbox Code Playgroud)

所以,问题是:有没有办法在Webpack上有条件插件?(除了使用变量?)

UnL*_*oCo 37

您可以使用这种使用扩展运算符的语法

plugins: [
    new MiniCssExtractPlugin({
        filename: '[name].css'
    }),
    ...(prod ? [] : [new BundleAnalyzerPlugin()])
],
Run Code Online (Sandbox Code Playgroud)

  • 特别是使用 BundleAnalyzerPlugin,您可以有条件地将“analyzerMode”设置为“disabled”,即。`new BundleAnalyzerPlugin({ detectorMode: process.env.BUNDLE_ANALYZE ? 'server' : 'disabled' })` (6认同)

Jef*_*ett 16

鉴于我的条件,我推入了插件阵列 webpack.config.js

var webpack = require('webpack');
const ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
    entry: {
        ...
    },
    output: {
        ...
    },
    module: {
        rules: [
            ...
        ]
    },
    plugins: [
        new ExtractTextPlugin('styles.css'),
    ]
};


if (TARGET === 'build') {
    module.exports.plugins.push(
        new webpack.optimize.UglifyJsPlugin({
            compress: {
                warnings: false
            },
            drop_console: true,
        }),
    );
}
Run Code Online (Sandbox Code Playgroud)


Bob*_*nge 11

没有变量,它将如下所示:

    plugins: [
        new ExtractTextPlugin('styles.css'),
        (TARGET === 'build') && new webpack.optimize.UglifyJsPlugin({
            compress: {
                warnings: false
            },
            drop_console: true,
        }),
    ].filter(function(plugin) { return plugin !== false; })
Run Code Online (Sandbox Code Playgroud)

  • 你也可以这样做:`[] .filter(布尔)`(参见https://github.com/webpack/webpack/issues/5699#issuecomment-330776517). (8认同)

mik*_*kep 5

可以使用noop-webpack-plugin(noop表示不进行任何操作):

const isProd = process.env.NODE_ENV === 'production';
const noop = require('noop-webpack-plugin');
// ...
plugins: [
    isProd ? new Plugin() : noop(),
]
Run Code Online (Sandbox Code Playgroud)

或者更好/推荐的解决方案,无需附加模块:

const isProd = process.env.NODE_ENV === 'production';
// ...
plugins: [
    isProd ? new Plugin() : false,
].filter(Boolean)
// filter(Boolean) removes items from plugins array which evaluate to
// false (so you can use e.g. 0 instead of false: `new Plugin() : 0`)
Run Code Online (Sandbox Code Playgroud)