什么是babel
什么是babel
babel是一款基于node开发的工具,其功能是对es6的新语法和新特性进行转码。
#babel7的改进
babel7把各个功能进行了拆分到了不同的包中,所以我们需要对各个包的功能了解,比较常用的有以下
@babel/cli : 提供了命令 babel
@babel/core : 核心包
@babel/preset-env : 核心的es6语法转换
@babel/polyfill : 垫片 arr.reduce()
@babel/runtime
@babel/plugin-transform-runtime
@babel/plugin-transform-xxx
#@babel/cli
@babel/cli是babel提供的内建的命令行工具,主要是提供babel这个命令来对js文件进行编译,这里要注意它与另一个命令行工具@babel/node的区别,首先要知道他们二者都是命令行工具,但是官方文档明确对他们定义了他们各自的使用范围:
@babel/cli 是一个适合安装在本地项目里,而不是全局安装
使用@babel/cli编译
npx babel test.js
@babel/node 跟node cli类似,不适用在产品中,意味着适合全局安装
使用@babel/node编译
babel-node test.js
#@babel/core
这个包是babel功能实现的核心,也就是说核心的方法都放在了这个包里边了。现在你试着用上述的转码方法转换的时候,你会发现报这样的错误:
提示找不到该@babel/core
这个包
这个时候我们需要安装该包,命令如下:
npm install @bable/core -D
现在,尝试转码!
// index.es6.js
const user = 23;
let [length] = [];
const add = (a, b) => a + b;
执行转码命令
babel index.es6.js index.es5.js
发现转码后的index.es5.js
文件内容如下:
// index.es5.js
const user = 23;
let [length] = [];
const add = (a, b) => a + b;
现在执行转码是没报错了,但是貌似没有任何变化呀!
#plugins
什么原因呢?
前边提过,babel7的时候把各个功能都拆分到不同的包里边去了,比如说需要把箭头函数转换成普通函数,就需要有对应的包去实现这个功能。这个包就是 @babel/plugin-transform-arrow-functions
类似于这样的包,在babel
里被叫做plugins
我们再试一次
- 安装
@babel/plugin-transform-arrow-functions
npm install -D @babel/plugin-transform-arrow-functions
- 执行转码命令
babel index.es6.js index.es5.js --plugins @babel/plugin-transform-arrow-functions
此时,我们去查看index.es5.js
内容如下:
// index.es5.js
const user = 23;
let [length] = [];
const add = function (a, b) {
return a + b;
};
我们发现箭头函数转换成功了,但是const
,let
之类的还是没成功,那么针对它们转码的包是@babel/plugin-transform-block-scoping
请自行添加尝试。如果想要知道所有的插件请点击下边的链接
如果插件很多的话,直接在命令行中输入很麻烦,那么babel给我们提供了两种方式来配置插件
- 在项目根目录创建
.babelrc
文件,内容如下:
{
"plugins": [
"@babel/plugin-transform-arrow-functions",
"@babel/plugin-transform-block-scoping"
]
}
- 在项目根目录创建
babel.config.js
,内容如下:
let plugins = [
"@babel/plugin-transform-arrow-functions",
"@babel/plugin-transform-block-scoping"
]
module.exports = {plugins}
这两种配置方法都可以让我们的命令行不用写这么多内容
#presets : 预设
在理解了plugins
之后,接下来要说一说presets
,现在我们在使用plugins
已经很方便了,但是每次配置的时候,都要写一堆的插件还要下载依然是很麻烦的,这个时候presets
的作用就出来了,presets
说好听点叫预设,说直白点叫插件包,它能够帮我们提前把一些要用到的插件归类好。
也就是说presets
中包含了我们所需要的常用插件,如果你想要自定义一些插件,你可以presets
和plugins
配合在一起使用
常用的presets
列表如下
- @babel/preset-env : es6语法
- @babel/preset-flow : flowjs
- @babel/preset-react : react
- @babel/preset-typescript : ts
配置的时候,是跟plugins
配置在一起的,如下
实时监听
npx babel ./babel -odist.js -w //./babel ---> dist.js -w:实时监听
- 使用
.babelrc
{
"presets": [
"@babel/preset-env",'@babel/preset-react'
],
"plugins": [
]
}
- 使用
babel.config.js
const plugins = [];
const presets = [];
module.exports = {plugins,presets}
#@babel/polyfill
polyfill
我们又称垫片,见名知意,所谓垫片也就是垫平不同浏览器或者不同环境下的差异
因为有的环境支持这个函数,有的环境不支持这种函数,解决的是有与没有的问题,这个是靠单纯的@babel/preset-env
不能解决的。
@babel/preset-env
解决的是将高版本写法转化成低版本写法的问题,因为不同环境下低版本的写法有可能不同而已。
在这个包中给我们提供了浏览器一些高级特性的方法实现,比如findIndex
这个方法在低版本语言中是不存在的,那么我们需要手动实现这个方法,那么这个方法的实现已经把放进了@babel/polyfill
这个包中。
所以,我们只要在项目引入这个包即可
index.es6.js
require('@babel/polyfill')//arr.reduce
// ....
#@babel/runtime
因为babel在转码的时候可能会生成一堆的helper
(辅助函数),这些helpler
被全部放在了@babel/runtime
这个包里边。如果没有安装@babel/runtime
在转码的时候,这些helper
会直接生成在代码中。如果同样的特性都进行转码的话,会造成代码冗余。这也正是@babel/runtime
存在的原因。
#@babel/plugin-transform-runtime
用了@babel/runtime
只能保证提供了helper
,但是还需要我们引入到我们的项目中。而@babel/plugin-transform-runtime
就是来干这个事情的。
配置如下:
{
"plugins": [
"@babel/plugin-transform-runtime"
]
}
#后续内容敬请期待....
什么是babel的更多相关文章
- babel presets stage-x
在一些新框架的代码中,常基于es6/7标准来书写代码.鉴于这些标准被没有被浏览器广泛支持,我们一般使用babel来将使用e6/7标准书写的代码降级编译(或者说转译)为浏览器可解析的es4/5代码. 以 ...
- ES6转换器之Babel
ES6部分功能没有支持,所以想学习ES6,得先有个转换器,就是将ES6的代码转换为ES5. 我这里用的是Gulp + Bable的形式来将ES6转换为ES5的. 前提: (1).Gulp和Bable都 ...
- Babel:JavaScript编译器
一.介绍: Babel是一个Javascript编译器,可以将ES6语法转换成ES5. 这意味着,你可以现在就用ES6编写程序,而不用担心现有环境是否支持.下面是一个例子: //转码前: input. ...
- 学习 React(jsx语法) + es2015 + babel + webpack
视频学习地址: http://www.jtthink.com/course/play/575 官方地址 https://facebook.github.io/react/ 神坑: 1.每次this.s ...
- Sublime插件支持Sass编译和Babel解析ES6 & .sublime-build文件初探
用Sublime Text蛮久了,配置配来配去的,每次换电脑都得重头再配过,奈何人老了脑子不中用了,得好好整理一些,下次换电脑就有得参考了.. 同事说,他的WebStorm简直太方便,自身集成了很多方 ...
- Babel下的ES6兼容性与规范
前端开发 Babel下的ES6兼容性与规范 ES6标准发布后,前端人员也开发渐渐了解到了es6,但是由于兼容性的问题,仍然没有得到广泛的推广,不过业界也用了一些折中性的方案来解决兼容性和开发体系问 ...
- 【前端】在Gulp中使用Babel
Install $ npm install --save-dev gulp-babel babel-preset-es2015 用法1: const gulp = require('gulp'); c ...
- 使用 Babel + React + Webpack 搭建 Web 应用
话不说直接上正题. 环境搭建 Babel--目前浏览器对于ES6的语法解析支持度还不高,所以要通过转码在编译,所以在使用ES6之前要安装Babel,之前安装的时候遇到了一些问题但是没有全部记录下来,现 ...
- Babel 学习
一,为了更明白地使用Babel, 先了解Babel 的发展过程. 现在Babel的版本是6, 相对于以前的版本, 它做了重大更新: 1, 模块化:所有的内部组件都变成了单独的包.打开Babel在Git ...
- 利用Babel来转化你的ES2015脚本初步
我们在前面已经安装和学习过babel 安装babel-cli 这是babel解释器的客户端主程序 npm install -g babel-cli 安装”编译”插件(babel的JSX语法转换器) n ...
随机推荐
- SpringBoot使用策略模式+工厂模式
为了防止大量的if...else...或switch case代码的出现,可以使用策略模式+工厂模式进行优化. 在我的项目当中,报表繁多,所以尝试了这种方式进行优化报表的架构.代码很简单,如下: Fa ...
- CG-CTF RSAEASY
最近学习rsa涨了不少新知识,这次遇到了一个比较简单但是需要想想的题目,因为发现网上没有查到wp就想写一下提供一些思路. 首先题目给了n,p-q,e,然后n很大,无法使用工具分解,呢么感觉肯定是利用p ...
- 牛客练习赛60E 旗鼓相当的对手
dsu on tree 题目链接 点我跳转 题目大意 给你一棵以\(1\)为根节点,包含\(n\)个节点的树和一个参数 \(k\),求每个节点的"\(rating\)" \(rat ...
- 在 Spark 数据导入中的一些实践细节
本文由合合信息大数据团队柳佳浩撰写 1.前言 图谱业务随着时间的推移愈发的复杂化,逐渐体现出了性能上的瓶颈:单机不足以支持更大的图谱.然而,从性能上来看,Neo4j 的原生图存储有着不可替代的性能优势 ...
- 怎么用MindManager自带的模板和设计画思维导图
小编知道大家平时工作学习都很忙,思维导图能完成的效率越高越好.所以今天,小编就为大家介绍两个能高效使用思维导图软件完成制作思维导图的小技巧.保证内容充实美观,还不费时间. 一.使用模板 打开MindM ...
- Mybatis是如何封装Jdbc的?
JDBC六个步骤 Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //1. 加载驱动 C ...
- 关于CopyOnWriterArrayList的一些理解
学了cowarraylist之后,有些不明白的地方, 1.我们为什么要用写时复制的策略呢?,这样每次不是都要复制吗,性能不是很低吗?直接在元素组上扩容不好吗?而且读的时候数据一致性也保证不了,如果只是 ...
- jmeter压测mysql数据库
jmeter连接并压测mysql数据库,之前一直想用jmeter一下测试mysql数据库的性能,今天偶然看到一篇博客,于是乎开始自己动手实践. 一.准备工作 1.安装好mysql数据库,可以安装在本地 ...
- 为什么90%的大学都要求计算机专业学习C语言?
编程语言是编程的工具,计算机相关专业的学生必须具备足够的编程能力.当然,关于"最好语言"的争论从来没有休止过,这里要强调一下:语言的选择真的没那么重要,学习语言的过程最重要是语言的 ...
- Python命令行参数定义及注意事项
在命令行中运行python代码是很常见的,下面介绍如何定义命令后面跟的参数. 常规用法 Python代码中主要使用下面几行代码来定义并获取需要在命令行中赋值的参数: import argparse p ...