@vue/cli 兼容浏览器版本原理

前端工程化兼容浏览版本主要工作:

  1. 修补(polyfill)不被浏览器支持的js特性 (@babel/preset-env 插件集合,其中core-js是babel转码的核心包,其将不被支持的js新特性降级处理成 es5 api, 使js特性在不被支持的浏览器中正常运行)

降级处理成 es5 api是什么意思? 比如方法在某个浏览器版本中没有Array.flat,则在Array.prototype中增加flat方法,用es5的写法实现flat相同的功能

@babel/preset-env (babel 转换插件)
选项设置:

  • useBuiltIns: ‘usage’ ( 可设置为按需修补,即代码中写到什么语法就修补哪个)
  • corejs:v7.4.0后弃用babel-polyfill,换成core-js修补库,可指定版本。此选项只有在与 useBuiltIns: usage (按需引入) 或useBuiltIns: entry(直接引入) 一起使用时才有效
  1. 添加特定浏览器特定css前缀或css写法 (postcss 中 核心插件 Autoprefixer,添加特定浏览器前缀或特定浏览器的css 写法)
  2. 以上插件需要知道js特性被浏览器支持的情况,数据源则来自browserslist 和 caniuse 数据库

package.json中的browserslist字段指定需要支持的浏览器版本(或.browserslistrc文件中指定),具体配置见browerslist官网

那么如何确定写的js新特性确实做了降级处理呢?
  1. 查询此新特性在哪个ESMAScript 版本中添加的

可在 w3schools.com 中查询 JS
各个版本以及添加的new features 比如 Array.flat() 是在JS 2019 添加的

  1. 确定项目中code-js版本、code-js版本增加了哪些JS新特性的polyfill

查看@babel/preset-env 中core-js选项的版本,
上github查看对应版本文档介绍中新添加的特性或在源码中找:

在core-js 2 找不到 flat 的polyfill
在这里插入图片描述在这里插入图片描述
尝试在 v3文档和源码中找找
在这里插入图片描述

在这里插入图片描述

3.实践验证
以下转自 不要肆无忌惮地在你的项目中使用 ES78910 了~

npm init -y

npm i @babel/core @babel/preset-env -D

const babel = require('@babel/core');

const code = `[1, 2, 3, 4, [5, 6, [7, 8]]].flat(Infinity);`;
const ast = babel.transform(code, {
  presets: [
    [
      '@babel/preset-env',
      {
        useBuiltIns: 'usage',
        corejs: 2
      }
    ]
  ]
});
// 用core-js@2 来看看转码后的结果
console.log(ast.code);

// "use strict";

// [1, 2, 3, 4, [5, 6, [7, 8]]].flat(Infinity);

作者:null链接:https://juejin.cn/post/6844903942451642376
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
const babel = require('@babel/core');

const code = `[1, 2, 3, 4, [5, 6, [7, 8]]].flat(Infinity);`;
const ast = babel.transform(code, {
  presets: [
    [
      '@babel/preset-env',
      {
        useBuiltIns: 'usage',
        corejs: 3
      }
    ]
  ]
});
// 用core-js@3 来看看转码后的结果
console.log(ast.code);

// "use strict";

// require("core-js/modules/es.array.flat");

// require("core-js/modules/es.array.unscopables.flat");

// [1, 2, 3, 4, [5, 6, [7, 8]]].flat(Infinity);

作者:null链接:https://juejin.cn/post/6844903942451642376
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值