首页 > 语言 > JavaScript > 正文

简单谈谈gulp-changed插件

2024-05-06 15:11:04
字体:
来源:转载
供稿:网友

前言

gulp-changed插件的作用,是用来过滤未被修改过的文件,只有修改后的文件才能通过管道。这样做的好处时,只处理修改后的文件,减少后续程序的执行时间。

根据官方给出的例子:

const SRC = 'src/*.js';const DEST = 'dist';gulp.task('default', () => { return gulp.src(SRC)  .pipe(changed(DEST))  .pipe(gulp.dest(DEST))  .pipe( /* 其他操作 */ );});

检测SRC中的文件,然后把从changed()通过的文件输出到DEST文件夹中,然后继续进行后续的操作。在这之前,我写的代码是这样子的,没有传入参数,也没有输出到某文件夹中(gulp.dest(DEST) ):

gulp.task('default', () => { return gulp.src('src/*.js')  .pipe(changed())  .pipe( /* 其他操作 */ );});

然后发现,每次执行时,所有的文件都会通过管道,根本没有过滤的作用。看了源代码之后才知道,传递参数和文件输出是必须的,因为程序里是拿两个文件夹SRC和DEST里的文件进行对比的。

每当检测一个程序时,都会去DEST里的文件夹里寻找这个对应的文件,若DEST最后修改时间发生变化或内容已更新,则表明这是一个新文件,通过管道,否则保留。程序里目前使用的是两个文件最后修改时间的对比,若SRC里的文件的最后修改时间比DEST里文件的最后修改时间要大,说明该文件被修改过。

当然,gulp-changed还提供了一种比较函数:内容的对比。将源文件和目标文件的内容进行sha1加密后,比较两者的加密串,若不相同,则通过管道。

可通过传递参数修改比对函数:

gulp.task('default', () => { return gulp.src(SRC)  .pipe(changed(DEST, {hasChanged: changed.compareSha1Digest}))  .pipe(gulp.dest(DEST))  .pipe( /* 其他操作 */ );});

当然,你可以传递自己定义的函数,但是需支持以下4个参数:

    stream 文件通过对比后将sourceFile添加到队列中 callback 函数里的代码执行完毕后的回调函数 sourceFile vinyl 文件对象 destPath 与sourceFile文件对比的目标文件路径

源码讲解

这个方法里,是对两个文件最后修改时间的对比

function compareLastModifiedTime(stream, cb, sourceFile, targetPath) { // 获取目标文件的状态 fs.stat(targetPath, function (err, targetStat) { // 若源文件存在 if (!fsOperationFailed(stream, sourceFile, err)) { // 对比两者的最后修改时间 if (sourceFile.stat.mtime > targetStat.mtime) { stream.push(sourceFile); } } cb(); });}

这里有个疑问的地方:

若目标文件不存在,则当前情况是无法进行比较的,只能在运行一次之后,产生了目标文件;再修改源文件才能进行对比;新添加的文件同理
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选