搭建ES6运行环境

      当ES5尚未彻底普及时,ES6就接踵而来了,2015年6月17日,ECMAScript 6发布正式版本,即ECMAScript 2015,咱们也简称它为ES6或ES2015。在发布以后的将近一年内,不少小伙伴都踊跃的学习这门新的语言,之因此说是一门新的语言,是由于跟ES5相比,语法方面变化确实有点大,能够说新的JavaScript语法看上去有种脱胎换骨的感受。博主也曾跃跃欲试,看了不少语法方面的教程,但是无奈浏览器还未彻底支持ES6的规范,只看不练,有种眼高手低的感受,相信朋友们也会有一样的心情,那么怎样能够愉快的写ES6代码,进而将学到的东西转化成实践呢,别担忧,今天咱们就来学习ES6构建方面的知识,并搭建一个简单的学习环境。 
首先须要介绍一个ES6开发利器:Babel。 
Babel是一个编译器,负责将源代码转换成指定的语法的目标代码,可使之很好的在运行环境中执行咱们的代码。下面咱们就来详细介绍这个神器,利用它来编译咱们的ES6代码。 
Babel给咱们提供了一个很方便的命令行工具:babel-cli,利用它咱们能够在命令行中执行编译命令,咱们只需使用npm来安装它便可:javascript

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转码规则包:html

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

在es6目录中咱们建立了一个test.es6文件用于写入ES6源代码,Babel编译源文件时没有过多的限制,因此咱们也能够选择使用js或es做为文件后缀名。如今咱们将下面这段ES6代码写入到test.es6中:java

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

 

接下来咱们就能够来运行babel的命令编译咱们的ES6源代码了:react

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”参数便可:es6

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

这行命令的做用是对整个es6目录中的文件进行编译,编译结果输出到js目录,以下图所示: 
 
到目前为止,咱们仍手动执行babel命令编译源代码,而且咱们使用了全局的babel-cli库,这显然不是最好的解决方案。若是咱们checkout出一个项目,必需要先在全局安装babel-cli库才能运行,咱们不但愿有这样的依赖。另外不一样的项目依赖库的版本可能都不一样,全局的babel-cli库也不能保证兼容各个项目中其余依赖库的版本。除此以外,每次手动运行编译命令也太繁琐了,咱们但愿将babel-cli库安装到本地,而且使用一个简单的命令执行编译任务。 
首先咱们须要在本地安装babel-cli库:shell

npm install babel-cli --save-dev

如今咱们能够卸载全局的babel-cli库了:npm

npm uninstall -g babel-cli

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

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

 

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

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端口监听。 

本文源自于转载。。。。

相关文章
相关标签/搜索