babel速览
babel
babel初衷
在es6出现之后,由于此版本的巨大改变,给人们带来了很多革命性的技术支持,但是当时很多浏览器对es6支持有限,babel就是为了达到写最新的语法,可以在任意浏览器运行而出现的。
实现原理简介
babel本质就是输入新代码输出旧代码,它属于编译原理的应用具体过程如下:
code -> AST 解析
modifyAST 修改
AST -> code 生成
原理由于是暂时入门,知道思想即可,以后再实践操作
语法编译
我们知道了其实babel是一个编译器,所有动作都会修改AST达到我们的目的,那么支持新语法,也是这个原理,如何提供修改的接口呢,babel引入了插件的概念,插件可以操作AST,这样就解决了扩展问题
所以,新语法都是有对应的插件的
这个时候我脑子想起来es6语法那么多,总不可能一个一个配置吧,放心,babel官方也想到了这个问题,开启了一系列的探索
.babelrc是babel的配置文件,语法需要配置presets选项
1.单个引入插件
优点:无
缺点:
- 配置繁琐
使用方法
// 安装
npm install --save-dev @babel/plugin-transform-arrow-functions
// 配置
{
"plugins": ["@babel/plugin-transform-arrow-functions"]
}
2.stage-x
这是根据ES目前提案的进展来安装一系列插件的
Stage 0 - 稻草人: 只是一个想法,经过 TC39 成员提出即可。
Stage 1 - 提案: 初步尝试。
Stage 2 - 初稿: 完成初步规范。
Stage 3 - 候选: 完成规范和浏览器初步实现。
Stage 4 - 完成: 将被添加到下一年度发布
低级的会包裹高级的
优点:
配置方便
缺点:
由于使用了非规范确定的语法,一旦语法提案发生重大改变,代码会受到重大影响
使用方法
npm install --save-dev @babel/preset-stage-0
{
"presets": ["stage-0"]
}
3.es201x
这个是每年更新一次,包括了标准规范的语法
优点:
配置少,风险少
缺点:
配置不够灵活,每年需要更换
使用
npm install --save-dev babel-preset-es2015
{
"presets": ["es2015"]
}
4.env
优点:
1.配置简单
2.无语法破坏风险
3.持续更新
4.更强大、灵活的配置方法
使用方法
npm install --save-dev @babel/preset-env
{
"presets": [
[
"@babel/preset-env"
]
]
}
API编译
env核心配置讲解
useBuiltIns
此选项要在代码入口顶层引入"@babel/polyfill
useBuiltIns: 'entry'
优点
不像默认导入,需要把整个polyfill导入,而是可以按照浏览器列表支持,选择性的加载
缺点
体积还是相对较大
npm install @babel/polyfill --save
import "@babel/polyfill";
此时可以根据browserslist配置根据运行环境编译语法

不配置browserslist的webpack打包大小
useBuiltIns: 'usage'
优点:
只有用到的才polyfill,可以说是完美了
缺点
不会探测引用node_modules代码,这部分不会提供polyfill,如果第三方包没有编译成兼容版本,就可能报错
npm install @babel/polyfill --save
import "@babel/polyfill";
此时会根据项目中引用到语法按需polyfill,体积较小

