对gulp-changed插件的一点思考
2017-12-14 10:57
239 查看
对gulp-changed插件的一点思考
导语: 最近看了下gulp-changed插件的源码,想对里面学习到的知识总结一下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函数里的代码执行完毕后的回调函数
sourceFilevinyl 文件对象
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
文章地址:https://www.xiabingbao.com/gulp/2016/01/20/gulp-changed-ponder.html#mtime-atime-ctime
相关文章推荐
- gulp插件(13) - gulp-changed(只传递修改过的文件)
- 简单谈谈gulp-changed插件
- 我对软件开发的一点思考
- [思考] Visual Studio 插件 GDIWatch 实现浅析
- gulp常用插件-gulp-uglify
- 委托和事件的一点思考
- 客户端技术的一点思考(数据存储用SQLite, XMPP通讯用Gloox, Web交互用LibCurl, 数据打包用Protocol Buffer, socket通讯用boost asio)
- 对微软和苹果的一点思考,微软最值得称道的品质
- 关于华为的一点笔记和思考 推荐
- 对测试的一点思考
- 关于二叉树后续遍历算法的一点思考
- Gulp插件less的使用
- gulp改造gulp-rev-append插件实现资源文件链接自动添加MD5版本号
- gulp自动化构建工具gulp-connect插件配置服务器实现热更新+自动刷新
- gulp-load-plugins[模块化管理插件]
- 【007-013】关于读书的一点思考
- 需求管理和开发的一点小思考
- 实体定义:每一层都不相同,对于层间实体之间映射的一点思考
- 范凯:对移动社交型app的一点思考
- 【D3D11游戏编程】学习笔记十三:内存对齐的一点思考