为什么Core-js
过去我们使用 babel 对 js 代码进行了兼容性处理,其中使用@babel/preset-env 智能预设来处理兼容性问题。
它能将 ES6 的一些语法进行编译转换,比如箭头函数、点点点运算符等。但是如果是 async 函数、promise 对象、数组的一些方法(includes)等,它没办法处理。
所以此时我们 js 代码仍然存在兼容性问题,一旦遇到低版本浏览器会直接报错。所以我们想要将 js 兼容性问题彻底解决
是什么Core-js
core-js
是专门用来做 ES6 以及以上 API 的polyfill
。
polyfill
翻译过来叫做垫片/补丁。就是用社区上提供的一段代码,让我们在不兼容某些新特性的浏览器上,使用该新特性
main.js
// 添加promise代码
const promise = Promise.resolve();
promise.then(() => {
console.log("hello promise");
});
此时 Eslint 会对 Promise 报错。
npm i @babel/eslint-parser -D
- .eslintrc.js
module.exports = { // 继承 Eslint 规则 extends: ["eslint:recommended"], parser: "@babel/eslint-parser", // 支持最新的最终 ECMAScript 标准 }
此时观察打包输出的 js 文件,我们发现 Promise 语法并没有编译转换,所以我们需要使用
core-js
来进行polyfill
安装命令
npm i core-js
main.js
将所有兼容性代码全部引入
import "core-js";
// 添加promise代码
const promise = Promise.resolve();
promise.then(() => {
console.log("hello promise");
});
或按需引入
import "core-js/es/promise";
// 添加promise代码
const promise = Promise.resolve();
promise.then(() => {
console.log("hello promise");
});
或自动按需引入
main.js中的core-js注释
- babel.config.js
module.exports = {
// 智能预设:能够编译ES6语法
presets: [
[
"@babel/preset-env",
// 按需加载core-js的polyfill
{ useBuiltIns: "usage", corejs: { version: "3", proposals: true } },
],
],
};
最后会生成一个单独的js文件