Babel 7 初探
最近在做项目的依赖的清理,看到babel 已经升级7.9了,而我对babel的认知还停留在6时代,觉得需要重新学习一下了。
我们都知道, Babel是转译工具,它能把最新的javaScript的语法,转化成旧的js 的语法。转译的核心则在于插件,提供给babel 什么插件,babel 就会转译什么。如果我们提供了转化箭头函数的插件,babel 遇到箭头函数就会把它转化成普通函数。新建一个项目babel-learning, 在其中建一个src目录,在src 下建index.js, (mkdir babel-learning && cd babel-learning && mkdir src && cd src && touch index.js), 最好再建一个package.json 文件(cd .. && npm init -y),管理项目依赖。使用babel 进行转译,要安装哪些依赖呢?
@babel/cli babel 命令集合,在命令行中直接调用babel 命令,对文件进行编译,如果使用webpack,那就不用它,要用babel-loader.
@babel/core, babel的核心,它负责转译js 语法,但单独使用它,却起不到转译的作用,需要你给它提供插件。也就是说,如果只安装@babel/core, 调用babel 命令进行转译,文件会原模原样地进行输出,转译后的文件和原文件一模一样。
npm i @babel/core @babel/cli --save-dev 试一试,这里要注意,babel 7 把babel依赖包的名称给重新写了,以前是 babel-,现在是@babel/,安装完成后,在index.js 文件中随便写一个箭头函数,
const sum = (a, b ) => a + b;
然后在命令行中调用babel 命令 npx babel src --out-dir dist,npx可以直接调用node_modules 中的命令,--out-dir 表示输出到什么地方, 当然也可以在package.json 的script 中写入"babel": "babel src --out-dir dist" ,再npm run babel 调用babel 命令。看一下打包后的index.js 可以发现是没有任何变化。
提供转译箭头函数的插件, npm i @babel/plugin-transform-arrow-functions --save-dev, 安装完成后,调用babel 命令的时候,怎么让babel 使用这个插件呢?有两种方式,一种是在命令行后面加--plugins, 一种是配置文件。最好使用配置文件吧,因为添加和修改插件都比较方便。配置文件的命名也改了,原来是.babelrc, 现在官方建议是babel.config.json. touch babel.config.json
{ "plugins": ["@babel/plugin-transform-arrow-functions"] }
{ "presets": [ "@babel/preset-env" ] }
{ "presets": [ "@babel/preset-env" ], "plugins": [ "@babel/plugin-proposal-decorators" ] }
.browserslistrc 文件,一个是package.json, 一个是@babel/preset-env options,如果使用options, presets中的每一项就要变成数组,数组的第一项是使用的preset, 第二项是该preset的参数置"presets": [ [ "@babel/preset-env", { "targets": { "chrome": "58" } } ] ]
"targets": { "chrome": "58", "ie": "11" }
const promise = new Promise()
useBuiltIns 和 corejs 实现的。useBuiltIns有三个取值
"presets": [ [ "@babel/preset-env", { "targets": { "chrome": "58", "ie": 11 }, "useBuiltIns": "entry", "corejs": 3 } ] ]
使入entry,那就在项目的入口文件index.js 中 import 'core-js'
import 'core-js'; const promise = new Promise();
npm run babel, 可以发现引入了450个小的polyfill . 这时把ie: 11 去掉,你会发现只引入了100多个polyfill, 确实是按需要加载。
把entry 改成 usage, 并且把index.js 中的import 'core-js' 去掉
{ "targets": { "chrome": "58", "ie": 11 }, "useBuiltIns": "usage", "corejs": 3 }
npm run build 你会发现,在编译后的index.js 中开头部分只引入了2个关于promise 的polyfill。当你再把ie:11 去掉,那就只引入了一个polyfill
原文地址:https://www.cnblogs.com/SamWeb/p/12992110.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MySQL InnoDB表空间加密
- 微信小程序自动化测试最佳实践(附 Python 源码)
- 3分钟短文 | MySQL在分组时,把多列合并为一个字段!
- Redis Linux系统参数最佳配置
- 实现Promise其它API
- 使用sysbench进行压测 Part1 sysbench安装
- Java并发编程(07):Fork/Join框架机制详解
- PostgreSQL Pgbouncer 到底怎么使用,疗效有多大
- 微信练手小程序源码 - 日历(含各种功能组件)
- Redis 5.0.8安装
- Redis 主从搭建
- Redis 5.0.8 主从+哨兵的搭建
- ammo.js-bullet物理引擎碰撞检测
- TKE上动态部署jenkins slaves
- CVE-2017-0261及利用样本分析