首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何区分 babel polyfill 和 transform-runtime

如何区分 babel polyfill 和 transform-runtime

作者头像
上山打老虎了
发布于 2022-06-14 13:57:26
发布于 2022-06-14 13:57:26
45300
代码可运行
举报
文章被收录于专栏:ArticleArticle
运行总次数:0
代码可运行

官方文档上

Runtime transform

Externalise references to helpers and builtins, automatically polyfilling your code without polluting globals

从最终的行为来解释就是说babel引入了helper工具函数自动来执行polyfill并且不污染全局作用于,采用require的方式。

This plugin is recommended in a library/tool.

推荐在工具库中使用。

NOTE: Instance methods such as “foobar”.includes(“foo”) will not work since that would require modification of existing built-ins (Use babel-polyfill for that).

同时该插件并不会转换诸如数组的includes方法

polyfill

This will emulate a full ES2015+ environment and is intended to be used in an application rather than a library/tool. This polyfill is automatically loaded when using babel-node

polyfill 本质上就是一个降级方案,它作用在全局,将你的ES6语法做转换。

差异

  • 都做转换
  • 但是polyfill转换的东西更多更全面
  • 而runtime仅仅转换一些语法,类似数组的API是不做转换的
  • polyfill作用在全局
  • 而runtime则是通过引用模块的方式来实现
  • 那些需要修改内置api才能达成的功能,譬如:扩展String.prototype,给上面增加includes方法,就属于修改内置API的范畴,这是polyfill来做的
不使用transform-runtime转换async/await
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"use strict";

function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }

_asyncToGenerator(regeneratorRuntime.mark(function _callee() {
    return regeneratorRuntime.wrap(function _callee$(_context) {
        while (1) {
            switch (_context.prev = _context.next) {
                case 0:
                    _context.next = 2;
                    return loadStory();

                case 2:
                    console.log("Yey, story successfully loaded!");

                case 3:
                case "end":
                    return _context.stop();
            }
        }
    }, _callee, this);
}))();
使用transform-runtime 转换async/await
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"use strict";

var _regenerator = require("babel-runtime/regenerator");

var _regenerator2 = _interopRequireDefault(_regenerator);

var _asyncToGenerator2 = require("babel-runtime/helpers/asyncToGenerator");

var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

(0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee() {
    return _regenerator2.default.wrap(function _callee$(_context) {
        while (1) {
            switch (_context.prev = _context.next) {
                case 0:
                    _context.next = 2;
                    return loadStory();

                case 2:
                    console.log("Yey, story successfully loaded!");

                case 3:
                case "end":
                    return _context.stop();
            }
        }
    }, _callee, this);
}))();

这里可以看到两者的区别在于,使用了transform-runtime 之后 babel会自动引入模块的方式来实现es5的写法,可以看出是利用了babel的工具函数,工具函数中把Promise都实现了一遍。

而不用 transform-runtime 的时候,仅仅是使用 Promise 来实现 async/await 但是并未考虑对 Promise 做转换。 总结:

  • 具体项目还是需要使用 babel-polyfill,只使用 babel-runtime 的话,实例方法不能正常工作(例如 “foobar”.includes(“foo”))。
  • JavaScript 库和工具可以使用 babel-runtime,在实际项目中使用这些库和工具,需要该项目本身提供 polyfill。
  • 单独的库如果仅仅是转换ES6语法,那么也可以不使用runtime,babel本身就是会自带这部分的转换的。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年03月27日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一文聊完前端项目中的Babel配置
