You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置HtmlWebpackPlugin仅向依赖页面注入拆分的Vendor Chunk?

SplitChunksPlugin拆分的Vendor Chunk被错误注入无关HTML文件

我配置了两个入口main和jira_callback,每个入口对应一个HtmlWebpackPlugin实例。main入口引入了第三方库,通过SplitChunksPlugin拆分出了独立的Vendor Chunk,但这个Vendor Chunk被错误注入到了jira_callback对应的HTML文件中,而jira_callback入口没有任何导入语句,完全不需要这个Vendor Chunk。

我的webpack.common.js配置如下:

'use strict';

import path from 'node:path';
import webpack from 'webpack';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
import CopyPlugin from 'copy-webpack-plugin';

const __dirname = import.meta.dirname;

export default {
  entry: {
    main: './src/index.js',
    jira_callback: './src/jira-callback/index.js',
  },
  output: {
    filename: '[name].js',
    path: path.resolve(__dirname, 'dist'),
    clean: true,
  },
  module: {
    rules: [
      {
        test: /\.m?js$/i,
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: [
              [
                '@babel/preset-env',
                {
                  useBuiltIns: 'usage',
                  corejs: '3.37',
                  targets: 'defaults',
                  bugfixes: true,
                },
              ],
            ],
          },
        },
      },
    ],
  },
  optimization: {
    minimizer: ['...', new CssMinimizerPlugin()],
    splitChunks: {
      cacheGroups: {
        vendor: {
          name: 'vendor',
          test: /(node_modules|bower_components)[/\\](?!exceljs)/,
          priority: -10,
        },
      },
      chunks: 'all',
    },
    removeAvailableModules: true,
    sideEffects: true,
  },
  plugins: [
    new webpack.ProvidePlugin({
      $: 'jquery',
      jQuery: 'jquery',
    }),
    new HtmlWebpackPlugin({
      template: 'src/index.html',
      filename: 'index.html',
      chunks: ['main'],
    }),
    new HtmlWebpackPlugin({
      template: 'src/jira-callback/index.html',
      filename: 'jira-callback/index.html',
      chunks: ['jira_callback'],
    }),
    new CopyPlugin({
      patterns: [
        {
          context: './src',
          from: './**/*.php',
        },
      ],
    }),
  ],
  resolve: {
    alias: {
      'jquery-ui': 'jquery-ui/ui/widgets',
      'jquery-ui-css': 'jquery-ui/../../themes/base',
    },
  },
};

P.S. 忽略PHP和Node.js的混搭写法……我也是不得已而为之。


解决方案

方法一:限制Vendor Chunk仅从main入口拆分

修改splitChunks的cacheGroups.vendor配置,添加chunks: 'main',让SplitChunksPlugin只从main入口的chunk中提取第三方库,切断jira_callback与Vendor Chunk的关联:

optimization: {
  minimizer: ['...', new CssMinimizerPlugin()],
  splitChunks: {
    cacheGroups: {
      vendor: {
        name: 'vendor',
        test: /(node_modules|bower_components)[/\\](?!exceljs)/,
        priority: -10,
        chunks: 'main' // 仅处理main入口的chunk
      },
    },
    chunks: 'all',
  },
  // ...其他原有配置
},

同时在main对应的HtmlWebpackPlugin中显式指定注入vendor chunk,确保依赖的库被正确加载:

new HtmlWebpackPlugin({
  template: 'src/index.html',
  filename: 'index.html',
  chunks: ['main', 'vendor'], // 显式加入vendor chunk
}),

方法二:在jira_callback的HTML配置中排除Vendor Chunk

如果不需要调整拆分规则,可直接在jira_callback对应的HtmlWebpackPlugin实例中添加excludeChunks配置,明确禁止注入vendor chunk:

new HtmlWebpackPlugin({
  template: 'src/jira-callback/index.html',
  filename: 'jira-callback/index.html',
  chunks: ['jira_callback'],
  excludeChunks: ['vendor'] // 禁止注入vendor chunk
}),

内容的提问来源于stack exchange,提问作者tearfur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:48:13