当前位置: 首页 > news >正文

babel

babel 编译的阶段

babel 总共分为三个阶段:解析,转换,生成。

我们需要知道现在 babel 本身是不具备这种转化功能,提供这些转化功能的是一个个 plugin。所以我们没有配置任何 plugin 的时候,经过 Babel 输出的代码是没有改变的。

Plugin —— transform 的载体

Babel 自 6.0 起,就不再对代码进行转换。现在只负责图中的 parse 和 generate 流程,转换代码的 transform 过程全都交给插件去做。

 

@babel/preset-env(按需加载)

Preset 是什么? Preset 插件套餐,每个套餐里打包了不同的插件,这样安装套餐就等于一次性安装各类 babel 插件。

首先在项目下安装:

$ npm install --save-dev @babel/preset-env

然后修改 .babelrc:

{
  "presets": ["@babel/preset-env"]

}

 

plugins 与 presets 同时存在的执行顺序

  1. 先执行 plugins 的配置项,再执行 Preset 的配置项;

  2. plugins 配置项,按照声明顺序执行;

  3. Preset 配置项,按照声明逆序执行。

列入以下代码的执行顺序为:

  1. transform-es2015-template-literals

  2. stage-2

  3. env

// .babelrc 文件
{
    
"plugins"
: [
        
"transform-es2015-template-literals"
,  
// 转译模版字符串的 plugins
    ],
    
"presets"
: [
        [
"env"
, {
            
// 是否自动引入 polyfill,开启此选项必须保证已经安装了 babel-polyfill
            
// “usage” | “entry” | false, defaults to false.
            
"useBuiltIns"
: 
"usage"
        }], 
"stage-2"
]
}

  

 useBuiltIns 配置

我们可能在全局引入 babel-polyfill,这样打包后的整个文件体积必然是会变大的。

但是通过设置 "useBuiltIns":"usage" 能够把 babel-polyfill 中你需要用到的部分提取出来,不需要的去除。

useBuiltIns 参数说明:

  1. false: 不对 polyfills 做任何操作

  2. entry: 根据 target 中浏览器版本的支持,将 polyfills 拆分引入,仅引入有浏览器不支持的 polyfill

  3. usage(新):检测代码中 ES6/7/8 等的使用情况,仅仅加载代码中用到的 polyfills

 

@babel/polyfill(完整模拟es2015+,体积庞大)

babel 编译过程处理第一种情况 - 统一语法的形态,通常是高版本语法编译成低版本的,比如 ES6 语法编译成 ES5 或 ES3。而 babel-polyfill 处理第二种情况 - 让目标浏览器支持所有特性,不管它是全局的,还是原型的,或是其它.

安装 babel-polyfill

$ npm install --save @babel/polyfill

使用 babel-polyfill

我们需要在程序入口文件的顶部引用 @babel-polyfill

require('@babel/polyfill')
[].findIndex('babel')

或者使用 ES6 的写法:

import '@babel/polyfill'
[].findIndex('babel')

需要注意的是,babel-polyfill 不能多次引用。如果我们的代码中有多个 require('@babel/polyfill'),则执行时会报告错误;

 

@babel/plugin-transform-runtime(按需引入,打包体积小,不能兼容实例方法)

我们首先安装插件:(@babel/plugin-transform-runtime需要依赖@babel/runtime)

$ npm install --save-dev @babel/plugin-transform-runtime

然后再安装 babel-runtime:

$ npm install @babel/runtime

最后在 .babelrc 中配置:

{
"plugins": [
"@babel/plugin-transform-object-assign", //如果我们要使用object.assign()对于
@babel/plugin-transform-runtime这样配置,而babel-polyfill引入即可

"@babel/plugin-transform-runtime"
]
}

这样,我们不需要 babel-polyfill 也一样可以在程序中使用 Object.assign,编译后的代码最终能够正常运行在 IE 11 下。

提问:在经过 @babel/plugin-transform-runtime 的处理后,IE 11 下现在有 Object.assign吗?

答案是,仍然没有。

这正是 babel-polyfill 与 babel-runtime 的一大区别,前者改造目标浏览器,让你的浏览器拥有本来不支持的特性;后者改造你的代码,让你的代码能在所有目标浏览器上运行,但不改造浏览器。

转载于:https://www.cnblogs.com/celine-huang/p/11301703.html

相关文章:

  • 转载 对于struct file_operations中ioctl消失的学习笔记
  • SCUT - 77 - 哈利波特与他的魔法杖
  • 圆满完成 中大 《性能测试与LoadRunner应用》 实战训练课!
  • 利用vi编辑器创建和编辑正文文件
  • c# WinForm开发 DataGridView控件的各种操作总结(单元格操作,属性设置)
  • Simulation of AVL Trees (DYNAMIC)
  • hive中function函数查询
  • 更改Windwos server 2003 域用户密码策略默认配置
  • SCUT - 38 - 屠场的秘密 - 分解
  • 0 or 1 ?
  • 今天去面试.net开发,感想
  • fortinate防火墙使用本地用户三步开通PPTP ***
  • SCUT - 153 - 小马哥和他的山脉 - 线段树
  • SCUT - 31 - 清一色 - dfs
  • SCUT - 274 - CC B-Tree - 树形dp
  • .pyc 想到的一些问题
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 77. Combinations
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • oschina
  • PAT A1092
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 初探 Vue 生命周期和钩子函数
  • 从0实现一个tiny react(三)生命周期
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 开源SQL-on-Hadoop系统一览
  • 如何实现 font-size 的响应式
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 手机端车牌号码键盘的vue组件
  • 详解移动APP与web APP的区别
  • Spring第一个helloWorld
  • # 安徽锐锋科技IDMS系统简介
  • #《AI中文版》V3 第 1 章 概述
  • (备忘)Java Map 遍历
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET MVC 验证码
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • /proc/stat文件详解(翻译)
  • :not(:first-child)和:not(:last-child)的用法
  • @RequestParam详解
  • [Assignment] C++1
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [cogs2652]秘术「天文密葬法」
  • [Docker]五.Docker中Dockerfile详解
  • [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c
  • [Foreman]解决Unable to find internal system admin account
  • [hive] sql中distinct的用法和注意事项
  • [ISITDTU 2019]EasyPHP