Nodejs新人求教关于gulp的问题
Nodejs新人求教关于gulp的问题
最近在用gulp构建前端代码,遇到一个问题 gulp.task(‘imagemin’, function () { gulp.src(’./static/*/img/’) .pipe(imagemin({ progressive: true })) .pipe(gulp.dest(’./dist/image’)) .pipe(notify({ message: ‘Images task complete’ })); }); 这样我每压缩一张图片就会给出一个提示,我想让图片全部压缩完成之后给一个通知就行 请问应该如何做到?
当然可以!你提到的问题可以通过使用 gulp-sequence
插件来解决。gulp-sequence
可以帮助你控制任务的执行顺序,从而确保在所有图片压缩完成后才触发通知。
解决方案
-
安装必要的插件: 首先,你需要安装
gulp-sequence
插件。你可以使用 npm 来安装它:npm install --save-dev gulp-sequence
-
修改 Gulp 任务: 然后,你可以修改你的 Gulp 任务,使其在所有图片压缩完成后才触发通知。这里是一个示例代码:
const gulp = require('gulp'); const imagemin = require('gulp-imagemin'); const notify = require('gulp-notify'); const sequence = require('gulp-sequence'); // 修改后的 imagemin 任务 gulp.task('imagemin', function () { return gulp.src('./static/**/img/*') .pipe(imagemin({ progressive: true })) .pipe(gulp.dest('./dist/image')); }); // 创建一个新的任务,在所有图片压缩完成后触发通知 gulp.task('notify-once', function (cb) { return gulp.src('.') .pipe(notify({ message: 'Images task complete' })); }); // 使用 gulp-sequence 来控制任务的执行顺序 gulp.task('build-images', sequence('imagemin', 'notify-once'));
-
运行任务: 最后,你可以通过运行
gulp build-images
来执行这个任务。这将确保所有的图片都被压缩完毕后才会触发通知。
解释
-
gulp-sequence
:这个插件允许你按顺序执行多个任务。在这个例子中,我们首先执行imagemin
任务来压缩图片,然后执行notify-once
任务来发送通知。 -
imagemin
任务:这个任务负责压缩图片并将其输出到目标目录。注意我们在这里移除了pipe(notify)
,因为我们希望在所有图片都压缩完毕后再发送通知。 -
notify-once
任务:这个任务只负责发送通知。由于我们使用了gulp-sequence
,这个任务会在imagemin
任务完成后被调用一次。
这样,你就可以确保所有图片都压缩完毕后再收到通知了。希望这对你有帮助!
https://github.com/mikaelbr/gulp-notify 看文档呀
options.onLast
Type: Boolean Default: false
If the notification should only happen on the last file of the stream. Per default a notification is triggered on each file.
.pipe(notify({ message: ‘Images task complete’ }));这个造成的。
谢谢,成功了我以为是通过gulp的api控制呢给notify自身的忽略了
嗯,知道是这一句,楼上是答案了,也谢谢你
在你的问题中,你希望在所有图片压缩完成后才显示一个通知。Gulp 是基于流的,它默认会在每个文件处理完后执行管道中的操作。你可以使用 gulp-finalhandler
或者 merge-stream
来实现这个功能。
这里提供一个使用 merge-stream
的解决方案,它可以帮助你在所有任务完成后执行特定的操作:
示例代码
首先,你需要安装 merge-stream
包:
npm install merge-stream --save-dev
然后,你可以修改你的 Gulp 任务:
const gulp = require('gulp');
const imagemin = require('imagemin');
const imageminMozjpeg = require('imagemin-mozjpeg');
const notify = require('gulp-notify');
const merge = require('merge-stream');
gulp.task('imagemin', function() {
const images = gulp.src('./static/**/img/**')
.pipe(imagemin([
imagemin.gifsicle({interlaced: true}),
imagemin.jpegtran({progressive: true}),
imagemin.optipng({optimizationLevel: 5}),
imagemin.svgo({
plugins: [
{removeViewBox: false},
{cleanupIDs: false}
]
}),
imageminMozjpeg({quality: 75, progressive: true})
]));
const css = gulp.src('./static/**/css/**')
.pipe(gulp.dest('./dist/css'));
const js = gulp.src('./static/**/js/**')
.pipe(gulp.dest('./dist/js'));
// 合并所有流
const allStreams = merge(images, css, js);
return allStreams
.pipe(gulp.dest('./dist'))
.pipe(notify({ message: 'All tasks complete' }));
});
gulp.task('default', gulp.series('imagemin'));
在这个例子中,我们创建了三个独立的流(对于图片、CSS 和 JavaScript 文件),然后将它们合并成一个单一的流 allStreams
。当所有文件都处理完毕时,我们将显示一个通知。
这样可以确保所有文件处理完毕后再显示通知。希望这能解决你的问题!