获取 @babel/present-env 的默认实现以与 IE11 配合使用



除IE11外,我的@babel/preset-env配置工作正常。当我在IE11中运行时,出现此错误:

SCRIPT438:对象不支持属性或方法"分配">

谷歌搜索错误后,我看到我需要使用babel/polyfill,但它已被弃用,建议你现在使用core-js.对于如此广泛使用的工具,缺乏官方文档。

我关注了其他StackOverflow帖子并提出了这个解决方案,但仍然出现错误:

Package.json:

"devDependencies": {
"@babel/core": "^7.10.2",
"@babel/preset-env": "^7.10.2",
"babel-loader": "^8.1.0",
"core-js": "^3.6.5",
...
}

webpack.config:

{
test: /.(js)$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
// presets: ['@babel/preset-env'],
presets: [
[
"@babel/preset-env", {
"targets": {
"browsers": ["last 2 versions", "> 0.1%", "not dead", "ie >= 11"]
},
"useBuiltIns": "usage",
"corejs": 3
}
]
]
}
}
},

我没有babelrcbrowserlists文件,因为我想让它尽可能简约。

为什么这不起作用,为什么我继续收到此错误:

function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}
SCRIPT438: Object doesn't support property or method 'assign'

为未来的读者回答我自己的问题。

因此,@babel/polyfill 被使用 corejs 和 @babel/runtime-corejs3 所取代。执行以下操作以获取 IE11 中Object.assign()错误的填充代码。

1. 安装软件包

npm i core-js @babel/core @babel/runtime-corejs3--保存开发

这将在撰写本文时安装 core-js v3.6.5。

2. 更新网络包

"useBuiltIns": "usage""corejs": 3添加到您的 babel/preset-env 规则中:

module: {
rules: [
{
test: /.(js)$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: [
[
"@babel/preset-env", {
"useBuiltIns": "usage", 
"corejs": 3
}
]
]
}
}
},
// Your other rules...
]
},

3. (可选(添加您的浏览器

如果你想指定你自己的浏览器列表字符串,你可以把它添加到你的package.json:

"devDependencies": {
// my dev dependencies
},
"dependencies": {
// my dependencies
},
"browserslist": "last 2 versions, > 0.1%, not dead"

4. 添加导入 corejs

您需要将 core-js 导入到需要填充代码的地方。我把它放在我根./App.js,让我覆盖全球。

import "core-js/stable";

这应该可以修复IE11中的Object.assign((错误,但是...

5. 其他填充物..

因此,执行此操作后,我在使用IE11不支持的.closest()时遇到了另一个错误。为此获取 polyfill 的一种快速简便的方法是将此脚本添加到您的

<script src="https://unpkg.com/element-closest"></script>

您也可以将其作为包导入,但上述 CDN 交付快速简便。

有一个类似的问题,设置是使用 .config 和浏览器列表

尝试在下面进行更改,看看是否有帮助

corejs: { version: 3, proposals: true }