为什么webpack在生产模式下会忽略chunk?

4

我有多个入口点共享相同的代码。我需要使用Webpack 4中的splitCode将此代码提取到一个文件中。在development模式下,这可以正常工作,但在production模式下却不行。

配置文件:

var path = require('path');
const ManifestPlugin = require('webpack-manifest-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const WebpackMd5Hash = require("webpack-md5-hash");
const CleanWebpackPlugin = require('clean-webpack-plugin');

module.exports = {
    mode: "development",
    module: {
        rules: [
            {
                test: /\.vue$/,
                loader: 'vue-loader'
            },
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: {

                    loader: 'babel-loader',
                }
            },
            {
                test: /\.(sass|scss|css)$/,
                use: [
                    "style-loader",
                    MiniCssExtractPlugin.loader,
                    "css-loader",
                    "sass-loader"
                ]
            }
        ],
    },
    output: {
        path: path.join(__dirname, 'public'),
        filename: 'js/[name]-[chunkhash].js',
        chunkFilename: 'js/[name]-[chunkhash].js',
        publicPath: '/'
    },
    externals: {
        jquery: "jQuery"
    },
    optimization: {
        runtimeChunk: "single",
        splitChunks: {
            cacheGroups: {
                vendor: {
                    test: /[\\/]node_modules[\\/]/,
                    name: "vendor",
                    chunks: "all",
                    priority: 1
                },
                utilities: {
                    test: /\.s?js$/,
                    minChunks: 2,
                    name: "utilities",
                    chunks: "all",
                    priority: 0
                }
            }
        }
    },
    context: path.join(__dirname, 'resources/assets'),
    entry: {
        a: './js/a.js',
        b: './js/b.js'
    },
    plugins: [
        new CleanWebpackPlugin(['public/js/*.*', 'public/css/*.*'], {} ),

        new MiniCssExtractPlugin({
            filename: "css/[name]-[contenthash].css"
        }),

        new WebpackMd5Hash(),

        new ManifestPlugin({
            fileName: 'manifest.json'
        }),
    ]
};

在开发模式下,Webpack会创建两个入口点,一个是runtime.js,另外两个是vendor.jsutilities.js,这是可以的。
当我将模式从development更改为production时,Webpack会忽略utilities缓存组,并将公共代码库附加到这两个入口点中。
我错过了什么吗?
Webpack版本:4.28.4 Node版本:8.15
4个回答

3
似乎将enforce设置为true可以达到目的(但我不太确定原因)。
应该像这样:
utilities: {
    test: /\.s?js$/,
    minChunks: 2,
    name: "utilities",
    chunks: "all",
    priority: 0,
    enforce: true
}

从现在开始,utilities.js不仅在开发模式下创建,也在生产模式下创建。


2

这不是一个错误,而是一项功能

在生产模式下,如果新的代码块大小小于30KB,则Webpack 4会忽略splitchunks.cacheGroups

如何覆盖默认条件:

如果想要确保创建这些代码块,请使用splitchunks.cacheGroups.runtime.enforce: true

请查看文档https://webpack.js.org/plugins/split-chunks-plugin/#defaults以了解更多详细信息。


1

0

Webpack的SplitChunksPlugin插件,由默认设置,会忽略任何小于30kb的块。如果你在开发模式下运行Webpack,你可以看到utilities.js的捆绑大小,并通过将optimization.splitChunks.minSize选项设置为小于utilities.js的大小来强制拆分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接