babel 配置
// 一,创建一个web项目
npm init
// 这个命令的目的是生成package.json
{
"name": "babel teset",
"version": "1.0.0",
"description": "babel test",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "andy",
"license": "ISC",
"devDependencies": {
"babel-cli": "^6.26.0",
"babel-preset-latest": "^6.24.1",
"babel-preset-react": "^6.24.1",
"babel-preset-stage-2": "^6.24.1"
}
}
//二,安装Babel相关的包
npm install babel-cli
// 最新转码规则
$ npm install --save-dev babel-preset-latest
// react 转码规则
$ npm install --save-dev babel-preset-react
// 不同阶段语法提案的转码规则(共有4个阶段),选装一个
$ npm install --save-dev babel-preset-stage-0
$ npm install --save-dev babel-preset-stage-1
$ npm install --save-dev babel-preset-stage-2
$ npm install --save-dev babel-preset-stage-3
//三,创建.babelrc 文件
该文件有presets是转码规则。
plugins指插件。
文件的内容如下所示:
{
"presets": [
"latest",
"react",
"stage-2"
],
"plugins": []
}
babel官网在线转 ES6 到 ES5
ES6代码转为ES5代码babel在线转换 es6转es5仍是颇有用的。有的时间项目不大,不用配置webpack,就是个单页文件,又想用es6语法,写完能够直接转换一下就OK了, 快捷方便。
2021年各大浏览器厂商对于ES6的支持情况
Firefox在ES规范之前就已经做了很多私有的语法制定,比如说迭代器,现在可以给对象指定个Symbol.iterator的key来实现一个迭代器,而FF很早就已经实现了形如obj["@@iterator"]=function(){}的迭代器。
所以ES6的标准,firefox的SpiderMonkey是实现最迅速的,而chrome的V8,却一直比较反复,特别是像Proxy这种特性,V8在大约一年半以前临时实现过一种,用了两个版本以后,突然彻底下架,然后一年多以来,这个Proxy的特性就一直没加回来,包括计划列表里都没有这玩意。
需要指出的是,题图里关于ES6的支持对比,firefox丢分在于没有支持class关键字,而Edge13却完整支持了ES6 class的语法糖,包括super。
其实class关键字一直存在于firefox的夜间版上面,可惜的是不知道什么原因,已经过了这么长的时间了,FF也没有把class移植到正式版上面。
其他FF相比于edge13丢分的在于内置对象的子类支持,就是形如class A extends Function这种,这个没的说,Edge13确实是领先其他浏览器。
但FF也有Edge13没有支持的一些特性,典型的比如:函数定义时的参数默认值,这种HTML注释JS的手段等等。
更何况FF还有一个很省事的语法糖:解构,这个解构语法就是FF那帮人造出来的,所以他们实现的最早,而其他浏览器也跟进的最慢,Edge13貌似现在也还未实现。
所以总体来说,这两个浏览器在特性支持上基本上在持平状态,FF如果把class从夜间版弄到正式版的话,就可以覆盖到90%了。
然后再来说说chrome和chrome家的v8,由于我常用node.js,所以对V8很关注,经常去v8的官方blog上逛逛,不得不说,v8对于ES6特性实现,是慢于edge和firefox,也就只能和safari家的JAVASCRIPT CORE比一比了。
首先是之前去掉后一直不加的Proxy,这个Proxy可以做很多魔法效果,比如说实现php那种__get__或者是ruby的method_missing,或者是实现单元测试里的mock,在很多场景上都能省事的,然后V8就是任性,开发蓝图上也对这个只字不提了。
然后是箭头函数,说来奇怪,在chrome的某一个版本上,它猛地实现了箭头函数这个特性,然后下一个版本直接取消了,随后一直到V8 3.5的时候才正式加上去,这个离其他浏览器实现箭头函数,已经差了一年时间了,node开发者很多都用coffeescript或者typescript去了……
然后是解构,至今还未实现。
然后是最近几个版本的作为:先是实现个三点号实参调用,也就是func(...arr),这个在V8 4.6的时候加入的唯一ES6新特性,然后V8 4.7加入的是三点号形参定义,也就是function func(...args){}这种,然而参数定义默认值这些特性,估计不知道哪年能实现。
然而node.js绑了V8已经导致了极难替换的局面,倒不是因为语言的引擎难以替换,而是周边的大量类库难以替换,所以node这边才会有一个nan的项目,让C/C++扩展能顺应V8那种快速变更API的流氓作法,而V8的API变化很快,有时候就为了改个名字…
开启chrome 实验javascript功能
chrome://flags/