babel用法
原型开发
适合实时查看babel一些转译方案
浏览器纯编译
<div id="output"></div>
<!-- Load Babel -->
<!-- v6 <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> -->
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<!-- Your custom script here -->
<script type="text/babel">
const getMessage = () => "Hello World";
document.getElementById('output').innerHTML = getMessage();
</script>
node纯编译
require-hook
原理
拦截require行为,在require时对文件进行实时编译
用法
在应用入口
require("babel-register");
import "babel-register";
babel-cli
用法
npm install --save-dev @babel/core @babel/cli
增加npm脚本
"scripts": {
"build": "babel src -d lib"
}
搭配webpack或者gulp构建工具
这部分查看官方文档即可
gulp
var gulp = require("gulp");
var babel = require("gulp-babel");
gulp.task("default", function () {
return gulp.src("src/app.js")
.pipe(babel())
.pipe(gulp.dest("dist"));
});
webpack
module: {
rules: [
{ test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" }
]
}
babel速览的更多相关文章
- 面试反杀「GitHub 热点速览 v.21.33」
作者:HelloGitHub-小鱼干 作为一个应聘者,面试的时候经常会被面试官问:你有什么问题要问我吗?为了避免这种临时想不到问题的尴尬,reverse-interview-zh 会教你下反向操作,提 ...
- .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来
从该系列的第一篇文章 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 开始,不知不觉已经到第17篇了.每一次我们都是介绍一个小巧甚至微不足道的.NET平台的开源软件,或者学习,或 ...
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- .NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍
Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注重与机器 ...
- .NET平台开源项目速览(1)SharpConfig配置文件读写组件
在.NET平台日常开发中,读取配置文件是一个很常见的需求.以前都是使用System.Configuration.ConfigurationSettings来操作,这个说实话,搞起来比较费劲.不知道大家 ...
- .NET平台开源项目速览(12)哈希算法集合类库HashLib
.NET的System.Security.Cryptography命名空间本身是提供加密服务,散列函数,对称与非对称加密算法等功能.实际上,大部分情况下已经满足了需求,而且.NET实现的都是目前国际上 ...
- .NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)
今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinatorics组件的使用情况,其实这个组件我5年前就开始用了,非常方便,麻雀虽小五脏俱全.所以一直非常喜欢,才写了几 ...
- .NET平台开源项目速览(10)FluentValidation验证组件深入使用(二)
在上一篇文章:.NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(一) 中,给大家初步介绍了一下FluentValidation验证组件的使用情况.文章从构建间的验证器开 ...
- .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Software Protector序列号生成组件.今天就通过一篇简单的文章来预览一下其强大的功 ...
随机推荐
- 【PAT甲级】Public Bike Management 题解
题目描述 There is a public bike service in Hangzhou City which provides great convenience to the tourist ...
- Codeforces Round #597 (Div. 2) F. Daniel and Spring Cleaning 数位dp
F. Daniel and Spring Cleaning While doing some spring cleaning, Daniel found an old calculator that ...
- event.stopPropagation()和event.preventDefault()
1.event.stopPropagation()方法 这是阻止事件的冒泡方法,不让事件向documen上蔓延,但是默认事件任然会执行,当你掉用这个方法的时候,如果点击一个连接,这个连接仍然会被打开, ...
- golang之引用自己定义的包
初始目录如下: 其中main.go只有一个主函数main(),用于运行程序,array文件夹是自己定义的包,里面spArr.go位于package array. spArr中的函数名或变量首字母得大写 ...
- JdbcTemplate经典案例
一.JdbcTemplate案例配置式 (1)导入依赖 <dependency> <groupId>org.springframework</groupId> &l ...
- 创意编程,Python开发多功能壁纸自动切换工具!
import ctypes import time import requests import os from threading import Thread from tkinter import ...
- css 修改placeholder字体颜色字体大小 修改input记住账号密码后的默认背景色
壹 ❀ 引 本来这个阶段的项目页面都是给实习生妹子做的,我只用写写功能接接数据,但这两天妹子要忙翻译,这个工作阶段也快结束了导致有点慌,只能自己把剩余的几个小页面给写了. 那么做页面的过程中,UI也 ...
- Java中Array与ArrayList的10个区别
Array和ArrayList都是Java中两个重要的数据结构,在Java程序中经常使用.并且ArrayList在内部由Array支持,了解Java中的Array和ArrayList之间的差异对于成为 ...
- gcc 编译安装
wget https://kojipkgs.fedoraproject.org//packages/gcc/7.1.1/1.module_1a179a7b/src/gcc-7.1.1-1.module ...
- 玩下PHP的分词,最近有这个需求
找了个地方 下载代码 我是在这里下载的 https://www.jb51.net/codes/65593.html 1 下载完毕后 打开是这样的文件 2 先把代码集成到thinkphp3.2.3里 ...