【问题标题】:What are the reasons an imported Webpack module would not end up in a chunk?导入的 Webpack 模块最终不会成为一个块的原因是什么?
【发布时间】:2019-08-22 17:38:32
【问题描述】:

我们有一个相当简单的 app/webpack 设置,如下所示:

babel.config.js

module.exports = {
  plugins: [...],
  presets: [
    ['@babel/preset-env', {
      useBuiltIns: 'entry',
      corejs: '3'
    }]
  ]
}

index.js

import './polyfill';
import app from './app';
app();

polyfill.js

import 'core-js/stable';
import 'whatwg-fetch';

webpack.config.js

  entry: {
    bundle: [pathToIndexJs]
  }

  optimization: {
    runtimeChunk: false,
    splitChunks: {
      cacheGroups: {
        commons: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          chunks: 'all'
        }
      }
    }
  }

我们最终得到两个块,bundlevendors。奇怪的是whatwg-fetch(和core-js)并没有最终形成一个块。当我创建构建并输出 stats.json 文件并使用 Webpack Analyze 对其进行分析时,我在模块列表 (./node_modules/whatwg-fetch/fetch.js) 中看到了该模块,但它的 块 em> 列是空的。我已经通过搜索捆绑代码验证了它不会在任何一个块/捆绑中结束。

如果我将 polyfill 添加到 entry.bundle 数组的开头,这个问题就得到了解决,但我想知道为什么它不首先包含在包中,因为它是一个正常的应用程序导入?我希望它出现在 vendors 包中,因为它是一个 node_module。

【问题讨论】:

    标签: webpack webpack-4 webpack-splitchunks


    【解决方案1】:

    如果您使用core-js,则无需在任何地方添加 core-js。 您所要做的就是安装 core-js,创建一个.babelrc 文件并将以下内容放入其中

    {
     "presets": [
      [
        "@babel/preset-env",
        {
          "debug": true,
          "useBuiltIns": "usage",
          "corejs": 3
        }
       ]
      ]
    }
    

    Dubug 参数准确显示了添加了哪些 polyfils 以及添加了哪些内容。 您的代码应如下所示。

    index.js

    import app from './app';
    app();
    

    Webpack 保持原样

    更新

    我又忘记了一件事,最重要的是你看不到pollyfils。

    package.json

    "browserslist": [
     "last 2 version",
     ">1%",
     "not dead"
    ],
    

    当然,你可以调整你想要获取polyffils的浏览器列表->browserl

    编辑
    "useBuiltIns": "usage""useBuiltIns": "entry" 有什么区别? Entry 添加所有 polyfill,Usage 仅添加特定浏览器所需的那些。
    编译后的示例文件在使用Usage 后有7KB 47KB,在更改为Entry 后达到114KB!差别很大。

    【讨论】:

    • 嗯,我没有意识到这会影响我的问题,但我们有一个 babel.config.js,其中包括您所显示的 preset-env(减去调试选项)。
    • 删除它import "core-js/stable"; import "whatwg-fetch"; 打开调试但我忘了还有一件事,最重要的是你看不到pollyfils。如果你没有它,你将不会得到 poliffils 在 package.json 添加这个条目 "browserslist": [ "last 2 version", "> 1%" "not dead"    ] 在这个条目并在控制台中启动之后,你会看到被采用的文档 :) 所有的 polyffils 都应该包含在代码。我确实更新了答案
    • 嗯,我按照你的建议做了,并意识到我们正在使用useBuiltIns: 'entry'according to docs 应该替换我们的 core-js 导入。不知道为什么没有发生。根据您的回答,我将其更改为“用法”,并删除了 core-js 和 whatwg-fetch 行,一切都很好。尽管如此,fetch 是未定义的,因为 core-js 包含一个 polyfill。但我的问题仍然存在。考虑到我们将 core-js 和 fetch polyfill 导入 index.js,为什么 Webpack 没有包含它们?
    • 你是对的,我的错误 core-js 不包含 fetch polyfills。我签入了我的项目,正如我所描述的,我没有导入 core-js 和 polyfils。 Corejs 为我做这件事。在 webpack 分析器中,我有 core-js 和所有 polyfils webpack-boilerplate
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 2022-11-27
    • 1970-01-01
    • 2012-03-07
    相关资源
    最近更新 更多