手把手教你搭建ES6的开发运行环境
前言
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转码规则包:
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语法已经被编译成es5的语法了,这个文件就可以被加载到现有的运行环境执行了。另外,如果我们也可以编译整个目录的源文件,只需指定“–out-dir”参数即可:
babel es6 --out-dir js --presets es2015
这行命令的作用是对整个es6目录中的文件进行编译,编译结果输出到js目录,如下图所示:
到目前为止,我们仍手动执行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文件:
其中,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地址:
本地下载地址:
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。