用Gulp、Babel等为浏览器构建ES6环境

568 查看

ECMAScript 6 是 JavaScript 的最新版本,它带来了很多新特性——一些是社区乞求已久的,一些是颇具争议的。但不管你如何看待 ES6,都应该学习并使用它——因为就是这么酷。由于能在服务器端控制 JavaScript 版本,所以 ES6 在 node.js 或其它服务端框架运行良好,但在客户端中则不尽人意了。从一个复杂的 angular 或 ember 应用到一个简单的静态页面基本都含有几行 jQuery 代码。

但为何在浏览器中应用 ES6 会如此艰难呢?因为对于客户端的 JavaScript,它能否执行完全取决于浏览器对它的支持程度。而且这不是你所能控制的,也许你的浏览器支持 ES6,但更多浏览器的支持程度很低,甚至完全不支持。即使现代浏览器最终都支持 ES6,我们仍不得不对使用旧浏览器的用户负责。所以距离我们能安全地编写 ES6 代码,并让浏览器直接执行的日子,还有很长一段时间。

难道这就让我们向命运低头吗?难道注定要因为浏览器不得不接受旧版本的 JavaScript 吗?不,我们不必接受这种限制!我们还有别的选择——现在最佳的选择是编写 ES6 代码,并将其转译(transpile)或编译为 ES5 代码(兼容所有现代浏览器,如IE9+)。Babel 是主流的转译工具,它让转译过程变得简单,我们打算让这过程自动化,所以我们甚至可以不用考虑上述的限制!

长话短说

如果你只想要简洁的描述和本文所用到的纯代码,下面就是:

我们将会创建一个 gulpfile 去监听文件的更改,并用 Babel 将 ES6 代码自动转换到 CommonJS,然后用 Browserify 将 CommonJS 转为 合法的 ES5。当然,我们也会添加额外的插件,如 UglifyJS (为了最小化),source maps 和 livereload —— 因为这些工具都超级有用。

简单粗暴,下面是完整的 gulpfile 文件:

这没你想象中糟糕吧!我们在上面尝试了很多不同的东西。如果你有兴趣学习它们,我会鼓励你继续往下阅读,去了解它们是如何运行和为什么会这样运行的,这无疑会为浏览器构建出更可靠的 ES6 代码。

开始我们的 Gulpfile

我们将选择 gulp 作为自动化构建工具。gulp 是基于 JavaScript 编写的工具,它能运行特定任务,并监听文件是否被更改。当然,这取决于你在本地项目的目录下的 gulpfile.js 配置文件。除了 gulp,还有其它自动化构建工具(grunt 也是流行的构建工具),但由于 gulp 基于 node 的流(streams)实现,因此速度更快。

首先,我们初始化 package.json,并本地安装 gulp(如果你未曾安装,也可全局安装):

然后,创建一个空白的 gulpfile.js,并填充如下骨架:

上面没什么特别的地方。我们创建了空的 buildwatchdefault 任务。build 任务应包含所有构建 JavaScript 代码的逻辑。watch 任务监控 src/js 文件夹下的文件是否被更改(构建后的文件会放在 dist/js 下)。

执行以上这些任务: