第879期使用 Babel 和 Gulp 搭建 ES6 开发环境

Posted 前端早读课

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第879期使用 Babel 和 Gulp 搭建 ES6 开发环境相关的知识,希望对你有一定的参考价值。

前言

这是《从零开始构建 javascript 技术栈》第三篇,不知道你开始动手了吗?今天早读文章继续由 @pd4d10 带来翻译授权分享。

正文从这开始~

我们将使用 ES6 语法,它相比于 ES5 有了很大改进。到目前为止,几乎所有的浏览器和 JS 运行环境都支持 ES5,但不是所有的都支持 ES6。所以我们将使用一个叫做 Babel 的工具,将 ES6 代码转换成 ES5 代码。为了运行 Babel,我们需要 Gulp。它类似于 package.json 的 scripts 中的任务,但是将任务写在 JS 文件中比使用 JSON 文件更简单清晰。我们将安装 Gulp 和 Gulp 的 Babel 插件:

  • 运行 yarn add --dev gulp

  • 运行 yarn add --dev gulp-babel

  • 运行 yarn add --dev babel-preset-latest

  • 运行 yarn add --dev del(执行 clean 任务使用的包)

在 package.json 中增加一个 babel 字段,添加如下代码将使用最新的 Babel 配置:

"babel": {
 "presets": [
   "latest"
 ]
},

注意:你也可以使用根目录下的 .babelrc 文件来保存 Babel 配置。随着项目变得复杂,根目录的文件将越来越多,所以我们在 package.json 中保存 Babel 的配置。

将 index.js 移动到一个名为 src 的新文件夹,用于存放 ES6 代码,编译后的 ES5 代码存放在 lib 文件夹。Gulp 和 Babel 会帮我们完成编译。删除 index.js 中有关 color 的代码,将其替换为以下更简单的版本:

const str = 'ES6';
console.log(`Hello ${str}`);

这里用到了模板字符串,这是一个 ES6 中的新功能,可以直接使用 ${} 在字符串中插入变量。有一点需要注意,模板字符串使用的是反引号。

新建 gulpfile.js 文件,包含以下内容:

const gulp = require('gulp');
const babel = require('gulp-babel');
const del = require('del');
const exec = require('child_process').exec;

const paths = {
 allSrcJs: 'src/**/*.js',
 libDir: 'lib',
};

gulp.task('clean', () => {
 return del(paths.libDir);
});

gulp.task('build', ['clean'], () => {
 return gulp.src(paths.allSrcJs)
   .pipe(babel())
   .pipe(gulp.dest(paths.libDir));
});

gulp.task('main', ['build'], (callback) => {
 exec(`node ${paths.libDir}`, (error, stdout) => {
   console.log(stdout);
   return callback(error);
 });
});

gulp.task('watch', () => {
 gulp.watch(paths.allSrcJs, ['main']);
});

gulp.task('default', ['watch', 'main']);

让我们花点时间来理解这一大段代码。

Gulp 本身的 API 很简单。使用 gulp.task 定义一系列的任务,使用 gulp.src 读取文件,使用 .pipe()(这里是 babel())进行一系列的处理,并将使用 gulp.dest 输出处理后的文件。可以使用 gulp.watch 监听文件的更改。 将一个数组(如 ['build'])作为第二个参数传递给 gulp.task,可以定义这个任务的依赖,在执行这个任务之前先执行他依赖的任务。更详细的介绍请参阅Gulp 的文档。

首先,定义一个 paths 对象来存储我们需要文件路径,这样可以并保持 DRY(不要重复自身)。

然后,定义 5 个任务: build, clean, main, watch 和 default。

  • build 任务读取 src 下的所有文件,使用 Babel 转换,将转换后的文件写入到 lib 下。

  • clean 任务用于在每次执行 build 之前删除 lib 文件夹下的所有内容。这是一个很有用的任务。当你重命名或删除了 src 下的一些文件,这个任务可以帮助你清除旧的编译文件。如果你不小心构建失败了,这能确保 lib 文件夹与 src 文件夹下的内容保持同步,即使你并不知道构建失败了。使用 del 删除文件,它遵循 Gulp 的流式处理方式(这是Gulp 推荐的方式)。

  • main 任务与之前章节里提到的 node . 是等价的。不过这次我们希望执行 lib/index.js。我们已经知道 Node 默认会去找 index.js 文件,所以运行 node lib 即可(在这里我们定义了一个变量 libDir,来保持 DRY)。

  • require('child_process').exec 和 exec 是 Node 中的原生方法,用于执行 shell 命令。将 stdout 的内容转发到 console.log() 中,如果报错了,使用 gulp.task 的回调函数返回错误。你可能觉得不能彻底理解这部分内容,不用担心,只需要记住一点, 这个任务相当于执行了 node lib。

  • watch 任务监听文件改动,当有文件内容发生变化时,执行 main 任务。

如果你直接从命令行调用 gulp,将默认运行 default 任务。在这个例子中,我们希望它运行 watch 和 main(首次执行)。

注意:你可能会感到奇怪,这个 Gulp 文件中的代码使用了一些 ES6 语法,我们并没有用 Babel 转换它,但它并没有报错。这是因为我们使用的 Node 版本支持某些 ES6 功能(确保你的 Node 版本大于 6.5.0,版本可以通过 node -v 查看)。

好!我们做完了。看下程序是不是能跑起来。

  • 在 package.json 中,将 start 脚本改成 "start": "gulp"。

  • 运行 yarn start,将会打印 "Hello ES6" 并开始监听文件的更改。你可以试试在 src/index.js 中写一些有语法错误的代码,看下 Gulp 是不是报错了。

  • 添加 /lib/ 到 .gitignore 文件中

最后,你可能还需要:



关于本文

译者:@pd4d10

译文:https://github.com/pd4d10/js-stack-from-scratch/tree/master/tutorial/3-es6-babel-gulp

以上是关于第879期使用 Babel 和 Gulp 搭建 ES6 开发环境的主要内容,如果未能解决你的问题,请参考以下文章

第641期基于 webpack 搭建前端工程基础篇

`babel-preset-react` 不使用 gulp 转换 jsx

第1553期 TypeScript 和 Babel:一场美丽的结合

gulp常用插件之gulp-babel使用

如何在gulp项目中优雅的使用ES6

第168期gulp详细入门教程