As a Front-end engineer,浏览器兼容性对于每个人来讲都是必不可少的话题。
19组清风
2022/10/08
1.9K0
一文聊完前端项目中的Babel配置
面试官: 说说你对async的理解
async是generator和promise的语法糖,利用迭代器的状态机和promise来进行自更新!
用户8200753
2023/10/22
2470
4. 精读《AsyncAwait 优越之处》
本期精读的文章是:6 Reasons Why JavaScript’s Async/Await Blows Promises Away
黄子毅
2022/03/14
3530
4. 精读《AsyncAwait 优越之处》
async/await 带你逃离回调地狱
Gcaufy
2017/05/18
2.3K0
async/await 带你逃离回调地狱
十问babel,用最简单的话说清楚babel
我们都知道JS的新的API,语法糖层出不穷,在丰富了我们的知识库的同时,也极大的便利了我们的开发。
虎妞先生
2023/03/11
1.2K0
十问babel,用最简单的话说清楚babel
搞懂babel7常用的配置和优化,这篇就够了!
网上关于babel7的文章很多,但是大多都没有实践,很多讲的模棱两可。 本文将手把手的带你看各种配置下的输入输出转换,彻底让你了解babel7到底该怎么去配置和优化。
ssh_晨曦时梦见兮
2020/04/10
2.9K0
async/await 源码实现
如果你有一个这样的场景,b依赖于a,c依赖于b,那么我们只能通过promise then的方式实现。这样的的可读性就会变得很差,而且不利于流程控制,比如我想在某个条件下只走到 b 就不往下执行 c 了,这种时候就变得不是很好控制!
用户4131414
2020/03/19
1.4K0
搞懂babel7常用的配置和优化,这篇就够了!
网上关于babel7的文章很多,但是大多都没有实践,很多讲的模棱两可。 本文将手把手的带你看各种配置下的输入输出转换,彻底让你了解babel7到底该怎么去配置和优化。
ssh_晨曦时梦见兮
2024/01/27
3840
【Web技术】848- 超棒的 Babel 上手指南
Babel 是一个用于 JavaScript 的通用多用途编译器,使用 Babel 可以使用(或创建)下一代 的JavaScript,以及下一代 JavaScript 工具。
pingan8787
2021/01/28
5890
【Web技术】848- 超棒的 Babel 上手指南
四大维度解锁webpack3笔记
在命令行输入webpack -h,成功就出现下图,有很多webpack命令可以看一看
FinGet
2019/06/28
1.2K0
四大维度解锁webpack3笔记
前端异步代码解决方案实践(二)
早前有针对 Promise 的语法写过博文,不过仅限入门级别,浅尝辄止食而无味。后面一直想写 Promise 实现,碍于理解程度有限,多次下笔未能满意。一拖再拖,时至今日。
前朝楚水
2018/07/26
3.4K0
大前端的自动化工厂(3)—— babel
babel是ES6+语法的编译器,官方网址:www.babeljs.io,用于将旧版本浏览器无法识别的语法和特性转换成为ES5语法,使代码能够适用更多环境。
大史不说话
2018/09/10
7570
大前端的自动化工厂(3)—— babel
Babel快速指南
结构上属于编译器,由于输入JS源码,输出也是JS源码(所谓source to source),所以也称为transpiler(转译器)
ayqy贾杰
2019/06/12
1.2K0
语法降级与Polyfill:消灭低版本浏览器兼容问题
提到前端编译工具链方面,可能大家最新想到的是诸如@babel/preset-env、core-js、regenerator-runtime等工具。不过,我们今天要讲的是官方的 Vite 插件@vitejs/plugin-legacy,以及如何将这些底层的工具链接入到 Vite 中,并实现开箱即用的解决方案。
xiangzhihong
2023/07/09
4.4K1
语法降级与Polyfill:消灭低版本浏览器兼容问题
babel入门基础
背景 babel的官网说babel是下一代的js语法编译器,现在自己也在很多项目中使用了babel,可是自己对babel的认识呢,只停留在从google和别人项目中copy的配置代码上,内心感到很不安,最近花了点时间整理了一下,分享给大伙。 babel常用配置 通常在前端或node项目中,进行以下配置: 入口文件app.babel.js里面配置: // babel require('babel-core/register')({ presets: ['es2015', 'stage-0'] }); re
用户1217459
2018/01/31
9640
【前端词典】关于 Babel 你必须知道的
我第一次打开搜索引擎查询关于 Babel 的资料时,出现的竟然是关于 Babel 的传说。后来我花了小一天的时间去了解这个传说(来自《旧约圣经》)。
小生方勤
2019/07/23
6910
【前端词典】关于 Babel 你必须知道的
从零学脚手架(四)---babel
这是因为webpack本身不会处理代码中的ES6(ES2015+)特性,所以也就没有使用。
莫问今朝
2021/03/16
1.4K0
从零学脚手架(四)---babel
Babel6
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
奋飛
2019/08/15
1.1K0
简单使用babel
要使用babel,首先需要了解用的东西?它是一个用来进行ES6转化到ES5的转码器,从而在现有环境中进行执行。 一、配置文件.babelrc(搬运下) Babel的配置文件是.babelrc,存放在项目的根目录下。使用Babel的第一步,就是配置这个文件。 该文件用来设置转码规则和插件,基本格式如下。 { "presets": [], "plugins": [] } presets字段设定转码规则,官方提供以下的规则集,你可以根据需要安装。 # ES2015转码规则 $ npm install
用户1148881
2018/01/15
8220
入门babel,我们需要了解些什么
说实话,我从工作开始就一直在接触babel,然而对于babel并没有一个清晰的认识,只知道babel是用于编译javascript,让开发者能使用超前的ES6+语法进行开发。自己配置babel的时候,总是遇到很多困惑,下面我就以babel@7为例,重新简单认识下babel。
程序员白彬
2020/07/10
7780
入门babel,我们需要了解些什么
相关推荐
一文聊完前端项目中的Babel配置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档