简单谈谈gulp-changed插件

发布时间 - 2026-01-10 23:11:35    点击率:

前言

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个参数:

  1. stream 文件通过对比后将sourceFile添加到队列中
  2. callback 函数里的代码执行完毕后的回调函数
  3. sourceFile vinyl 文件对象
  4. 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();
 });
}

这里有个疑问的地方:

  • 若目标文件不存在,则当前情况是无法进行比较的,只能在运行一次之后,产生了目标文件;再修改源文件才能进行对比;新添加的文件同理

mtime, atime, ctime

上面中的mtime表示修改时间,此外,文件还几个跟时间有关的属性,这里也稍微的讲解一下。

ATIME-ACCESS TIME

该字段表示文件中的数据最后一次被访问的时间–通过unix进行直接读取或通过命令行和脚本读取。

CTIME-CHANGE TIME

当您更改文件的所有权或访问权限时,ctime也随之变化。当然,内容更新时,ctime也会发生改变。

MTIME-MODIFY TIME

最后修改时间显示上次更改文件内容的时间。它不与文件权限的变化而变化,并因此用于跟踪文件内容的实际变化。

通过LS显示这三种时间

最简单的确认这些时间的方式是使用ls命令,我现在用的是windows系统,安装了一个ConEmu。

使用ls -l显示的时间就是当前文件最后一次修改的时间,即mtime:

-rw-r--r-- 1 root 1049089   2676 一月 20 03:06 gulpfile.js

使用ls -lu显示的是文件最后一次被访问的时间,即atime:

-rw-r--r-- 1 root 1049089   2676 十一 24 09:18 gulpfile.js

使用ls -lc显示的是文件最后一次权限被修改的时间,即ctime:

-rw-r--r-- 1 root 1049089   2676 一月 20 03:06 gulpfile.js

通过STAT显示这三种时间

使用stat命令可以显示这个文件更加详细的信息:

$ stat gulpfile.js
 File: ‘gulpfile.js'
 Size: 2676   Blocks: 4   IO Block: 65536 regular file
Device: d6be5777h/3602798455d Inode: 844424930178810 Links: 1
Access: (0644/-rw-r--r--) Uid: (1435492/root) Gid: (1049089/ UNKNOWN)
Access: 2015-11-24 09:18:34.008292400 +0000
Modify: 2016-01-20 03:06:34.035859700 +0000
Change: 2016-01-20 07:04:40.432046400 +0000
 Birth: 2015-11-24 09:18:33.965292400 +0000

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# gulp  # changed  # 用法  # nodejs实现简单的gulp打包  # gulp安装以及打包合并的方法教程  # JS中使用gulp实现压缩文件及浏览器热加载功能  # gulp教程_从入门到项目中快速上手使用方法  # 前端构建工具之gulp的配置与搭建详解  # 写gulp遇到的ES6问题详解  # 的是  # 这三种  # 几个  # 看了  # 也会  # 有个  # 你可以  # 夹中  # 在这  # 我现在  # 执行时间  # 这是一个  # 才知道  # 这样做  # 不存在  # 这篇文章  # 后将  # 可通过  # 会去  # 这样子 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: javascript基于原型链的继承及call和apply函数用法分析  打造顶配客厅影院,这份100寸电视推荐名单请查收  如何用美橙互联一键搭建多站合一网站?  清除minerd进程的简单方法  如何生成腾讯云建站专用兑换码?  实例解析angularjs的filter过滤器  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何快速重置建站主机并恢复默认配置?  如何在万网开始建站?分步指南解析  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  PythonWeb开发入门教程_Flask快速构建Web应用  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  如何在不使用负向后查找的情况下匹配特定条件前的换行符  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  微信小程序 canvas开发实例及注意事项  如何用AI帮你把自己的生活经历写成一个有趣的故事?  javascript中闭包概念与用法深入理解  大型企业网站制作流程,做网站需要注册公司吗?  浅析上传头像示例及其注意事项  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  如何快速搭建高效简练网站?  实例解析Array和String方法  php 三元运算符实例详细介绍  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  如何有效防御Web建站篡改攻击?  如何快速搭建虚拟主机网站?新手必看指南  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  用v-html解决Vue.js渲染中html标签不被解析的问题  微信h5制作网站有哪些,免费微信H5页面制作工具?  Internet Explorer官网直接进入 IE浏览器在线体验版网址  如何在 Pandas 中基于一列条件计算另一列的分组均值  Laravel怎么实现验证码(Captcha)功能  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  php结合redis实现高并发下的抢购、秒杀功能的实例  Laravel怎么为数据库表字段添加索引以优化查询  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  魔毅自助建站系统:模板定制与SEO优化一键生成指南  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  北京网站制作公司哪家好一点,北京租房网站有哪些?  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  如何在阿里云高效完成企业建站全流程?  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】