# Gulp
一个工具,用自动化构建工具增强你的工作流程!让开发变的简单快的工具,基于文件流的构建系统
关于 gulp API, 常用的也就四个 src, dest, series, parallel
# 安装
# 全局安装
npm install --global gulp-cli
# 项目安装
yarn add -D gulp
1
2
3
4
2
3
4
gulp 启动需要指定 gulpfile.js 文件
# 走个 demo 起步
项目 IDE: VS Code
# 终端中 创建 gulp-example 项目
mkdir gulp-example
# 进入项目中
cd gulp-example
# 创建项目
yarn init -y
# 安装 gulp
yarn add -D gulp
# 创建 gulp 配置文件
touch gulpfile.js
# 创建一个用于测试的 入口文件
echo 'console.log("hello world")' > index.js
# code path vscode 终端快捷键
code .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
文件的目录结构大概是这样
.
├── gulpfile.js
├── index.js
├── node_modules
├── package.json
└── yarn.lock
1
2
3
4
5
6
2
3
4
5
6
# 编写 gulpfile.js
小试身手,copy index.js 文件到 dist 目录下
const { series, src, dest } = require('gulp')
function copyIndex() {
return src('index.js')
.pipe(dest('dist'))
}
// 注册任务
exports.copyIndex = series(copyIndex)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
之后执行 gulp copyIndex 会得到这样的结果
.
├── dist
│ └── index.js
├── gulpfile.js
├── index.js
├── node_modules
├── package.json
└── yarn.lock
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
这样就完成了简单的 gulp 的一个流水线控制, 实际项目中可能需要用到很多的依赖,但都是在管道 pipe 中执行,根据自己的需求灵活调整插件,插件根据自己需求添加
# 看个实战项目配置
这是一个 ts 的项目,需要热更,同时可能会有一些样式文件
" line-numbers-mode">const { series, parallel, src, dest } = require('gulp')
// 构建浏览器可以运行的环境
const browserify = require("browserify");
// 访问 typescript 编译器的能力, 是 Browserify 的插件,就像 gulp-typescript
const tsify = require("tsify");
// 调整 browserify 输出格式能被 gulp 流式访问
const source = require("vinyl-source-stream");
// 引入 watch
const watch = require("gulp-watch");
// 压缩 js 使用
const uglify = require("gulp-uglify");
// 生成代码映射
const sourcemaps = require("gulp-sourcemaps");
// 生成 buffer
const buffer = require("vinyl-buffer");
// 观察 js 变化自动更新
const watchify = require("watchify");
// log
const fancy_log = require("fancy-log");
// 重命名
const rename = require("gulp-rename")
// 启动一个 http 服务
const browserSync = require("browser-sync").create()
const reload = browserSync.reload
const config = {
entries: './src/core/index.ts',
output_dir: 'example',
output_name: 'tinydb.js',
index_dir: './',
skin: {
entry: './src/skin/index.css',
output_dir: 'example'
}
}
// gulp 任务流程
const typescript = watchify(
browserify({
basedir: ".",
debug: true,
entries: [config.entries],
cache: {},
packageCache: {},
}).plugin(tsify)
.transform('babelify', {
presets: ["es2015"],
extensions: [".ts"],
})
)
typescript.on("update", bundle);
typescript.on("log", fancy_log);
function bundle() {
return typescript
.bundle()
.on("error", fancy_log)
.pipe(source(config.output_name))
.pipe(buffer())
.pipe(sourcemaps.init({ loadMaps: true }))
.pipe(sourcemaps.write("./"))
.pipe(dest(config.output_dir))
.pipe(reload({stream:true}))
}
function build() {
return src('./example/tinydb.js')
.pipe(uglify())
.pipe(rename({
suffix:'.min'
}))
.pipe(dest('./example/'))
}
function devServer() {
browserSync.init({
server: {
baseDir: config.index_dir,
tunnel: true
}
})
}
function watch_file() {
watch('./src/skin/**/*.css', () => {
css()
reload()
})
watch('./*.html', () => {
reload()
})
}
function css() {
return src(config.skin.entry)
.pipe(dest(config.skin.output_dir))
.pipe(reload({stream:true}))
}
exports.default = parallel(bundle, css, devServer, watch_file)
exports.build = series(build)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
← 如何创建一个自己的cli husky →