babel7中 corejs 和 corejs2 的区别
babel7中 corejs 和 corejs2 的区别
最近在给项目升级 webpack4 和 babel7,有一些改变但是变化不大。具体过程可以参考这篇文章 webpack4:连奏中的进化。只是文章中没有对最新的 css 提取插件进行修改,主要是把 ExtractTextPlugin 换成 (mini-css-extract-plugin)[https://github.com/webpack-contrib/mini-css-extract-plugin]。
按照这些文档中的说法照着做就没有问题。碰到也是什么版本不对啊,小心升级就可以了。
在升级中发现 babel7 变化挺大的,包括插件和包。
其中一项功能特别赞,就是 @babel/preset-env
中的 useBuiltIns
选项,如果你设置了 usage
,babel 编绎的时候就不用整个 polyfills , 只加载你使用 polyfills,这样就可以减少包的大小。
在使用 babel 中还想减少代码,就需要引入 babel 的运行时:
npm install --save-dev @babel/plugin-transform-runtime
npm install --save @babel/runtime
需要注意的是:
- 两个包引入的范围不一样:一个在开发时引入,一个在运行时引入。
- plugin-transform-runtime 已经默认包括了 @babel/polyfill,因此不用在独立引入。
在 plugin-transform-runtime 中有一个 corejs 很奇怪,可以设置成 false 或者 2。这是为什么这样?
大家知道 corejs 是一个给低版本的浏览器提供接口的库,如 Promise, map, set 等。
在 babel 中你设置成 false 或者不设置,就是引入的是 corejs 中的库,而且在全局中引入,也就是说侵入了全局的变量。可以观察以下的代码:
// 这是你写的代码
function sleep(ms) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve()
}, ms)
})
}
// babel 编绎成的代码
"use strict";
require("core-js/modules/es6.promise"); // 这里可以看出是全局引入
function sleep(ms) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve();
}, ms);
});
}
如果你的全局有一个引入,不要让引入的库影响全局,那你就需要引把 corejs 设置成 2。下面就是设真置成 2,编绎成的代码:
"use strict";
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise")); // 独立变量
function sleep(ms) {
return new _promise.default(function (resolve, reject) {
setTimeout(function () {
resolve();
}, ms);
});
}
可以从编绎出的代码看到,promise 代码变成了一个独立的变量 _promise,不会影响全局的 Promise。
这样的好处是,引入的库者自己引入了一个变量,这样如果你引入的第三方库会对 Promise 进行一些自定义操作,这样的功能可以避免第三方库报错。
还要注意一点是: 如果你设置了 corejs2,那你就需要加入下面的库:
npm install @babel/runtime-corejs2
具本的代码可以在这里找到 babel-preset-htoooth-test
后话
在使用 babel7 的时候,发现很多的插件需要手动的加上,一点也不方便,因此我做了一个库: babel-preset-htoooth,把所有的插件都引入,然后参数进行控制,如果想使用 corejs2,只用设置成 corejs:2 就可以,非常方便。
示例库也是用这个库来进行演示的。
babel7中 corejs 和 corejs2 的区别的更多相关文章
- babel7中 preset-env 完全使用
babel7中 preset-env 完全使用 const presets = [ ['@babel/env', { // chrome, opera, edge, firefox, safari, ...
- 【转】为什么我们都理解错了HTTP中GET与POST的区别
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- Visual Studio 中 Build 和 Rebuild 的区别
因为之前写的程序比较小,编译起来比较快,所以一直都没有太在意 Build 和 Rebuild 之间的区别,后来发现两个还是有很大不同. Build 只针对在上次编译之后更改过的文件进行编译,在项目比较 ...
- SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别
SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是 EXEC 和 SP_EXECUTESQL ,我们先来看一下两种方 ...
- java集合中List与set的区别
java集合中List与set的区别. List可以存储元素为有序性并且元素可以相同. set存储元素为无序性并且元素不可以相同. 下面贴几段代码感受一下: ArrayL ...
- Java中Set Map List 的区别
java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...
- oracle中函数和存储过程的区别和联系【转载竹沥半夏】
oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己 ...
- JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别
JS中isPrototypeOf 和hasOwnProperty 的区别 1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的 ...
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
随机推荐
- 千万别用MongoDB?真的吗?!
某人发了一篇Don’t use MongoDB的血泪控诉,我把原文翻译如下,你可以看看.不过,我想我们还要去看看10gen CTO的对此事的回复,我们还要去在Reddit上看看大家的说法,10gen ...
- 发个IOCP的C++例子
IOCP的c++例子 IOCP这个东西连续关注了将近3年的时间,这个代码从哪里找到的已经忘了,下面是作者的信息.感谢他提供的代码! /*++ Copyright (c) 2004 模块名: iomod ...
- Block Change Tracking (块改变跟踪)
理论背景:Block ChangeTracking 是Oracle 10g里推出的特性. Block change tracking 会记录data file里每个block的update 信息,这些 ...
- Mysql 创建存储过程 更新表
DELIMITER // use protocoldb// drop procedure if exists sp_protocol_Update// create procedure sp_prot ...
- C语言单精度浮点型转换算法
文章来源:http://blog.csdn.NET/educast/article/details/8522818 感谢原作者. 关于16进制浮点数对于大小为32-bit的浮点数(32-bit为单精度 ...
- maven学习八 关于maven的version
在一个有继承关系的POM文件中,父项目中有如下定义: <dependencyManagement> <dependency> <groupId>com.type ...
- 怎么解决sublime的插件自动被禁用
前两天,我的sublime text安装的很多插件都被自动禁用了,每次都要我自己重新启用一下才可以,后来从网上找到了解决方法. 找到“设置”-“Package Settings”-“Package C ...
- HDU-5974
A Simple Math Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- jmp $
in intel x86 instruction set, "jmp $" means jump to this instruction location, thus fallin ...
- 微信小程序开发之带搜索记录的搜索框
实现功能:点击搜索框,有搜索记录时以下拉菜单显示,点击下拉子菜单,将数据赋值到搜索框,点击搜索图标搜索,支持清空历史记录,可手动输入和清空查询关键字, UI: wxml: <!--查询历史记录数 ...