Webpack v4 在单个页面上有多个条目,块被不必要地重复

Posted

技术标签:

【中文标题】Webpack v4 在单个页面上有多个条目,块被不必要地重复【英文标题】:Webpack v4 with multiple entries on a single page, chunks are duplicated unnecessarily 【发布时间】:2019-07-14 16:15:02 【问题描述】:

我有一个多页网站,其中包含一个 SPA 页面子集。我们刚刚升级到 Webpack V4,遇到了一些以前没有遇到过的新问题。

我们的页面总是包含 app.build.js 的脚本标记。该文件具有全局初始化,并导入我们的公共路径。它导入诸如 Modernizr 之类的东西并构建我们的网站导航。

此外,我们会按页面提供第二个 JS 文件,例如 account.build.js。如果页面非常简单,则某些页面没有第二个文件。他们仍然需要 app.build.js 来创建导航。

看起来好像 Webpack 不知道这种组合,所以在两个输出文件中有多余的块。它们都可能包括 Modernizr 测试等,所有这些都被添加到两个构建文件中,使它们显着膨胀。

我的问题是,你如何告诉 Webpack app.build.js 是全局包含的?我们为我们的供应商使用 SplitChunks 执行此操作,但它匹配导入,而不是条目文件名。

我们现在还需要在每个条目文件中使用import './public-path';,这并不理想。我宁愿在 app.build.js 中执行一次,并让它在全球范围内得到认可。

在此处使用 Webpack 提交的错误:https://github.com/webpack/webpack/issues/8842

【问题讨论】:

你能把你webpack.config.js的内容贴出来吗? 当然,这里是:gist.github.com/lostPixels/fef3f0cc4a3e99bf526249c605c2096f 你找到答案然后@lostPixels 了吗? 看github.com/webpack/webpack/issues/10537我想还是没有答案? 不,到目前为止 Sorka 还没有答案。 【参考方案1】:

如果您想将所有重复项移动到单个文件 (commons.js) 中,请忽略所有 vendors.js 中的供应商文件,您可以指定多个缓存组。这个commons.js 将包含在所有入口点重复的所有模块。

optimization: 
  splitChunks: 
    cacheGroups: 
      vendors: 
        test: /[\\/]node_modules[\\/]/,
        name: 'vendors',
        chunks: 'all'
      ,
      commons: 
        name: 'commons',
        chunks: 'all',
        minChunks: 2,
        enforce: true,
      ,
    
  

【讨论】:

不幸的是,我们尝试了这个,它没有捕获包含在两个条目文件中的块,这些文件在一个 html 文档中配对在一起。

以上是关于Webpack v4 在单个页面上有多个条目,块被不必要地重复的主要内容,如果未能解决你的问题,请参考以下文章

单个页面上有多个 Facebook 评论框?

如何在单个页面上有多个 jQuery 插件实例?

如何获得一个未展平的多选值数组和单个输入?

webpack 4 - 用于多个条目的拆分块插件

如何在单个页面上显示多个recaptchas?

Webpack v4.8.3 快速入门指南