babel7按需加载polyfill示例详解

 更新时间:2023年02月05日 15:26:17   作者:chenby  
这篇文章主要为大家介绍了babel7按需加载polyfill示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

babel7

babel7发布了。

在升级到 Babel 7 时需要注意几个重大变化:

  • 移除对 Node.js 6 之前版本的支持;
  • 使用带有作用域的 @babel 命名空间,以防止与官方 Babel 包混淆;
  • 移除年度预设,替换为 @babel/preset-env;
  • 使用选择性 TC39 个别提案替换阶段提案;
  • TC39 提议插件现在是 -proposal,而不是 -transform;
  • 为某些面向用户的包(例如 babel-loader、@babel/cli 等)在 @babel/core 中引入peerDependency。

官方提供了一个工具babel-upgrade,对于老项目,只需要执行:npx babel-upgrade --write --install

具体看 https://github.com/babel/babel-upgrade

useBuiltIns:usage

babel的polyfill总是比较大,会影响一些性能,而且也会有一些没用的polyfill,怎么减少polyfill的大小呢?

babel7提供了useBuiltIns的按需加载:usage。

配置中设置useBuiltIns:usage,babel就会自动把所需的polyfill加载进来,不需要手动import polyfill文件。

配置如:

{
    "presets": [
      "@babel/preset-react",
      ["@babel/env", {
        "targets": {
          "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
        },
        "useBuiltIns": "usage",
        "debug": true
      }]
    ],
    "plugins": ["@babel/transform-runtime"]
  }

babel提供的@babel/env全面替换es2015,stage插件。(如果用到stage的某些插件需要自行引入。个人感觉stage用起来太不方便了)。

之前的babel-preset-env/babel-preset-react全都改名为@babel/xxx,如果在babel7你还按之前的写法,会报错:

Error: Plugin/Preset files are not allowed to export objects, only functions.

效果

看下useBuiltIns:usage的效果。"debug"选项开到true,可以看到打包的文件。

我用es6摘抄了一些语法,用来测试编译:

const a = Object.assign({}, { a: 1 });
console.log(a);
function timeout(ms) {
    return new Promise((resolve) => {
        setTimeout(resolve, ms);
    });
}
async function asyncPrint(value, ms) {
    await timeout(ms);
    console.log(value);
}
let s = Symbol();
typeof s;
class ColorPoint {
    constructor(x, y, color) {
      this.color = color;
    }
    toString() {
      return this.color + ' ' + super.toString(); // 调用父类的toString()
    }
  }
asyncPrint('hello world', 50);
function* helloWorldGenerator() {
  yield 'hello';
  yield 'world';
  return 'ending';
}
var hw = helloWorldGenerator();
console.log(hw.next());

babel编译之后,可以看到加载的polyfill只加载了 es6.object.assign,es6.promise, es6.symbol,es7.symbol.async-iterator , regenerator-runtime。

babel是怎么知道我们需要哪些polyfill的?

根据我们填的"targets",babel会去查用到的api,当前的target环境支持什么不支持什么,不支持的才加polyfill。

可以看到我们编译后的文件已经加了polyfill。

文件大小和性能都有很多提高。

useBuiltIns:entry

useBuiltIns:entry就没有那么智能了,他会根据target环境加载polyfill,他需要手动import polyfill,不能多次引入。
@babel/preset-env会将把@babel/polyfill根据实际需求打散,只留下必须的。做的只是打散。仅引入有浏览器不支持的polyfill。这样也会提高一些性能,减少编译后的polyfill文件大小。

main.js需要引入polyfill。import '@babel/polyfill';
可以看到效果。我只截了部分polyfill依赖。

编译后的文件引入了一堆polyfill。

最佳实践

只用polyfill不是最完美的方案。
polyfill会额外引入一些函数,比如:

因为polyfill没有babel-runtime的helper函数,在编译async函数的时候,会引入以上的代码asyncGeneratorStep_asyncToGenerator

如果你每个文件都用到了async,那么冗余的代码将会很大。

babel-runtime

最佳方案就是在用polyfill的同时,再用babel-runtime。

babel-runtime会把asyncGeneratorStep,_asyncToGenerator等函数require进来。从而减小冗余。

这得益于babel-runtime的helper函数。

所以最佳的配置是polyfill+babel-runtime。

如果用了react可以加@babel/preset-react。

{
    "presets": [
      "@babel/preset-react",
      ["@babel/env", {
        "targets": {
          "browsers": ["last 2 versions", "ie 11"]
        },
        "useBuiltIns": "usage"
      }]
    ],
    "plugins": ["@babel/transform-runtime"]
  }

可以看到,_asyncToGenerator2已被require。

以上就是babel7按需加载polyfill示例详解的详细内容,更多关于babel7按需加载polyfill的资料请关注脚本之家其它相关文章!

相关文章

  • javascript 判断一个对象为数组的方法

    javascript 判断一个对象为数组的方法

    这篇文章主要介绍了javascript 判断一个对象为数组的方法的相关资料,需要的朋友可以参考下
    2017-05-05
  • 微信小程序3种位置API的使用方法详解

    微信小程序3种位置API的使用方法详解

    这篇文章主要介绍了微信小程序3种位置API的使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Echarts柱状图实现同时显示百分比+原始值+汇总值效果实例

    Echarts柱状图实现同时显示百分比+原始值+汇总值效果实例

    echarts是一款功能强大、灵活易用的数据可视化库,它提供了丰富的图表类型和样式,包括柱状图,这篇文章主要给大家介绍了关于Echarts柱状图实现同时显示百分比+原始值+汇总值效果的相关资料,需要的朋友可以参考下
    2024-08-08
  • BootStrap入门教程(二)之固定的内置样式

    BootStrap入门教程(二)之固定的内置样式

    这篇文章主要介绍了BootStrap入门教程(二)之固定的内置样式的相关资料,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-09-09
  • jquery实现左右滑动式轮播图

    jquery实现左右滑动式轮播图

    这篇文章主要为大家详细介绍了jquery实现左右滑动式轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • javascript异常处理实现原理详解

    javascript异常处理实现原理详解

    这篇文章主要介绍了javascript异常处理实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • js实现简单随机抽奖的方法

    js实现简单随机抽奖的方法

    这篇文章主要介绍了js实现简单随机抽奖的方法,涉及字符串的操作、setInterval定时调用等技巧,需要的朋友可以参考下
    2015-01-01
  • JavaScript中标识符提升问题

    JavaScript中标识符提升问题

    标识符指的是javascript中定义的符号,标识符可以由任意顺序的大小写字母、数字、下划线和美元符号组成,但标识符不能以数字开头,也不能是javascript中的保留关键字。并且要注意,javascript是严格区分大小写的。
    2015-06-06
  • Javascript 获取字符串字节数的多种方法

    Javascript 获取字符串字节数的多种方法

    Javascript 字符串字节数获取功能多种方法
    2009-06-06
  • 基于JavaScript开发一个有趣的分组抽签小程序

    基于JavaScript开发一个有趣的分组抽签小程序

    在团队合作开发中,经常需要将团队成员分组,来完成各自的任务,而抽签的方式自然是最公平、最简单的方法之一,所以本文就来开发一个有趣的分组抽签小程序吧
    2023-05-05

最新评论