手把手教你搭建ES6的开发运行环境


Posted in Javascript onJuly 11, 2017

前言

ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

其实当ES5还没有完全普及时,ES6就接踵而来了,在发布之后的将近一年内,很多小伙伴都踊跃的学习这门新的语言,之所以说是一门新的语言,是因为跟ES5相比,语法方面变化确实有点大,可以说新的JavaScript语法看上去有种脱胎换骨的感觉。博主也曾跃跃欲试,看了很多语法方面的教程,可是无奈浏览器还未完全支持ES6的规范,只看不练,有种眼高手低的感觉,相信朋友们也会有同样的心情,那么怎样可以愉快的写ES6代码,进而将学到的东西转化成实践呢,别担心,今天我们就来学习ES6构建方面的知识,并搭建一个简单的学习环境。 下面话不多说了,来一起看看详细的介绍。

首先需要介绍一个ES6开发利器:Babel。

Babel是一个编译器,负责将源代码转换成指定的语法的目标代码,可以使之很好的在运行环境中执行我们的代码。下面我们就来详细介绍这个神器,利用它来编译我们的ES6代码。

Babel给我们提供了一个很方便的命令行工具:babel-cli,利用它我们可以在命令行中执行编译命令,我们只需使用npm来安装它即可:

npm install -g babel-cli

除此之外,我们还需要安装转码规则包,Babel支持很多语法的转码,比如我们想要将ES6转换成ES5,那么需要安装babel-preset-es2015包,如果我们想要编译React源码,就需要安装babel-preset-react,这里我们需要安装babel-preset-es2015。为此我们创建一个babel-test目录,在这个目录里我们创建两个目录,es6和js,分别用于放置ES6源代码和编译后的ES5目标代码,然后我们使用“npm init ?yes”命令生成一个默认的package.json文件,babel-test目录结构如下图所示: 

手把手教你搭建ES6的开发运行环境 

然后在当前目录执行下面这行命令安装ES6转码规则包:

npm install babel-preset-es2015 --save-dev

在es6目录中我们创建了一个test.es6文件用于写入ES6源代码,Babel编译源文件时没有过多的限制,所以我们也可以选择使用js或es作为文件后缀名。现在我们将下面这段ES6代码写入到test.es6中:

let name = 'Scott';
let greeting = `hello ${name}`;
console.log(greeting);

接下来我们就可以来运行babel的命令编译我们的ES6源代码了:

babel es6/test.es6 --out-file js/test.js --presets es2015

这行命令的含义是:编译es6下面的test.es6文件,输出文件为js下面的test.js,同时指定编译规则包为es2015。命令执行完成后,我们会在js目录中找到一个test.js文件,如图所示: 

手把手教你搭建ES6的开发运行环境 

看以看到,上面的ES6语法已经被编译成ES5的语法了,这个文件就可以被加载到现有的运行环境执行了。另外,如果我们也可以编译整个目录的源文件,只需指定“?out-dir”参数即可:

babel es6 --out-dir js --presets es2015

这行命令的作用是对整个es6目录中的文件进行编译,编译结果输出到js目录,如下图所示: 

手把手教你搭建ES6的开发运行环境 

到目前为止,我们仍手动执行babel命令编译源代码,并且我们使用了全局的babel-cli库,这显然不是最好的解决方案。如果我们checkout出一个项目,必须要先在全局安装babel-cli库才能运行,我们不希望有这样的依赖。另外不同的项目依赖库的版本可能都不同,全局的babel-cli库也不能保证兼容各个项目中其他依赖库的版本。除此之外,每次手动运行编译命令也太繁琐了,我们希望将babel-cli库安装到本地,并且使用一个简单的命令执行编译任务。

首先我们需要在本地安装babel-cli库:

npm install babel-cli --save-dev

现在我们可以卸载全局的babel-cli库了:

npm uninstall -g babel-cli

最后,我们需要在package.json里面修改一下scripts:

"scripts": {
 "compile": "babel es6 --out-dir js --presets es2015"
}

修改完成之后,我们就可以使用npm来运行这个编译任务了,只需下面一条简单的指令即可:

npm run compile

上面只是利用babel将ES6源代码编译成JS,在开发中,我们还需要考虑更多东西,比如模块化开发、自动编译和构建等等。接下来,我们就搭建一个简单的ES6开发环境,来支持ES6学习阶段的开发。

首先,我们创建一个简单的应用,它包含一个index.html和es6目录,es6目录中又包含hello.es6和main.es6两个文件,在构建完成后,会多出js和bundle两个目录,分别放置编译后的JS代码和打包后的bundle文件: 

手把手教你搭建ES6的开发运行环境 

其中,hello.es6定义了greet函数,而main.es6是入口文件,下面是相关的代码:

//hello.es6

function greet(name) {
 return new Promise((resolve, reject) => {
 setTimeout(() => {
 resolve('hello ' + name);
 }, 1000);
 });
}

exports.greet = greet;
//main.es6

import "babel-polyfill";

import {greet} from './hello';

greet('Scott').then((greeting) => {
 document.getElementById('container').innerHTML += greeting;
});

document.getElementById('container').innerHTML = 'I am greeting: ';

可以看到,hello.es6中使用了ES6的箭头函数和Promise来定义一个greet函数,模拟1秒后返回一个hello开头的字符串,而main.es6中引入了hello.es6并调用了greet函数,最后将结果刷新到DOM元素中。

