简单谈谈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 相关文章推荐
html数组字符串拼接的最快方法
Sep 16 Javascript
通过javascript的匿名函数来分析几段简单有趣的代码
Jun 29 Javascript
firefox火狐浏览器与与ie兼容的2个问题总结
Jul 20 Javascript
javaScript面向对象继承方法经典实现
Aug 20 Javascript
jquery实现背景墙聚光灯效果示例分享
Mar 02 Javascript
jQuery中map()方法用法实例
Jan 06 Javascript
jQuery基于图层模仿五星星评价功能的方法
May 07 Javascript
Vue.js基础知识汇总
Apr 27 Javascript
Backbone中View之间传值的学习心得
Aug 09 Javascript
bootstrapTable+ajax加载数据 refresh更新数据
Aug 31 Javascript
Javascript实现时间倒计时功能
Nov 17 Javascript
jquery插件开发模式实例详解
Jul 20 jQuery
从零学习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
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
laravel通过a标签从视图向控制器实现传值
2019/10/15 PHP
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
javascript用函数实现对象的方法
2015/05/14 Javascript
JS实现回到页面顶部动画效果的简单实例
2016/05/24 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
select下拉框插件jquery.editable-select详解
2017/01/22 Javascript
深入理解vue中的$set
2017/06/01 Javascript
vue登录路由验证的实现
2017/12/13 Javascript
vue toggle做一个点击切换class(实例讲解)
2018/03/13 Javascript
React 路由懒加载的几种实现方案
2018/10/23 Javascript
nodejs检测因特网是否断开的解决方案
2019/04/17 NodeJs
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
node中使用log4js4.x版本记录日志的方法
2019/08/20 Javascript
vue实现图片上传预览功能
2019/12/23 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
初学python数组的处理代码
2011/01/04 Python
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
TensorFlow安装及jupyter notebook配置方法
2017/09/08 Python
Python编程把二叉树打印成多行代码
2018/01/04 Python
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
python super()函数的基本使用
2020/09/10 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
HTML5里autofocus自动聚焦属性使用介绍
2016/06/22 HTML / CSS
教育实践活动对照检查材料
2014/09/23 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
校园环境卫生倡议书
2015/04/29 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
大学迎新生的欢迎词
2019/06/25 职场文书
anaconda python3.8安装后降级
2021/06/11 Python