javascript - Webpack 4 + Babel 7.4.0 + Babel Polyfill
问题描述
我正在尝试改进对我用 ES6 编写的应用程序@babel/polyfill
的支持和browserslist
支持。我已经按照https://babeljs.io/docs/en/babel-polyfill上的所有说明进行操作,但我认为我遗漏了一些东西。
我的browserslist
支持是通过我的 package.json 定义的。我正在通过检查Array.from
(在整个代码中使用的)polyfill 来验证安装是否有效。
有什么想法为什么我在编译的代码中看不到 polyfill?我曾经在入口点声明 polyfill,但 babel 文档现在说这不是必需的。
如果在 .babelrc 中指定了 useBuiltIns: 'usage' 则不要在 webpack.config.js 条目数组或源中包含 @babel/polyfill。注意,@babel/polyfill 仍然需要安装。
...
"browserslist": [
"last 2 version",
"> 1%",
"IE 10"
],
"devDependencies": {
"@babel/core": "^7.4.0",
"@babel/plugin-syntax-dynamic-import": "^7.0.0",
"@babel/preset-env": "^7.4.2",
"babel-core": "^6.26.3",
"babel-loader": "^8.0.0-beta.4",
"babel-preset-env": "^1.7.0",
"chromedriver": "^2.41.0",
"clean-webpack-plugin": "^0.1.19",
"copy-webpack-plugin": "^4.6.0",
"css-loader": "^1.0.0",
"cssnano": "^4.1.4",
"env2": "^2.2.2",
"file-loader": "^1.1.11",
"html-critical-webpack-plugin": "^2.1.0",
"html-webpack-plugin": "^3.2.0",
"lunr": "^2.3.5",
"mini-css-extract-plugin": "^0.4.1",
"nightwatch": "^0.9.21",
"node": "^7.10.1",
"node-sass": "^4.11.0",
"optimize-css-assets-webpack-plugin": "^5.0.1",
"replace-in-file-webpack-plugin": "^1.0.6",
"sass-loader": "^7.0.3",
"selenium-server": "^3.14.0",
"selenium-standalone": "^6.15.6",
"style-loader": "^0.21.0",
"webpack": "^4.17.2",
"webpack-cli": "^3.1.0",
"webpack-dev-server": "^3.2.1",
"webpack-merge": "^4.1.3"
},
"dependencies": {
"@babel/polyfill": "^7.4.0",
"bootstrap": "^4.1.3",
"handlebars": "^4.1.0",
}
我的.babelrc
文件如下所示:
{
"presets": [
[
"@babel/preset-env", {
"useBuiltIns": "usage"
}
]
],
"plugins": ["@babel/plugin-syntax-dynamic-import"],
}
我的 webpack 文件如下所示:
{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}]
解决方案
从 Babel 7.4.0 开始,@babel/polyfill 已被弃用。在 Babel 7.4.0 中,polyfill 的工作方式发生了变化。@babel/polyfill 中提供的所有这些 polyfill 都是由一个名为 core-js 的包提供的。Babel 7.4 使用了这个包的最新版本,core-js@3,它与之前的版本(core-js@2)不兼容,所以我们将不得不对我们的配置进行一些更改。
这是我们现在可以做的:
- 更新 @babel/core 和 @babel/preset-env
从依赖项中删除 @babel/polyfill。由于 core-js 现在直接用于 polyfill。
安装最新版本的 core-js
npm install --save core-js@3
最后,从 core-js@2 迁移到 core-js@3
由于 core-js 版本 2 和 3 互不兼容,默认不启用。
如果你使用@babel/preset-env,你需要启用 corejs: 3 选项.babelrc
:
presets: [
["@babel/preset-env", {
useBuiltIns: "usage", // or "entry"
corejs: 3,
}]
]
正如这里提到的
使用 core-js 3 时,useBuiltIns: "entry" 选项不仅会转换 import "core-js" 导入,还会转换 regenerator-runtime/runtime 和所有嵌套的 core-js 入口点。
请按照此官方文档链接获取更多信息。
此外,现在我们不需要将 core-js 导入到我们花哨的东西所在的每个其他文件中。
推荐阅读
- python - 如何从行中删除df中的nan而不丢失整行?
- sql-server - SQL Tally 基于星期几的值
- fpga - 如何驱动 Xilinx 的 DDS 编译器 IP 内核
- spring-boot - 端口已被使用
- javascript - 在 Google Maps API 上过滤具有多个数据属性的标记
- php - Laravel PHP 上的查看屏幕和打印屏幕是不同的
- java - NetBeans IDE 11.2 java 应用程序 (jframe) 导出
- c# - 将 DataRow 添加到 New Datatable 错误,指出该行已与表相关联
- java - 如何计算列中的结果列表编号?
- android - IONIC apk 在移动设备和模拟器中无法正常工作