本篇博客,主要是记录下最近一直纠结的gulp.watch方法,在工作中我们肯定都遇到过,新添加的文件没办法自动触发watch,下面我们就来看有什么办法处理

1.首先我们肯定是先百度一下

百度推荐的是gulp-watch插件,这个插件其实是基于上片博客的提到的node模块chokidar。可以监控文件的增删改查,重命名的会发送一个添加和一个删除

但是用这个模块,在关闭控制台的时候,会有一段时间的无响应时间,感觉重视怪怪的

2.本人平时在windows下面,还会熟悉写arrdio的脚本语言,这个语言对文件的监控,也有相关的模块,其实相对使用的是Kernel32.dll里面的Windows api

ReadDirectoryChangesW  MSDN直通车

但是arrdio exe程序怎么和nodejs程序通信的,以前也有相关的尝试,

a.通过进程的输入,输出设备相关,打印信息。后台发现该方案只能是子进程返回给主进程信息就放弃了。

b.基于http,主要感觉要占用端口,而且http也是响应式的,相关的交互也有点麻烦

c.基于TCP,tcp属于长连接,server和client 可以相互通信,这又是好一顿折腾(TCP服务是node还是arrdio创建,后来是考虑arrdio创建,主要是想在mynote项目里面,也借助tcp服务,进行让node在Windows使用sqlite数据库【主要是网上没有找到相关windows下编译好的sqlite模块,自己又没有相关的环境和知识】)

总结下相关的对比

  gulp.watch chokidar aau.watch
初始化   ready事件之前会有文件的add事件  
文件添加 无反应 add 添加文件
删除文件

运行前存在的 deleted

运行后添加的 无反应

unlink 移除文件
重命名文件

运行前存在的 deleted

运行后添加的 无反应

被重名文件  unlink

重命名后文件 add

被重命名文件  重命名:原文件

重命名后文件  重命名:新文件名

重命名后文件  文件被修改

修改文件

运行前存在的 changed

运行后添加的 无反应

change

文件被修改

aau.watch采用的是TCP消息通信,但是由于文件重命名,消息比较频繁,短时间内3条信息传递,导致node的tcp客户端,存在调包,或者少响应data时间的现象。

相关的我也写了arrdio的tcp客户端的响应处理,只是获取的消息会一次性获取,没有掉包的情况。

不知道其中是什么原因导致的。

下面贴下相关的代码

node watch.js代码

var net = require('net');
var gulp = require('gulp');
var chokidar = require('chokidar'); var HOST = '127.0.0.1';
var PORT = 7070; var actionTab = ["", "添加文件", "移除文件", "文件被修改", "重命名:原文件名", "重命名:新文件名"];
var client = new net.Socket();
client.connect(PORT, HOST, function() {
client.write('{action: "dirWatch", url:"D:/snailshop/wgu/"}');
});
client.on('data', function(data) {
var tab = data.toString().split(',');
console.log('[aau.watch]', tab[1], actionTab[tab[0]], +new Date)
});
client.on('close', function() {
console.log('Connection closed');
});
/*
net.createServer(function(sock) {
console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);
sock.on('data', function(data) {
console.log('DATA ' + sock.remoteAddress + ': ' + data);
sock.write('You said "' + data + '"');
});
sock.on('close', function(data) {
console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort);
});
}).listen(PORT, HOST);*/
gulp.watch(['./wgu/**/*'], event => {
console.log('[gulp.watch]', event.path, event.type, +new Date)
});
var watcher = chokidar.watch(['./wgu/**/*'], {
ignored: /[\/\\]\./,
persistent: true
});
'add,change,unlink,addDir,unlinkDir,ready'.split(',').forEach(item => {
watcher.on(item, path => {
console.log('[chokidar]', path, item, +new Date)
})
})

arrdio tcp server,相关的都有封装,只需要写比较少的代码,唯一可惜的是官网的文档比较少,需要花一定的时间自己了解怎么写法

import console;
import wsock.tcp.server;
import wsock.tcp.client;
import thread.command; var tcpTab = {};
var listener = ..thread.command();//线程命令,对线程抛出的消息进行处理
listener.onFileChange = function (msg) {
for (i = 1; #tcpTab; 1) {
tcpTab[i].write(msg)
}
};
var tcpServer, errMsg = wsock.tcp.server("127.0.0.1", 7070);
if(!tcpServer) {
console.log( errMsg )
console.pause();
} else {
tcpServer.forever(function(acceptSocket){
table.push(tcpTab, wsock.tcp.client(, acceptSocket)) //保存客户端socket
..thread.invoke(function(acceptSocket, hwndListener){ //启动单独线程,响应每一个客户端的请求
import wsock.tcp.client;
import web.json;
import fsys.dirWatcher;
import console;
import thread.command; var tcpClient = wsock.tcp.client(, acceptSocket);
do{
var cstr = tcpClient.recv();
if (cstr) {
var obj = web.json.parse(cstr);
console.dump(obj)
if (obj && type(obj) == 'table' && obj.action == 'dirWatch') {
var watcher = fsys.dirWatcher(obj.url);
for( filename,action,actionText,item in watcher.eachChanges(flags,subTree) ){
//console.log(1, string.join({action;filename;}, ","))
//tcpClient.write(string.join({action;filename;}, ","))
thread.command.post(hwndListener, "onFileChange", string.join({action;filename;}, ",")); //线程命令处理
}
}
}
} while(1)
}, acceptSocket, listener.hwnd);
})
}

arrdio的tcp客户端(用于测试重命名消息的处理能力)

