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

标签 javascript webpack webpack-4

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

配置文件:

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.jsvendor.jsutilities.js,这是可以的。

当我将模式从开发更改为生产时,webpack会忽略实用程序缓存组并将公共(public)代码库附加到两个入口点。

我错过了什么?

Webpack版本:4.28.4 节点版本:8.15

最佳答案

似乎将 enforce 设置为 true 就可以完成这项工作(但我并不完全确定为什么)。

应该是这样的:

utilities: {
    test: /\.s?js$/,
    minChunks: 2,
    name: "utilities",
    chunks: "all",
    priority: 0,
    enforce: true
}

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

关于javascript - 为什么 webpack 在生产模式下会忽略 chunk?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54214050/

相关文章:

javascript - 将 promise 与失败串联起来

javascript - 意外字符 '#'

css - 网页包 4 : mini-css-extract-plugin + file-loader not loading assets

javascript - 升级webpack4 webpack-merge react 问题

javascript - 找不到模块 : Error: Can't resolve '../fonts/fontawesome-webfont.eot'

javascript - webpack-cli 错误 : Compiling RuleSet failed

javascript - 在 NodeJS 中使用 AWS.DynamoDB.DocumentClient 获取排序键以子字符串开头的 get() 条目的正确语法是什么?

javascript - 从 Javascript 将颜色传递给片段着色器

javascript - Ionic 2 ion-searchbar showCancelButton 在 Android 中不起作用

webpack - 将 XHR 添加到 Vue JS webpack