[转] babel-present-env 与 babel-polyfill 学习总结
babelrc 配置文件
{
"presets": [
[
"env",
{
"modules": false,
"useBuiltIns": true,
"targets": {"browsers": ["last 2 versions", "safari >= 7", "ie>=9"]}
}
],
"stage-0",
"react"
],
"plugins": [
"syntax-dynamic-import",
[
"import",
{
"libraryName": "antd",
"style": "css"
}
]
]
}
babel-present-env
根据你支持的环境自动决定适合你的 Babel 插件的 Babel preset。它使用了 compat-table
在没有任何配置选项的情况下,babel-preset-env 与 babel-preset-latest(或者babel-preset-es2015,babel-preset-es2016和babel-preset-es2017一起)的行为完全相同。
它不会包含 stage-x 插件。env 将会支持我们认为最新版本的JavaScript的所有插件(过我们匹配在 babel-preset-latest 中所作的)。
这款preset能灵活决定加载哪些插件和polyfill,不过还是得开发者手动进行一些配置(targets)。
babel-polyfill
polyfill
的意思
polyfill这个单词翻译成中文是垫片的意思,详细点解释就是桌子的桌脚有一边矮一点,拿一个东西把桌子垫平。polyfill在代码中的作用主要是用已经存在的语法和api实现一些浏览器还没有实现的api,对浏览器的一些缺陷做一些修补。例如Array新增了includes方法,我想使用,但是低版本的浏览器上没有,我就得做兼容处理
理解polyfill的意思之后,再来说说babel为什么存在polyfill。
因为babel的转译只是语法层次的转译,例如箭头函数、解构赋值、class,对一些新增api以及全局函数
(例如:Promise)无法进行转译,这个时候就需要在代码中引入babel-polyfill,让代码完美支持ES6+环境。
前面介绍的babel-node就会自动在代码中引入babel-polyfill包。
- 但很多时候我们并不会使用所有ES6+语法,全局添加所有垫片肯定会让我们的代码量上升,之后会介绍其他添加垫片的方式。
transform-runtime
(transform-es2015-arrow-functions", //转译箭头函数
) 与babel-runtime
helpers
这种是按需进行polyfill
无需全局引入babel-polyfill
在一定程度上会减少代码体积
比较transform-runtime与babel-polyfill引入垫片的差异:
使用runtime是按需引入,需要用到哪些polyfill,runtime就自动帮你引入哪些,不需要再手动一个个的去配置plugins,
只是引入的polyfill不是全局性的,有些局限性。
而且runtime引入的polyfill不会改写一些实例方法,
比如Object和Array原型链上的方法,像前面提到的Array.protype.includes。
babel-polyfill就能解决runtime的那些问题,它的垫片是全局的,而且全能,
基本上ES6中要用到的polyfill在babel-polyfill中都有,它提供了一个完整的ES6+的环境。
babel官方建议只要不在意babel-polyfill的体积,最好进行全局引入,因为这是最稳妥的方式。
一般的建议是开发一些框架或者库的时候使用不会污染全局作用域的babel-runtime,
而开发web应用的时候可以全局引入babel-polyfill避免一些不必要的错误,
而且大型web应用中全局引入babel-polyfill可能还会减少你打包后的文件体积(相比起各个模块引入重复的polyfill来说)。
babel-polyfill 在项目代码前插入所有的 polyfill 代码,为你的程序打造一个完美的 es2015 运行环境。
babel 建议在网页应用程序里使用 babel-polyfill,只要不在意它略有点大的体积(min 后 86kb),直接用它肯定是最稳妥的。
值得注意的是,因为 babel-polyfill 带来的改变是全局的,所以无需多次引用,也有可能因此产生冲突,
所以最好还是把它抽成一个 common module,放在项目 的 vendor 里,或者干脆直接抽成一个文件放在 cdn 上。
回到应用开发。通过自动识别代码引入 polyfill 来优化看来是不太靠谱的,那是不是就无从优化了呢?
并不是。还记得 babel 推荐使用的 babel-preset-env 么?它可以根据指定目标环境判断需要做哪些编译。
babel-preset-env 也支持针对指定目标环境选择需要的 polyfill 了,只需引入 babel-polyfill,并在 babelrc 中声明 useBuiltIns,babel 会将引入的 babel-polyfill 自动替换为所需的 polyfill。
babel-present-env 的参数
useBuiltIns
1. 如果useBuiltIns为true,项目中必须引入babel-polyfill。
2. babel-polyfill只能被引入一次,如果多次引入会造成全局作用域的冲突。
做了个实验,同样的代码,只是.babelrc配置中一个开启了useBuiltIns,一个没有,两个js文件体积相差70k
https://github.com/Shenfq/studyBabel/tree/master/7-babel-env
useBuiltIns 可以根据之前的配置自行添加 polyfill,默认不开启。
安装 babel-polyfill 后只要引入一次就行:import "babel-polyfill";
- webpack2 的 tree shanking 技术
tree-shaking 都是因为 ES6 modules 的静态特性才得以实现的.
可以在编译阶段确定模块依赖
要在项目中使用这一技术需将 .babelrc 的 env 选项的 modules设为false, 即不需要babel处理es6模块,而交由webpack来处理
总结
- 由于有了
babel-present-env
才可以手动按需配置所需要的polyfill
babel-present-env
仅仅包括babel-present-2015、2016、2017
,不包括:babel-stage-x
,也不包括babel-polyfill
babel-present-env
仅仅转换 新版的语法 如:箭头函数
,并不转换新版api 如:Array.include
- 转换新版api及抹平浏览器之间的差异(兼容ie)需要
babel-polyfill
参考文章
[转] babel-present-env 与 babel-polyfill 学习总结的更多相关文章
- Babel 处理 webpack 无法处理的 ES 语法(Babel 6.x 和 Babel 7.x 有区别)(二)
//这是main.js是我们项目的js入口文件 //1:a导入jQuery,引入jQuery包用$变量接收,此方法与node中 const $ = require('jquery') 同 //此为ES ...
- typescript 的 polyfill 学习
我们知道typescript 是ES 超集.这意味着,不仅仅ES 的各种语法特性都会包括,还能保证通过typescript的编译服务可以很方便的转成ES向下兼容的版本,这得意于typescript强大 ...
- babel的使用及babel与gulp结合工作流
Babel 通过语法转换器支持最新版本的 JavaScript . 它有非常多的插件,这些插件能够允许我们立刻使用新语法,无需等待浏览器支持. 那我们怎么使用babel呢? 首先我们来了解babel基 ...
- typescript 的 polyfill 学习1-Class 继承篇
Class 继承 js 是多范式的编程语言,同样也是支持面向对象编程的,类 是面向对象中是很重要的概念. 区别于传统的java,c#基于模板的类,js是基于原型的. 类继承一般是通过原型链的方式来实现 ...
- 关于babel官网的学习
提起babel,前端er大概都不陌生.但是为什么要有babel呢?解决了什么问题?怎么使用babel呢?注意点在哪?以下就从这几个方面总结一下我关于babel学习的结果吧. 为什么要有babel呢? ...
- 学习 React(jsx语法) + es2015 + babel + webpack
视频学习地址: http://www.jtthink.com/course/play/575 官方地址 https://facebook.github.io/react/ 神坑: 1.每次this.s ...
- ES6学习(1)——如何通过babel将ES6转化成ES5
使用babel编译ES6 babel是一个工具,可以通过多个平台,让js文件从ES6转化成ES5,从而支持一些浏览器并未支持的语法. Insall babel $ sudo npm install b ...
- Babel学习小记
一.babel配置文件中的plugins和presets是什么? 1.首先说说babel是什么,babel是一个JavaScript转码器,帮助我们把浏览器不兼容的ES6语法转换成ES5语法: 2.接 ...
- Babel与Polyfill的关系和区别
很多同学搞不清楚babel与polyfill的关系以及区别,这儿给大家细致解惑. Babel:Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码.注意:Babel 默 ...
- 02.ElementUI源码学习:babel配置
书接上文,接下来项目将引入babel支持ES6+语法兼容. Babel 是一个工具链,主要用于将 ECMAScript 2015+ 版本的代码转换为向后兼容的 JavaScript 语法,以便能够运行 ...
随机推荐
- 用TextWriterTraceListener实现建议log文件记录
log4net之类3方组件确实很方便,但是想写个小小的demo之类的程序,有点用不起啊. 微软自带的TraceListener要实现一个简易的日志帮助类还是很简单的,直接上代码,自己备用,也希望对同样 ...
- oo总结
架构设计 第一次作业 需求分析 这次作业是针对类中的一些元素,如属性,操作,继承,实现等查询,所以这次的架构我们的第一感觉,按照正常的结构在类中存属性操作,继承的父类和实现的接口等. 具体功能 为了实 ...
- All boundaries are conventions, waiting to be transcended.
All boundaries are conventions, waiting to be transcended.所有界限都是陈规,等着被打破.
- JavaScript_8_比较,条件语句
1. 比较运算符 ==(值相等,类型可以不等), ===(值和类型必须都相等), !=, >, <, >=, <= 2. 逻辑运算符 &&.||.! 3. 条件 ...
- BZOJ 2119: 股市的预测 SA
2119: 股市的预测 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 434 Solved: 200[Submit][Status][Discuss ...
- 从程序猿到SAP产品经理,我是如何转型的?
文章作者:Jason Xia(夏建军) Jerry: 今天的文章来自Jason Xia, 我的老同事,和我一样从2007年进入SAP成都研究院工作至今.这篇文章讲述了Jason是如何从一名SAP资深开 ...
- linux yum安装指定版本mysql
1.下载mysql rpm包 cd /usr/local/src wget https://dev.mysql.com/get/mysql80-community-release-el7-.noarc ...
- 卓越管理的实践技巧(4)如何才能给予有效的反馈 Guide to Giving Effective Feedback
Guide to Giving Effective Feedback 前文卓越管理的秘密(Behind Closed Doors)最后一部分提到了总结的13条卓越管理的实践技巧并列出了所有实践技巧名称 ...
- CF Gym 100637K Microcircuits (DP)
题意:给你n个点,将这些点放在一个环上,问你不相交的连k条线的方案数.(没有重点) 题解:dp[i][j]表示i个点连j条线的方案数,那么新加一个点i, 情况1,i没有和之前的点相连,方案数为dp[i ...
- java基础—java对象的序列化和反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...