node package manager


node-watch Status

A neat wrapper.



npm install node-watch


var watch = require('node-watch');
watch('somedir_or_somefile', { recursive: true }, function(evt, name) {
  console.log(name, ' changed.');

This is a completely rewritten version, much faster and in a more memory-efficient way. So with recent nodejs versions under OS X or Windows you can do something like this:

// watch the whole disk 
watch('/', { recursive: true }, console.log);


  • Some editors will generate temporary files which will cause the callback function to be triggered multiple times.
  • When watching a single file the callback function will only be triggered once.
  • Missing an option to watch a directory recursively.
  • Recursive watch is not supported on Linux or in older versions of nodejs.


  • The recursive option is default to be false since v0.5.0.
  • The callback function will always provide a event name since v0.5.0.
  • Returns a fs.FSWatcher like object since v0.4.0.


The events provided by the callback function would be either update or remove.

watch('./', function(evt, name) {
  if (evt == 'remove') {
    // on delete 
  if (evt == 'update') {
    // on create or modify 

Watcher object

watch function returns a fs.FSWatcher like object as the same as (>= v0.4.0).

var watcher = watch('./', { recursive: true });
watcher.on('change', function(evt, name) {
  // callback 
watcher.on('error', function(err) {
  // handle error 
// close 

Extra options

  • filter Filter files or directories or skip to watch them.
var options = {
  recursive: true,
  filter : function(name) {
    return !/node_modules/.test(name);
// ignore node_modules 
watch('./', options, console.log);

Known bugs

Windows, node < v4.2.5

  • Failed to detect remove event
  • Failed to get deleted filename or directory name


1. Watch multiple files or directories in one place
watch(['file1', 'file2'], console.log);
2. Other ways to filter

a) filtering directly inside the callback function:

watch('./', { recursive: true }, function(evt, name) {
  // ignore node_modules 
  if (!/node_modules/.test(name)) {
    // do something 

b) filtering with higher order function:

function filter(pattern, fn) {
  return function(evt, name) {
    if (pattern.test(name)) {
      fn.apply(null, arguments);
// watch only for js files 
watch('./', filter(/\.js$/, console.log));


Licensed under MIT

Copyright (c) 2012-2017 yuanchuan