babel-polyfill的几种使用方式
前言
preset与plugin的关系:
- preset中已经包含了一组用来转换ES6+的语法的插件,如果只使用少数新特性而非大多数新特性,可以不使用preset而只使用对应的
转换插件 - babel默认只转换语法,而不转换新的API,如需使用新的API,还需要使用对应的
转换插件或者polyfill
例如,默认情况下babel可以将
箭头函数,class等语法转换为ES5兼容的形式,但是却不能转换Map,Set,Promise等新的全局对象,这时候就需要使用polyfill去模拟这些新特性
1. 使用转换插件: babel-plugin-transform-xxx
- 使用方法
- 缺啥补啥,在
package.json添加所需的依赖babel-plugin-transform-xxx - 在
.babelrc中的plugins项指定使用babel-plugin-transform-xxx插件 - 代码中不需要显式
import/require,.babelrc中不需要指定useBuiltIns,webpack.config.js中不需要做额外处理,一切由babel插件完成转换
- 缺啥补啥,在
- 优点
- 作用域是模块,避免全局冲突
- 是按需引入,避免不必要引入造成及代码臃肿
- 缺点
- 每个模块内单独引用和定义polyfill函数,造成了重复定义,使代码产生冗余
配置完一个转换插件后, 代码中每个使用这个API的地方的代码都会被转换成使用
polyfill中实现的代码
2. 使用插件 babel-runtime 与 babel-plugin-tranform-runtime
相比方法1, 相当于抽离了公共模块, 避免了重复引入, 从一个叫core.js的库中引入所需polyfill(一个国外大神用ES3写的ES5+ polyfill)
- 使用方法
package.json中添加依赖babel-plugin-tranform-runtime以及babel-runtime.babelrc中配置插件:"plugins": ["transform-runtime"]- 接下来, 代码中可以直接使用ES6+的新特性,无需
import/require额外东西,webpack也不需要做额外配置
- 优点
- 无全局污染
- 依赖统一按需引入(polyfill是各个模块共享的), 无重复引入, 无多余引入
- 适合用来编写lib(第三方库)类型的代码
- 缺点
- 被
polyfill的对象是临时构造并被import/require的,并不是真正挂载到全局 - 由于不是全局生效, 对于实例化对象的方法,如
[].include(x), 依赖于Array.prototype.include仍无法使用
- 被
3. 全局babel-polyfill(不使用useBuiltIns)
- 使用方法
- 法3.1: (浏览器环境)单独在html的
<head>标签中引入babel-polyfill.js(CDN或本地文件均可) - 法3.2: 在
package.json中添加babel-polyfill依赖, 在webpack配置文件增加入口: 如entry: ["babel-polyfill",'./src/app.js'], polyfill将会被打包进这个入口文件中, 而且是放在文件最开始的地方 - 法3.3: 在
package.json中添加babel-polyfill依赖, 在webpack入口文件顶部使用import/require引入,如`import 'babel-polyfill'``
- 法3.1: (浏览器环境)单独在html的
- 优点
- 一次性解决所有兼容性问题,而且是全局的,浏览器的
console也可以使用
- 一次性解决所有兼容性问题,而且是全局的,浏览器的
- 缺点
- 一次性引入了ES6+的所有polyfill, 打包后的js文件体积会偏大
- 对于现代的浏览器,有些不需要polyfill,造成流量浪费
- 污染了全局对象
- 不适合框架或库的开发
4. 全局babel-polyfill(使用babel-preset-env插件和useBuiltIns属性)
- 使用方法
packge.json引入依赖babel-preset-env.babelrc中使用配置preset-env- 指定
useBuiltins选项为true - 指定浏览器环境或node环境, 配置需要兼容的浏览器列表
- 在
webpack入口文件中使用import/require引入polyfill, 如import 'babel-polyfill' - 以上配置完成之后,
babel会根据指定的浏览器兼容列表自动引入所有所需的polyfill, 不管你代码中有没有使用
- .babelrc示例
{
"presets": [
["env", {
"modules": false,
"targets": {
"browsers": ["ie >=9"]
},
"useBuiltIns": true,
"debug": true
}]
]
}
- 优点
按需(按照指定的浏览器环境所需)引入
polyfill, 一定程度上减少了不必要polyfill的引入配置简单, 无需对
webpack做额外的配置注意:
- 不可与方法3混用,否则会引起冲突
- 全局方式要保证
polyfill在所有其它脚本之前被执行(首行import或者设置为html的第一个<head>标签)
5. polyfill.io
- 一个
CDN方式提供的polyfill, 可根据浏览器UserAgent自动返回合适的polyfill, 详细内容自行google
作者:荣儿飞
链接:https://www.jianshu.com/p/3b27dfc6785c
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
babel-polyfill的几种使用方式的更多相关文章
- emitted value instead of an instance of error the scope attribute for scoped slots webpack babel polyfill
api20180803.vue emitted value instead of an instance of error the scope attribute for scoped slots h ...
- Web APi之认证(Authentication)两种实现方式【二】(十三)
前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...
- CSS垂直居中的11种实现方式
今天是邓呆呆球衣退役的日子,在这个颇具纪念意义的日子里我写下自己的第一篇博客,还望前辈们多多提携,多多指教! 接下来,就进入正文,来说说关于垂直居中的事.(以下这11种垂直居中的实现方式均为笔者在日常 ...
- Android中BroadcastReceiver的两种注册方式(静态和动态)详解
今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...
- Android中Fragment与Activity之间的交互(两种实现方式)
(未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...
- Android开发之基本控件和详解四种布局方式
Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方 ...
- 通过三个DEMO学会SignalR的三种实现方式
一.理解SignalR ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信(即:客户端(Web页面)和服务器端可以互相实时的通知消息 ...
- Hive metastore三种配置方式
http://blog.csdn.net/reesun/article/details/8556078 Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储.远端存储比较适 ...
- Hive的三种安装方式(内嵌模式,本地模式远程模式)
一.安装模式介绍: Hive官网上介绍了Hive的3种安装方式,分别对应不同的应用场景. 1.内嵌模式(元数据保村在内嵌的derby种,允许一个会话链接,尝试多个会话链接时会报错) ...
- HashMap两种遍历方式的深入研究
转自:http://swiftlet.net/archives/1259 HashMap的遍历有两种方式,如下所示:第一种利用entrySet的方式: 1 2 3 4 5 6 7 Map map ...
随机推荐
- 不能完整读取txt文件问题
txt文件内容 5 1.3 0.4 3.4 -1.7 16.7 0.89 14.17 4.8 1.34 0.42 3.36 -2 16.2 0.9 14.8 4.9 1.30 0.37 3.51 -1 ...
- Mybatis 基本使用
工程结构: 1.在test库创建表student(MySql数据库) 2.创建实体类Student.java package com.gdut.testMybatis.vo; public class ...
- 【转】xargs命令详解,xargs与管道的区别
为什么要用xargs,问题的来源 在工作中经常会接触到xargs命令,特别是在别人写的脚本里面也经常会遇到,但是却很容易与管道搞混淆,本篇会详细讲解到底什么是xargs命令,为什么要用xargs命令以 ...
- Python基础:数据类型-列表与元组(6)
Python中数据结构主要有序列.集合和字典. 1. 通用序列操作 Python内置了多种序列,其中最常用的两种:列表和元组.另一种重要的序列是字符串. 列表和元组的主要不同在于:列表是可以修改的,而 ...
- 基于.NET平台的Ocelot网关框架教程汇总
Ocelot 框架是基于.NET 开发的 API 网关,API网关是系统内部服务暴露在外部的一个访问入口,类似于代理服务器,就像一个公司的门卫承担着寻址.限制进入.安全检查.位置引导等工作,我们可以形 ...
- 关闭浏览器事件 onbeforeunload和onunload
在做毕设的时候,需要在关闭浏览器的时候向后台服务器修改用户在线状态.首先讲一下 onbeforeunload 和 onunload(都是在刷新或关闭时调用) 的区别: (1)onbeforeunloa ...
- oracle wm_concat 函数无法使用的情况下,使用LISTAGG()函数
http://dacoolbaby.iteye.com/blog/1698957 --20180327 重写wm_concat函数,解决行数超过上限问题 /*执行前请将APPS替换为当前登录用户*/ ...
- MarkDown&思维导图
从markdown文件创建思维导图 pzhaonet/mindr: an R package which converts markdown files (.md, .Rmd) into mindma ...
- [LVM]创建LVM卷
https://www.cnblogs.com/softidea/p/5147090.html
- LuoguP4233 射命丸文的笔记
题目描述 求所有\(n\)个点带标号强连通竞赛图中哈密顿回路数量的平均值. 题解 因为要求平均数,所以我们可以把分母和分子单开来算. \(n\)个点的所有竞赛图的所有哈密顿回路个数是可以求出来的,就是 ...