建立任务编译Sass,Autoprefix及缩小化 首先,我们设置编译Sass。我们将编译Sass、接著通过Autoprefixer,最后储存结果到我们的目的地。接著产生一个缩小化的.min 版本、自动重新整理页面及通知任务已经完成: 1 2 3 4 5 6 7 8 9 10 | gulp.task( 'styles' , function () {
return gulp.src( 'src/styles/main.scss' )
.pipe(sass({ style: 'expanded' }))
.pipe(autoprefixer( 'last 2 version' , 'safari 5' , 'ie 8' , 'ie 9' , 'opera 12.1' , 'ios 6' , 'android 4' ))
.pipe(gulp.dest( 'dist/assets/css' ))
.pipe(rename({suffix: '.min' }))
.pipe(minifycss())
.pipe(gulp.dest( 'dist/assets/css' ))
.pipe(notify({ message: 'Styles task complete' }));
});
|
继续下去之前,一个小小的说明。 1 | gulp.task( 'styles' , function () { ... )};
|
这个gulp.task API用来建立任务。可以透过终端机输入$ gulp styles 指令来执行上述任务。 1 | return gulp.src( 'src/styles/main.scss' )
|
这个gulp.src API用来定义一个或多个来源档案。允许使用glob样式,例如/**/*.scss 比对多个符合的档案。传回的串流(stream)让它成为非同步机制,所以在我们收到完成通知之前,确保该任务已经全部完成。 1 | .pipe(sass({ style: 'expanded' }))
|
使用pipe() 来串流来源档案到某个外挂。外挂的选项通常在它们各自的Github页面中可以找到。上面列表中我有留下各个外挂的连结,让你方便使用。 1 | .pipe(gulp.dest( 'dist/assets/css' ));
|
这个gulp.dest() API是用来设定目的路径。一个任务可以有多个目的地,一个用来输出扩展的版本,一个用来输出缩小化的版本。这个在上述的styles 任务中已经有展示。 我建议阅读gulp的API文件,以了解这些函式方法。它们并不像看起来的那样可怕!
JSHint,拼接及缩小化JavaScript希望你现在对于如何建立一个新的gulp任务有好想法。接下来,我们将设定脚本任务,包括lint、拼接及丑化: 1 2 3 4 5 6 7 8 9 10 11 | gulp.task( 'scripts' , function () {
return gulp.src( 'src/scripts/**/*.js' )
.pipe(jshint( '.jshintrc' ))
.pipe(jshint.reporter( 'default' ))
.pipe(concat( 'main.js' ))
.pipe(gulp.dest( 'dist/assets/js' ))
.pipe(rename({suffix: '.min' }))
.pipe(uglify())
.pipe(gulp.dest( 'dist/assets/js' ))
.pipe(notify({ message: 'Scripts task complete' }));
});
|
一件事提醒,我们需要指定JSHint一个reporter。这裡我使用预设的reporter,适用于大多数人。更多有关此设定,你可以在JSHint网站取得。 图片压缩接著,我们将设定图片压缩: 1 2 3 4 5 6 | gulp.task( 'images' , function () {
return gulp.src( 'src/images/**/*' )
.pipe(imagemin({ optimizationLevel: 3, progressive: true , interlaced: true }))
.pipe(gulp.dest( 'dist/assets/img' ))
.pipe(notify({ message: 'Images task complete' }));
});
|
这会将对所有来源图片进行imagemin 处理。我们可以稍微更进一步,利用快取保存已经压缩过的图片,以便每次进行此任务时不需要再重新压缩。这裡只需要gulp-cache外挂–稍早已经安装。我们需要额外设置才能使用这个外挂,因此修改这段程式码: 1 | .pipe(imagemin({ optimizationLevel: 3, progressive: true , interlaced: true }))
|
成为这段: 1 | .pipe(cache(imagemin({ optimizationLevel: 5, progressive: true , interlaced: true })))
|
现在只有新的或更动的图片会被压缩。乾淨俐落!
收拾乾淨在我们进行佈署之前,清除目的地目录并重建档案是一个好主意–以防万一任何已经被删除的来源档案遗留在目的地目录之中: 1 2 3 4 | gulp.task( 'clean' , function () {
return gulp.src([ 'dist/assets/css' , 'dist/assets/js' , 'dist/assets/img' ], {read: false })
.pipe(clean());
});
|
我们可以传入一个目录(或档案)阵列到gulp.src 。因为我们不想要读取已经被删除的档案,我们可以加入read: false 选项来防止gulp读取档案内容–让它快一些。
预设任务我们可以建立一个预设任务,当只输入$ gulp 指令时执行的任务,这裡执行三个我们所建立的任务: 1 2 3 | gulp.task( 'default' , [ 'clean' ], function () {
gulp.start( 'styles' , 'scripts' , 'images' );
});
|
注意额外传入gulp.task 的阵列。这裡我们可以定义任务相依(task dependencies)。在这个范例中,gulp.start 开始任务前会先执行清理(clean )任务。Gulp中所有的任务都是并行(concurrently)执行,并没有先后顺序哪个任务会先完成,所以我们需要确保clean 任务在其他任务开始前完成。 注意: 透过相依任务阵列来执行clean 而非gulp.start 是经过考虑的,在这个情境来看是最好的选择,以确保清理任务全部完成。
看守为了能够看守档案,并在更动发生后执行相关任务,首先需要建立一个新的任务,使用gulp.watch API来看守档案: 1 2 3 4 5 6 7 8 9 10 11 12 | gulp.task( 'watch' , function () {
gulp.watch( 'src/styles/**/*.scss' , [ 'styles' ]);
gulp.watch( 'src/scripts/**/*.js' , [ 'scripts' ]);
gulp.watch( 'src/images/**/*' , [ 'images' ]);
});
|
透过gulp.watch 指定想要看守的档案,并且透过相依任务阵列定义任务。执行$ gulp watch 来开始看守档案,任何.scss 、.js 或图片档案一旦有了更动,便会执行相对应的任务。
|