接触Gulp几个月了,对这款构建工具也越来越熟悉。于是逐渐发现了它的一些问题。
场景
设想以下常见场景,有如下三个task
:
build
:用于编译Sasscompress
:用于压缩CSSrelease
:执行build
和compress
,编译Sass并压缩CSS
这个场景十分常见,在开发环境下通过build
生成用户CSS进行调试,而在生产环境下则需要执行release
。
问题
众所周知gulp.run
接口已经弃用,官方API只剩下gulp.src
,gulp.dest
,gulp.task
,gulp.watch
四个。task
的启动只能通过命令行或者gulp.watch
触发。
幸运的是,尝试一下就会发现gulp.start
也是可以用于启动task
的。那么如上场景中的release
应该写成:
gulp.task('release', function() {
gulp.start(['build', 'compress']);
}
但是这样写明显是有问题的。由于gulp.start
并非顺次同步启动列表中的task
,设想当build
耗时较长时,实际执行顺序可能将会是:
Starting 'release'...
Starting 'build'...
Starting 'compress'...
Finishing 'build'...
Finishing 'compress'...
Finishing 'release'...
这样造成的问题是,compress
读取的CSS文件并非最新编译生成的版本,因此压缩所得的min.css文件并不是我们想要的。
要解决这个问题,就必须要build
完成后才启动compress
,因此有如下写法:
gulp.task('release', ['build'], function() {
gulp.start(['compress']);
}
这样确实能够避免上述的问题,但是很明显语义上并不符合逻辑:
Starting 'build'...
Finishing 'build'...
Starting 'release'...
Starting 'compress'...
Finishing 'compress'...
Finishing 'release'...
我们想要的难道不应该是这样吗:
Starting 'release'...
Starting 'build'...
Finishing 'build'...
Starting 'compress'...
Finishing 'compress'...
Finishing 'release'...
为了实现这个顺序,只有一种写法:
gulp.task('compress', ['build'], function () {
// compress
});
gulp.task('release', function () {
gulp.start(['compress']);
});
这样看起来就更奇怪了…compress
绝不应是依赖于build
的,而release
也绝不应是start compress
。
而就Gulp目前的语法来看,并没有什么好的解决办法。
总结
总的来说,Gulp目前的语法并不能很好的支持语义化的构建流程。我所希望的最好的解决方法是gulp.start
能够支持同步任务。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。