简单谈谈gulp-changed插件


Posted in Javascript onFebruary 21, 2017

前言

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

总结

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

Javascript 相关文章推荐
JQuery AJAX实现目录浏览与编辑的代码
Oct 21 Javascript
jQuery prev ~ siblings选择器使用介绍
Aug 09 Javascript
使用Angular.js开发的注意事项
Oct 19 Javascript
简单实现bootstrap选项卡效果
Feb 08 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
Aug 16 Javascript
在Vue中使用echarts的方法
Feb 05 Javascript
Vue Router的懒加载路径的解决方法
Jun 21 Javascript
js canvas画布实现高斯模糊效果
Nov 27 Javascript
Electron 如何调用本地模块的方法
Feb 01 Javascript
JavaScript Math对象和调试程序的方法分析
May 13 Javascript
使用layui定义一个模块并使用的例子
Sep 14 Javascript
JS实现百度搜索框
Feb 25 Javascript
从零学习node.js之搭建http服务器(二)
Feb 21 #Javascript
jQuery动态生成不规则表格(前后端)
Feb 21 #Javascript
jquery设置css样式的多种方法(总结)
Feb 21 #Javascript
JavaScript中 this 指向问题深度解析
Feb 21 #Javascript
js return返回多个值,通过对象的属性访问方法
Feb 21 #Javascript
从零学习node.js之模块规范(一)
Feb 21 #Javascript
JS获得一个对象的所有属性和方法实例
Feb 21 #Javascript
You might like
php读取xml实例代码
2010/01/28 PHP
jquery配合css简单实现返回顶部效果
2013/09/30 Javascript
Javascript 按位与赋值运算符 (&=)使用介绍
2014/02/04 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
javascript正则表达式之分组概念与用法实例
2016/06/16 Javascript
用js动态添加html元素,以及属性的简单实例
2016/07/19 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
浅谈vuepress 踩坑记
2018/04/18 Javascript
vue源码学习之Object.defineProperty 对数组监听
2018/05/30 Javascript
JavaScript多态与封装实例分析
2018/07/27 Javascript
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
详解React 条件渲染
2020/07/08 Javascript
详解如何使用React Hooks请求数据并渲染
2020/10/18 Javascript
Python实现PS图像调整颜色梯度效果示例
2018/01/25 Python
python smtplib发送带附件邮件小程序
2018/05/22 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
pytorch numpy list类型之间的相互转换实例
2019/08/18 Python
python查看矩阵的行列号以及维数方式
2020/05/22 Python
Python extract及contains方法代码实例
2020/09/11 Python
python中用ggplot绘制画图实例讲解
2021/01/26 Python
精伦电子Java笔试题
2013/01/16 面试题
如何删除一个表里面的重复行
2013/07/13 面试题
平面设计岗位职责
2013/12/14 职场文书
四查四看剖析材料
2014/02/14 职场文书
煤矿安全生产月活动总结
2014/07/05 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
七年级英语教学反思
2016/02/15 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
Python 批量下载阴阳师网站壁纸
2021/05/19 Python
Redis数据同步之redis shake的实现方法
2022/04/21 Redis