ES6入门一:ES6简介及Babel转码器
- ES6简介
- Babel转码器
- Nodejs中使用ES6
- WebPack中使用ES6及Babel转码插件
一、ES6简介与转码
1.1一个常见的问题,ECMAScript和JavaScript到底是什么关系?
- 1996年11月,JavaScript的创造者——Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望JavaScript这种语言能够成为国际标准。
- 1997年,ECMA发布262号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为ECMAScript,这个版本就是ES1.0。
- ECMA全称European Computer Manufactuers Association,翻译过来的中文名叫做“欧洲计算机制造联合会”,这个组织的目标是评估,开发和认可电信和计算机标准。始建于1961年,但是为了建立统一的电脑操作格式标准--包括程序语言和输入输出的组织。
一个常见的追问,为什么使用ECMAScript这个名称,而不是JavaScript?
- 一是商标问题:Java是Sun公司的注册商标,根据授权协议,只有Netscape公司可以合法的使用JavaScript这个名字,而且JavaScript本身也已被Netscape公司注册为商标。
- 二是语言所有归属问题:ECMAScript这个名称体现出这门语言的制定者是ECMA,而不是Netscape,这样有利于保证这门语言的开放性和中立性。
所以,ECMAScript和Javascript的关系是,前者是后者的规格,后者是前者的一种实现。另外ECMAScript方言还有JScript和ActionScript。
1.2ES6与ECMAScript2015的关系?
ECMAScript2015简称为ES2015。2011年ECMAScript 5.1版本发布,6.0版本开始制定,ES6这个词原意指javascript的下一个版本。但是由于这个版本引入的版本语法太多,而且制定过程中还有很多组织和个人提交新功能。因此,不可能在同一个版本里包含所有将要引进的功能。常规的做法是先发布6.0版本,然后过段时间发布6.1,6.2,6.3.....版本。但是标准委员会为了让标准升级成为常规流程,让任何人在任何时候都可以提交新语法提案,然后标准委员会每个月开一会,评估这些提案是否可以接受,需要哪些改进。经过多次会议后,如果一个提按足够成熟便可进入标准。然后,每年6月发布一次标准。
ES6第一个版本就这样在2015年6月发布,正式名称是《ECMAScript2015标准》(简称ES2015)。通常ES6被泛指为ES5.1版本的下一代标准,涵盖ES2015、ES2016、ES2017等。也有人称ES2016为ES7、ES2017为ES8,以这样的方式描述的化今年的ES2019就是ES10。
注:ECMAScript迭代的目的是为了让JS语言能用于编写复杂的大型应用程序,成为企业级开发语言。
TC39(Technical Committee 39)是一个推动JavaScript发展的委员会,github连接:https://github.com/tc39,官方网站:https://tc39.es/如有兴趣了解最新JS提案可以查看这两个网站。
欧洲计算机制造商协会官网:https://www.ecma-international.org
1.3Babel转码器
由于浏览器还存在一些对新语法的支持,特别是在老版本的浏览器上,为了在开发中可以使用新的语法在浏览器和其他环境中可以执行,可以借助转码工具将新语法转码成ES5,来实现生产开发的统一性,但是不是所有新语法都可以被转码的。
新的语法并不改变语言的特性,只是在原有的语法基础上新增一些语法糖。只是为了增加代码的可读性,从而减少代码的出错机会。
Babel官网:https://www.babeljs.cn/
Babel在线工具:https://www.babeljs.cn/repl
配置安装及说明:
npm init -y //初始化项目配置(自动生成一个package.json文件)
npm install @babel/core --save-dev //在当前工作区间安装babel/core插件
npm install @babel/cli --save-dev //在当前工作区间安装babel/cli插件
npm install @babel/preset-env --save-dev //在当前工作区间安装babel/preset-env插件
npm install @babel/polyfill --save-dev //在当前工作区间安装babel/plyfill插件
@babel/core :babel核心工具包,用来将JS代码转换成抽象语法树
@babel/cli :babel手脚架,用来开启指定调用插件编译代码
@babel/preset-env:babel具体解析ES6语法的工具集合,这个集合只用来解析新的js语法,不转换新的API
@babel/polyfill :babel用来解析新的API,比如:Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局对象,以及一些定义在全局对象上的方法(比如Object.assign、Array.from)。这里有一篇使用教程:https://blog.csdn.net/qq_21294095/article/details/88812344
配置文件.babelrc
该文件用来设置转码规则和插件,基本格式如下:
{
"presets": [
//预设编译插件
"@babel/preset-env"
],
"plugins": [
//引用外部编译插件
]
}
测试babel编译:
let a = 10; //在当前工作区间下创建一个index.js文件并写入这行代码
使用bebel/cli命令编译index.js文件
npx babel index.js -o compiled.js
编译完成后会在当前工作区间下新增一个compiled.js文件,文件里面的内容如下:
"use strict"; var a = 10;
--watch实现时实监听编译,就是只需要编译一次后,只要在修改源文件,编译文件就会自动生成最新的代码
npx babel index.js -o compiled.js --watch
ES7语法的编译插件(支持私有属性):
在class中写静态属性并赋值的方式,是ES7的写法,在老版本的浏览器中不能识别(报错),我是用最新的chrome浏览器已经能识别。但是,目前来讲浏览器能不能识别并不重要,因为我们在使用ES6还是ES7的时候都会使用编译工具进行降级,在babel中我使用的7.5.5版本都不支持编译示例中的静态属性的语法,在编译的时候回报以下错误:
Support for the experimental syntax 'classProperties' isn't currently enabled (2:11):
1 | class Foo{
> 2 | static e = [1,2,3];
| ^
3 | static bar(){
4 | return "bar";
5 | }
但同时,在后面babel也提示了能编译这个语法的插件:
Add @babel/plugin-proposal-class-properties (https://git.io/vb4SL) to the 'plugins' section of your Babel config to enable transformation.
下载插件:
npm install @babel/plugin-proposal-class-properties --save-dev
然后在(.babel文件中配置,这种模式任选一种配置,这里我选择了宽松模式):
//严格模式
{
"plugins": ["@babel/plugin-proposal-class-properties"]
}
//宽松模式(我测代码时使用了这个)
{
"plugins": [
["@babel/plugin-proposal-class-properties", { "loose": true }]
]
}
关于插件的配置详细手册可以查看babel的官方手册:https://babeljs.io/docs/en/babel-plugin-proposal-class-properties
私有方法的插件:
使用私有方法时,babel编译器还需要一个的插件:
npm install @babel/plugin-proposal-private-methods --save-dev
然后,再.babel文件中配置:
{
"presets":[
"@babel/preset-env"
],
"plugins": [
["@babel/plugin-proposal-private-methods", { "loose": true }] //引入支持编译私有方法的插件
]
}
详细可以了解:https://babeljs.io/docs/en/babel-plugin-proposal-private-methods#via-cli
ES7装饰器(Decorator)转码插件:
npm install --save-dev @babel/plugin-proposal-decorators
在.babelrc中配置装饰器:
{
"plugins": [
["@babel/plugin-proposal-decorators", { "legacy": true }],
["@babel/plugin-proposal-class-properties", { "loose" : true }]
]
}
装饰器配置手册:https://babeljs.io/docs/en/babel-plugin-proposal-decorators#legacy
一个装饰器问题:https://github.com/WarnerHooh/babel-plugin-parameter-decorator/issues/1
...未完待续。
ES6入门一:ES6简介及Babel转码器的更多相关文章
- ES6标准简介之Babel转码器解说
ES6是ECMAScript 6的简称,是JavaScript语言的下一代标准,现在基于jquery库的前端开发js所使用的标准是ES5(ECMAScript 5).ES6已于2015年6月正式发布. ...
- Babel 转码器 § es6转换es5
Babel 转码器 § es6转换es5 实时转码 / Repl -babel-node / babel-register(自动转码引入babel-register模块) 配置文件.babelrc ...
- ES6转ES5(Babel转码器)
ES6转ES5(Babel转码器) 前提:必须在VScode中已经安装了Node.js 官网:https://nodejs.org/en/ 一.安装命令行转码工具 npm install --glob ...
- 使用babel转码器,让浏览器支持es6语法
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,可是很多浏览器并不支持es6语法,所以我们需要一个转码工具, 把es6的语法转换成浏览器支持的javascr ...
- es6 babel转码器安装配置及常见命令
示例:在d盘,新建文件夹es6,文件夹里新建一个文件es6.js. (1)先全局安装babel-cli,输入命令npm install babel-cli -g (2)输入d:( 进入d盘),再输入c ...
- Babel转码器
Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在现有环境执行.这意味着,你可以用ES6的方法 编写程序,又不用担心现在环境是否支持.
- 在项目中ES6语法转ES5语法 babel转码器
es6 babel 安装以及使用 1,安装好node(需要使用npm包管理工具) 2,在本地项目路径下npm init,格式化成功后会在项目下生成一个配置文件package.json 3,本地安装 ...
- ES6入门十二:Module(模块化)
webpack4打包配置babel7转码ES6 Module语法与API的使用 import() Module加载实现原理 Commonjs规范的模块与ES6模块的差异 ES6模块与Nodejs模块相 ...
- ES6 入门系列 - 函数的扩展
1函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法. function log(x, y) { y = y || 'World'; console.log( ...
随机推荐
- [BZOJ1076] 奖励关
Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的 ...
- Android WebSocket实现即时通讯功能
最近做这个功能,分享一下.即时通讯(Instant Messaging)最重要的毫无疑问就是即时,不能有明显的延迟,要实现IM的功能其实并不难,目前有很多第三方,比如极光的JMessage,都比较容易 ...
- .NET Core 3.0 里新的JSON API
为什么需要新的JSON API? JSON.NET 大家都用过,老版本的ASP.NET Core也依赖于JSON.NET. 然而这个依赖就会引起一些版本问题:例如ASP.NET Core某个版本需要使 ...
- vue内使用echarts
18年下班年用的vue + echarts,现在才想起来总结,着实不敬业 线上的项目叫股往(http://rich.xchol.com/#/) 好了,进入正题: 首先,需要新建一个vue的项目,在vu ...
- 10.Nginx流行架构LNMP
1.什么是LNMP架构 LNMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写.L指Linux,N指Nginx,M一般指MySQL,也可以指MariaDB,P一般指PHP,也可以 ...
- Java 中的 final、finally、finalize 有什么不同?
Java 中 final.finally.finalize 有什么不同?这是在 Java 面试中经常问到的问题,他们究竟有什么不同呢? 这三个看起来很相似,其实他们的关系就像卡巴斯基和巴基斯坦一样有基 ...
- MySQL GROUP_CONCAT()函数 -- 字段合并查询
在做查询的时候遇到一个问题,今天分享一下解决方法. 先看一下我想要什么效果. 清单名称类型要点,后面两列为清单步骤(外键表) 但我并不想让主表的内容重复那么多遍,于是 distinct去重.子查询.左 ...
- human_pose_estimation_demo的再进一步研究
这次研究的主要是速度问题,后来还获得了其它方面的收获. 1.原始的抽帧 对于这样一个问题,想提高速度,能够想到的最简单.最直接的方法就是“抽帧”.比如添加一个计数器 这里,只有当Sumof ...
- FastJson的使用心得
本文为早前整理,参考文献已找不到,如有侵权请与我联系,添加参考链接. 一丶基本使用 1.1主要API fastjson入口类是com.alibaba.fastjson.JSON,主要的API是JS ...
- F#周报2019年第44期
新闻 Elmish.WPF教程 介绍Orleans 3.0 GC配置历史 介绍ONNX运行时1.0 介绍微软Q&A(预览) 使用App中心持续布署与监控你的UWP,WPF与Windows Fo ...