webpack5 的 SplitChunksPlugin 插件无法将 js 分离问题

发布于 2022-09-12 13:06:57 字数 2053 浏览 10 评论 0

官方提到:

SplitChunksPlugin 插件可以将公共的依赖模块提取到已有的入口 chunk 中,或者提取到一个新生成的 chunk。

我写了一个 demo 项目,目录结构如下:
image.png

webpack.config.js

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')

module.exports = {
  mode: 'development',
  entry: {
    index: { import: './src/index.js' },
    another: { import: './src/another-module.js' },
  },
  devtool: 'inline-source-map',
  devServer: {
    contentBase: './dist',
  },
  plugins: [
    new CleanWebpackPlugin(),
    new HtmlWebpackPlugin({
      title: '开发环境',
    })
  ],
  output: {
    filename: '[name].bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
  // 分离代码
  optimization: {
    splitChunks: {
      chunks: 'all',
    }
  }
}

index.js

import _ from 'lodash'
import printMe from './print.js'

function component() {
  const element = document.createElement('div');
  const btn = document.createElement('button')

  element.innerHTML = _.join(['Hello', 'webpack'], ' ');

  btn.innerHTML = '点击这里,然后查看 console !'
  btn.onclick = printMe

  element.appendChild(btn)

  return element;
}

document.body.appendChild(component());

another-module.js

import _ from 'lodash'
import printMe from './print.js'

console.log(
  _.join(['Another', 'module', 'loaded!'], '')
)

print.js

console.log(123)
export default function printMe() {
  console.log('I get called from print.js!')
}

打包后
image.png

很明显,index.js 和 another-module.js 都引入的 lodash 模块被提取出来了,变为 vendors-node_modules_lodash_lodash_js.bundle.js 文件,但是为什么 index.js 和 another-module.js 都引入的 print.js 没有被提取出来,当我运行项目时,print.js 里的 console.log(123) 明显执行了两次。这是因为 print.js 不是 node_modules 里导致的吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

耳钉梦 2022-09-19 13:06:57
cacheGroups: {
        defaultVendors: {
          test: /[/]node_modules[/]/,
          priority: -10
        },
        default: {
          minChunks: 2,
          priority: -20,
          reuseExistingChunk: true
        }
      }

默认规则对node_modules内的模块进行提取,所以print.js是不会被提取进去的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文