const fs = require("fs"); const path = require('path'); const chalk = require('chalk'); const execFileSync = require('child_process').execFileSync; // 需要忽略的文件夹 const ignores = 'dist,node_modules,build'.split(',') const buildFile = path.join(__dirname, 'build.js') // 有时候修改文件后会连续回调两次,用这个时间过滤掉第二次重复的回调 var lastUpdateTime = 0; var checkModule = function(dir){ var files = fs.readdirSync(dir),flag=false; for (var i = 0; i < files.length; i++) { if (ignores.includes(files[i])) continue var file =files[i] var stat = fs.statSync( dir + '/' + file) if (stat.isDirectory() != true && file=="package.json") { flag = true; break; } } return flag; } function watch(dir) { fs.watch(dir, (event, filename) => { if (ignores.includes(filename)) return;//false true var diff = Date.now() - lastUpdateTime lastUpdateTime = Date.now() if (diff < 100) return; if(checkModule(dir)==false){ return; } // TODO: do anything ... console.log('正在编译:',buildFile,dir,filename) execFileSync( 'node', [buildFile, dir]); }) // 原生监控不能监控到子文件夹中的文件改变事件,遍历之 var files = fs.readdirSync(dir); for (var i = 0; i < files.length; i++) { if (ignores.includes(files[i])) continue var file = dir + '/' + files[i] var stat = fs.statSync(file) if (stat.isDirectory() == true) { watch(file); } } } // 开始监控当前目录 watch('.') console.log('start watch...');