如何在供应商捆绑包上使用 babel 的 `useBuiltIns: 'usage'` 选项?

Posted

技术标签:

【中文标题】如何在供应商捆绑包上使用 babel 的 `useBuiltIns: \'usage\'` 选项?【英文标题】:How do I use babel's `useBuiltIns: 'usage'` option on the vendors bundle?如何在供应商捆绑包上使用 babel 的 `useBuiltIns: 'usage'` 选项? 【发布时间】:2019-02-23 17:24:13 【问题描述】:

由于我还需要支持 IE11,我还需要转译 node_modules

这是我在 node_modules 上使用的 babel 配置:

presets: [
  ['@babel/preset-env',  modules: false, useBuiltIns: 'usage' ],
],

我使用useBuiltIns 选项,因为它给出了错误Symbol is not defined,需要polyfill。

但是这个配置在编译时中断,据说是因为它在代码中注入了一些imports,这是错误:

基本上它不喜欢module.exports。那么如何在供应商捆绑包中使用useBuiltIns

现在我通过总是要求index.html 中的 babel polyfill 解决了这个问题,但这并不理想。

【问题讨论】:

【参考方案1】:

Babel 默认假定它处理的文件是 ES 模块(使用 importexport)。如果你在 node_modules(可能是 CommonJS 模块)中运行 Babel,你需要告诉 Babel 将所有 node_modules 处理为脚本,或者告诉 Babel 根据 @987654327 的存在来猜测类型@ 和 export。猜测是最简单的,所以你可以添加

sourceType: "unambiguous"

并告诉 Babel 不要在 core-js 上运行 usage 转换

  ignore: [
    /\/core-js/,
  ],

因为否则usage 转换实际上会将core-js 的引用插入到自身中,从而导致依赖循环。

所以在你的*** Babel 配置中,你会这样做,例如


  ignore: [
    /\/core-js/,
  ],
  sourceType: "unambiguous",
  presets: [
    ['@babel/preset-env',  modules: false, useBuiltIns: 'usage' ],
  ],

如果你想更具体一些,你也可以这样做


  ignore: [
    /\/core-js/,
  ],
  presets: [
    ['@babel/preset-env',  modules: false, useBuiltIns: 'usage' ],
  ],
  overrides: [
    test: "./node_modules",
    sourceType: "unambiguous",
  ],

只为node_modules 中的文件设置标志,但这样做可能没有什么好处。

至于为什么修复了这个错误,问题是,如果 Babel 认为某个东西是 ES 模块,它会插入 import 语句。如果您将import 语句插入到一个也使用诸如module.exports 之类的CommonJS 的文件中,这意味着该文件现在将在同一个文件中使用两个模块系统,这是一个大问题并导致您看到的错误。

【讨论】:

试过了,出现了这个错误:i.imgur.com/slZtKT5.png 这是一个进步,因为它是一个不同的错误! 顺便说一下,应该注意的是,在这种情况下,我将 babel 配置作为选项传递给 babel-loader @Pontiacks 我已经在配置中添加了另一个excludes,如果你想试一试的话。 /@babel\b/ 也应该被排除在外,至少在使用transform-runtime 感谢sourceType: "unambiguous",我可能几天都没有想到这个。尤其令人费解的是,这批问题只有在开启useBuiltins: "usage" 后才会出现,而过去正常工作的CJS 代码开始以这种方式和其他方式失败(我自己得到了ES Modules may not assign module.exports or exports.*)。

以上是关于如何在供应商捆绑包上使用 babel 的 `useBuiltIns: 'usage'` 选项?的主要内容,如果未能解决你的问题,请参考以下文章

如何预加载 webpack4+babel 捆绑的 CSS @font-face 字体?

如何在 karma 测试运行器中包含来自 webpack 的供应商捆绑包

如何在单独的 browserify 供应商捆绑包中包含 node_modules

如何单独捆绑供应商脚本并根据需要使用 Webpack?

如何使用 Webpack 将供应商 CSS 文件捆绑到 React 应用程序中?

Symfony - 如何覆盖不在捆绑包中的供应商组件