要使这两个源代码文件生效,首先需要把它们编译成JS,然后再将JS文件打包,现在我们就来使用gulp的方式构建这个过程。

要完成这个任务,我们需要先安装相关的依赖包:

"devDependencies": {
 "babel-polyfill": "^6.9.1",
 "babel-preset-es2015": "^6.6.0",
 "gulp": "^3.9.1",
 "gulp-babel": "^6.1.2",
 "gulp-browserify": "^0.5.1",
 "gulp-connect": "^3.2.2",
 "gulp-rename": "^1.2.2",
 "gulp-sync": "^0.1.4",
 "gulp-uglify": "^1.5.3"
}

其中,babel-polyfill是ES6的补丁,由于babel只支持ES6语法部分的编译,对于新增的类我们还需要安装额外的polyfill,虽然现在Chrome和Firefox都已经添加了Promise等新增的类,但为了兼容旧版本的浏览器,这里还是安装比较好。

然后,我们就创建几个简单的tasks,下面是gulpfile.js的代码:

var gulp = require('gulp');
var babel = require('gulp-babel');
var connect = require('gulp-connect');
var browserify = require('gulp-browserify');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var gulpsync = require('gulp-sync')(gulp);

gulp.task('compile-es6', function() {
 return gulp.src('app/es6/*')
 .pipe(babel({
 presets: ['es2015']
 }))
 .pipe(gulp.dest('app/js'));
});

gulp.task('pack-js', function() {
 return gulp.src('app/js/main.js')
 .pipe(browserify())
 .pipe(rename('bundle.js'))
 .pipe(gulp.dest('app/bundle'));
});

gulp.task('compress-bundle', function() {
 return gulp.src('app/bundle/bundle.js')
 .pipe(uglify())
 .pipe(rename('bundle.min.js'))
 .pipe(gulp.dest('app/bundle'));
});

//build source files to released bundle file
gulp.task('build', gulpsync.sync(['compile-es6', 'pack-js', 'compress-bundle']), function() {
 if (process.argv.pop() == '--dev') {
 //watch any change and then re-run the tasks
 gulp.watch('app/es6/*', gulpsync.sync(['compile-es6', 'pack-js', 'compress-bundle']));
 }
});

//run a server listening at port 8000
gulp.task('server', function() {
 connect.server({
 root: 'app',
 port: 8000,
 livereload: true
 });
});

最后,只需在命令行中执行两个命令就可以了:

gulp build --dev
gulp server

第一个命令我们是指定了开发模式,开发模式会监听es6目录中的文件改动,并重新构建;而第二个命令是用来启动一个服务,在8000端口监听。

上面的项目已放到Github上,感兴趣的同学可以去看一下,也可以克隆到本地亲自试一试。

github地址:https://github.com/scottliu2011/es6-dev

本地下载地址:http://xiazai.3water.com/201707/yuanma/es6-dev(3water.com).rar

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JQuery 学习笔记 选择器之三
Jul 23 Javascript
js获取单选框或复选框值及操作
Dec 18 Javascript
表单验证的完整应用案例探讨
Mar 29 Javascript
Node.js中的模块机制学习笔记
Nov 04 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
Mar 20 Javascript
Windows下用PyCharm和Visual Studio开始Python编程
Oct 26 Javascript
JS操作COOKIE实现备忘记录的方法
Apr 01 Javascript
利用Node.js制作爬取大众点评的爬虫
Sep 22 Javascript
vue构建单页面应用实战
Apr 10 Javascript
jquery登录的异步验证操作示例
May 09 jQuery
解决vue-router 切换tab标签关闭时缓存问题
Jul 22 Javascript
js实现限定范围拖拽的示例
Oct 26 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
Jul 11 #Javascript
react-native 封装选择弹出框示例(试用ios&android)
Jul 11 #Javascript
vue.js内部自定义指令与全局自定义指令的实现详解(利用directive)
Jul 11 #Javascript
javascript 玩转Date对象(实例讲解)
Jul 11 #Javascript
使用jQuery实现动态添加小广告
Jul 11 #jQuery
Vue中父组件向子组件通信的方法
Jul 11 #Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
Jul 11 #Javascript
You might like
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
coreseek 搜索英文的问题详解
2013/06/08 PHP
php抛出异常与捕捉特定类型的异常详解
2016/10/26 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
面向对象的javascript(笔记)
2009/10/06 Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
2012/01/15 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
详解Node.js串行化流程控制
2017/05/04 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
详解Vue结合后台的列表增删改案例
2018/08/21 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
Python实现大文件排序的方法
2015/07/10 Python
深入理解python中的闭包和装饰器
2016/06/12 Python
Python冒泡排序注意要点实例详解
2016/09/09 Python
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
Python识别快递条形码及Tesseract-OCR使用详解
2019/07/15 Python
python 遍历pd.Series的index和value
2019/11/26 Python
Python网络爬虫四大选择器用法原理总结
2020/06/01 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
娇韵诗加拿大官网:Clarins加拿大
2017/11/20 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
.net软件工程师应聘上机试题
2015/03/10 面试题
linux面试题参考答案(5)
2016/11/05 面试题
家长写给老师的建议书
2014/03/13 职场文书
《有趣的发现》教学反思
2014/04/15 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
车间主任岗位职责
2015/02/03 职场文书