import console;
import wsock.tcp.client;
import fsys.dirWatcher; var tcpc = wsock.tcp.client();
tcpc.connect("127.0.0.1", 7070);
tcpc.write('{action: "dirWatch", url:"D:/snailshop/wgu/"}');
do{
var cstr = tcpc.recv();
console.log(cstr); } while(1)

本来还想arrdio的文件监控,使用的是window api,相对的响应效果更好,但是在和nodejs信息传递方面还是存在很大的难度,不是我这个前端知识面能解决的问题。只能放弃了。

chokidar 即 gulp-watch监控文件的方面也不错,性能上面有些消耗,但是用起来应该不受太大影响

windows 文件watch nodejs的更多相关文章

  1. (转)windows下安装nodejs及框架express

    转自:http://jingyan.baidu.com/article/456c463b60fb380a583144a9.html windows下安装nodejs及框架express nodejs从 ...

  2. windows下配置nodejs+npm

    windows下安装nodejs是比较方便的 (v0.6.0之后,支持windows native),进入官网http://nodejs.org/  点击install即可安装.下载完成后一路next ...

  3. 从零开始,在windows上用nodejs搭建一个静态文件服务器

    从零开始,在windows上用nodejs搭建一个静态文件服务器 首先安装nodejs: 新建一个node文件夹 下载node.exe到该文件夹 下载npm然后解压到该文件夹 现在node文件夹是这样 ...

  4. Windows系统下nodejs安装及配置

    关于nodejs中文站,眼下活跃度最好的知识站应该是http://www.cnodejs.org/ ,而http://cnodejs.org/则活跃度较低.Express.js是nodejs的一个MV ...

  5. 配置 Windows 下的 nodejs C++ 模块编译环境 安装 node-gyp

    配置 Windows 下的 nodejs C++ 模块编译环境 根据 node-gyp 指示的 Windows 编译环境说明, 简单一句话就是 "Python + VC++ 编译环境&quo ...

  6. npm报错:无法加载文件 D:\nodejs\node_global\webpack.ps1,因为在此系统上禁止运行脚本

    npm报错 在 windows终端输入 vue init webpack app, 创建一个名为 app 的 Vue 项目时报错如下: 无法加载文件 D:\nodejs\node_global\web ...

  7. windows 文件权限导致的 git 问题

    windows 文件权限导致的 git 问题 在 windows 上使用 git 时,会遇到明明什么都没有改动,但是 git status 显示一堆文件被修改.这时,通过 git diff 可看到什么 ...

  8. Linux文件和windows文件在 换行符的区别

    Linux或Unix文件,和windows文件,在来回处理时,如果不注意 换行符的区别,可能导致程序错误!!!深刻的教训.... 在早期的打印机时代,开始新的一行要占用两个字符的时间.如果到了一行的结 ...

  9. Linux与Windows文件传输实现

    Linux与Windows文件传输实现 一.概述 在学习Linux服务器的时候,我们有时需要与Windows下的文件进行交互传输,这个时候我们需要如何实现呢?今天是我第一次在博客园上写文章,此时正值学 ...

随机推荐

  1. Objective-C中的property

    property可以被声明的位置 property可以在类的interface section和class extension以及protocol中被声明 property的可见性 Objective ...

  2. css3实现手机qq空间菜单按钮

    工作之余写的一个类似于QQzone的菜单效果 先上截图: 图一为点击按钮前界面: 图二为点击按钮后的界面 下面上代码: <!--css部分--> <style type=" ...

  3. PROCEDURE_监测系统_数据备份存储过程—备份原始数据,每十分钟一条,取平均值

    create or replace procedure proc_backup_originaldata(retCode out varchar2, -- 返回码                    ...

  4. android启动activity文本框不获得焦点

    在开发中,常常会碰到这种情况,打开一个activity后,第一个文本框自动获得焦点,同时会弹出软键盘输入框,这样很影响用户体验,现在来看解决方法. 我们先来看看为什么会出现上述情况,原因很简单,文本框 ...

  5. path类和directory类对文件的路径或目录进行操作

    Path: 对文件或目录的路径进行操作(很方便)[只是对字符串的操作] 1.目录和文件操作的命名控件System.IO    2.string Path.ChangeExtension(string ...

  6. KEIL C51中const和code的使用

    code是KEIL C51 扩展的关键字,用code修饰的变量将会被放到CODE区里.但C语里的const关键字好像也有定义不能改变的变量的功能,这两个关键字有什么区别呢?在帮助手册里查找const, ...

  7. 【转】Ubuntu安装ARM架构GCC工具链(ubuntu install ARM toolchain)最简单办法

    原文网址:http://www.cnblogs.com/muyun/p/3370996.html 一.安装ARM-Linux-GCC工具链 只需要一句命令: sudo apt-get install ...

  8. C#中删除字符串最后一个字符的几种方法

    转载地址 偶然看到的,记录一下,以免忘记 字符串:string s = "1,2,3,4,5," 目标:删除最后一个 "," 方法:    1.用的最多的是Su ...

  9. 瑞柏匡丞:国内外App市场分析报告

    互联网不可阻挡的向移动互联网转化.对于各种新兴产业来讲,移动APP是当下行业的颠覆者,也是未来的王者.国内外app市场的火热程度都已经远远超出了人们的预想,然而国内外市场的区别还是相当明显的. 首先, ...

  10. C语言随笔_区分=与==

    写C程序时,经常发现大家=与==分不清.最常见的写法如下:int a = 3;if(a = 1){.......} 写程序的人原意是想如果a等于1的话,就执行花括号里的语句,a初始化时的值是3,也就是 ...