我正在尝试配置 babel preset-env 以针对指定的目标浏览器列表自动注入 polyfill。
文档指出,preset-env
使用 形式的属性配置预设"useBuiltIns": "usage"
将完全做到这一点。
(我注意到单独指定此属性会导致控制台中显示警告,但说明我应该指定要使用的 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__
会以一种不受欢迎的方式被改变,我会非常感激,因为这个问题需要的确切解决方案是对研究有很大的抵抗力。
编辑:以下建议必须使babelcore-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)