【发布时间】:2020-05-31 06:32:33
【问题描述】:
我正在尝试配置 babel preset-env 以处理针对指定目标浏览器列表的自动注入 polyfill。
文档指出,使用"useBuiltIns": "usage" 形式的属性配置preset-env 预设将完全做到这一点。
(我注意到单独指定此属性会导致控制台中显示警告,但说明我应该指定要使用的 core-js 版本,所以我也添加了这个。)
因此,我的babel.config.js 看起来像这样:
module.exports = {
"presets": [
"@babel/preset-react",
"@babel/preset-typescript",
[
"@babel/preset-env",
{
"useBuiltIns": "usage",
"corejs": 3
}
]
],
"plugins": ['macros'],
};
太棒了!这应该是轻而易举的事!
但是,在使用 webpack 重新编译后,我的应用程序现在在浏览器中死机,并显示以下控制台消息:
Uncaught TypeError: __webpack_require__(...) is not a function
at Module../node_modules/webpack/buildin/harmony-module.js (harmony-module.js:24)
我已经做了一些研究(大约只值 3 小时!),我知道这是 babel 试图转换 babel 的结果,或者类似的东西......我需要将一些文件添加到可能会忽略不会被转译或双重转译的内容。
在我的 webpack 配置中,我添加了以下内容。 (注意排除条目)。
module: {
rules: [
{
test: /\.(js|jsx|ts|tsx)$/,
exclude: [/core-js/, /regenerator-runtime/],
use: [
{
loader: 'babel-loader',
options: {
presets: babelConfig.presets,
cacheDirectory: babelCacheDir
}
},
'eslint-loader'
]
}
]
}
我还尝试在忽略模式上添加一些变体,但我仍然遇到致命的控制台错误。
我尝试过的另一件事是忽略 node_modules 文件夹,但是我有大块的代码根本没有被转译。即在 IE11 中,我收到有关 ES6 箭头函数的语法错误,这些箭头函数源自未转译的供应商脚本。
如果有人能够解释为什么 __webpack_require__ 会以一种不受欢迎的方式被更改,我会非常感激,因为这个问题需要的确切解决方案是相当难以研究。
编辑:following 建议 babel 必须忽略core-js,这似乎很合理。它建议在 babel 配置文件中使用以下内容:
{
ignore: [
/\/core-js/,
],
sourceType: "unambiguous",
presets: [
['@babel/preset-env', { modules: false, useBuiltIns: 'usage' }],
],
}
但是,这会导致出现另一个相当、看似非特定的错误:
has.js:4 Uncaught TypeError: Cannot convert undefined or null to object
at hasOwnProperty (<anonymous>)
at push../node_modules/core-js/internals/has.js.module.exports (has.js:4)
【问题讨论】:
-
很好的问题。似乎设置
useBuiltIns: 'usage'带来了比以前更多的 Babel 管道,并且过去正常工作的东西(在我的例子中,导入使用分配到module.exports导出的 node.js 样式代码)现在中断了。使用sourceType: "unambiguous"帮助了我,YMMV。 (stackoverflow.com/a/52415747/435004)
标签: webpack babeljs babel-preset-env