VSCode插件-使用 gulp 打包插件
# 0.前言
在对 VSCode
进行插件国际化的时候,官方对此没有任何说明文档,只是给了一个国际化的Demo
(即, i18n-sample
这个案例)。在所有的VSCode
开发体系中,并不是使用Webpack
进行打包构建的,无论是源码工程还是插件均是使用的 gulp
构建工具。因此,学习使用 gulp
是 VSCode
插件开发中必不可少的一部分。
本篇博客基本上是 gulp中文网-quickStart (opens new window) 的概括总结,网络上大部分有关 gulp
的教程均是v3
版本的代码,更多细节详见官方文档。
# 1.基础使用
基础使用步骤:
创建
gulp
任务:创建
gulpfile.js
文件,或者在文件夹下创建gulpfile/index.js
文件。该文件中需要编写待执行的
task
任务,具体写法请见下小节。执行:在终端输入
gulp
命令。gulp <task1> <task2> <task3> # 执行多个任务
1如果直接输入
gulp
,默认执行gulp default # 等价于 gulp
1
# 2.task
的创建
在 gulp
中创建 task
常用的有两种方式:
新版(
gulp v4
):使用exports
导出的方式const gulp = require('gulp') const hello = cb =>{ console.log("hello"); cb() // 注:没有任何return 时,需要显式调用 回调 函数。 } module.exports.hello = hello
1
2
3
4
5
6
7老版的写法:
gulp.task("name",(cb)=>{cb()})
目前仍能兼容运行,但官方已不再推荐此写法。
const gulp = require('gulp') gulp.task('hello', (cb) => { console.log('hello'); cb() })
1
2
3
4
5
以下均按照 exports
导出的方式(写法一)进行叙述。
task
按照是否可以被 gulp
指令执行,可分为两类:
- 可被
gulp <task>
执行,称为public task
- 不可执行被
gulp
执行,但是可作为内部task
使用。
具体区别就在于,是否被exports
导出:
// public task 遵循 commonJS 模块规范导出
function task1(cb) {
// gulp v4版本在结束时必须运行下回调函数,
// 否则会报:The following tasks did not complete
// 关于当前 task 是否结束,请看后续章节。
// 这一部分,非常像 mocha 中的 done 函数,必须在异步任务结束时调用 done()
cb();
}
exports.build = build;
2
3
4
5
6
7
8
9
task
根据组织结构,可分为:并行 parallel()
、串行 series()
。
const { series,parallel } = require('gulp');
const javascript = (cb) => {
// body omitted
cb();
}
const css = (cb) => {
// body omitted
cb();
}
// task 的简单组合:
exports.default = parallel(javascript, css);
exports.default = series(javascript, css);
// task 的复杂组合:
exports.default = series(
clean,
parallel(
cssTranspile,
series(jsTranspile, jsBundle)
),
parallel(cssMinify, jsMinify),
publish
);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
注:在对并行和串行进行组合时,需要保证串行和并行同时调用调用到的
<task>
不能同时执行,即一个task
在同一时间段内仅允许被调用一次。
# 3.task
异步执行说明
在新版的gulp
中默认所有的task
都是异步的,因此在编写时,必须手动通知gulp
是否继续执行或结束。
无
return
时,且无异步任务const hello = (cb) => { cb() } module.exports.hello = hello
1
2
3
4无
return
时,且有异步任务,一般有两种方式:方法一:将
cb
函数显式传递下去const fs = require('fs'); const passingCallback = (cb) => { fs.access('gulpfile.js', cb); // 需要将 cb 显式传递下去 } exports.default = passingCallback; // fs.access 的使用: fs.access(path[, mode], callback)
1
2
3
4
5
6方法二:将异步任务使用
async
和await
封装const fs = require('fs'); async function asyncAwaitTask() { const { version } = fs.readFileSync('package.json'); console.log(version); await Promise.resolve('some result'); // 通过 await 控制执行结果 } exports.default = asyncAwaitTask;
1
2
3
4
5
6
7
8使用
return
:可以将stream
、promise
、child process
等六类数据传递下去。// 返回 stream (最常用) function streamTask(){ return gulp.src("*.js").pipe(gulp.dest('out')) } // 返回 promise function promiseTask() { return Promise.resolve('the value is ignored'); } // 返回 child process const { exec } = require('child_process'); function childProcessTask() { return exec('date'); } exports.promiseTask = promiseTask; exports.promiseTask = promiseTask; exports.childProcessTask = childProcessTask;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 4.实用插件整理
以下主要总结了在开发 VSCode
插件过程中使用到的一些 gulp
插件。
const gulp = require('gulp'); //引用gulp
const del = require('del'); //引用 gulp 删除插件
const uglify = require('gulp-uglify'); //引用压缩 Js 插件
const css = require('gulp-clean-css'); //gulp 压缩 css 文件
const rename = require("gulp-rename"); //引用重命名插件
const typescript = require('typescript'); //需要与 gulp-typescript 搭配使用
const ts = require('gulp-typescript'); //可以对 ts 代码进行转化
const nls = require('vscode-nls-dev'); //VSCode 插件国际化(开发环境)
const es = require('event-stream'); //Node中对 流 的处理
const sourcemaps = require('gulp-sourcemaps');// 添加source Maps
2
3
4
5
6
7
8
9
10
# 5.总结
本篇博客是对官网快速上手的总结:
在
gulpfile.js
或者index.js
中编写task
代码,在终端中输入gulp
可以运行以上代码。新版
task
默认所有任务都是异步任务,这与老版的gulp
的写法存在较大差异。如果当前task
无异步回调时,需手动截止任务,如cb()
。可以通过
gulp.series
或者gulp.parallel
控制异步任务的串行
或并发
执行。注:对于串行和并发这块,在编码时还有额外限制,请见官网示例代码。
最后给出目前在项目中已用到的一些
gulp
插件。
以上内容只是 gulp
简单上手使用,下一步计划继续写几篇博客记录gulp
实际开发示例。