Chokidar Weekly downloads

Minimal and efficient cross-platform file watching library

Why?

There are many reasons to prefer Chokidar to raw fs.watch / fs.watchFile in 2024:

Chokidar relies on the Node.js core fs module, but when using fs.watch and fs.watchFile for watching, it normalizes the events it receives, often checking for truth by getting file stats and/or dir contents. The fs.watch-based implementation is the default, which avoids polling and keeps CPU usage down. Be advised that chokidar will initiate watchers recursively for everything within scope of the paths that have been specified, so be judicious about not wasting system resources by watching much more than needed. For some cases, fs.watchFile, which utilizes polling and uses more resources, is used.

Made for Brunch in 2012, it is now used in ~30 million repositories and has proven itself in production environments.

Sep 2024 update: v4 is out! It decreases dependency count from 13 to 1, removes support for globs, adds support for ESM / Common.js modules, and bumps minimum node.js version from v8 to v14. Check out upgrading.

Getting started

Install with npm:

sh npm install chokidar

Use it in your code:

```javascript import chokidar from 'chokidar';

// One-liner for current directory chokidar.watch('.').on('all', (event, path) => { console.log(event, path); });

// Extended options // ----------------

// Initialize watcher. const watcher = chokidar.watch('file, dir, or array', { ignored: (path, stats) => stats?.isFile() && !path.endsWith('.js'), // only watch js files persistent: true });

// Something to use when events are received. const log = console.log.bind(console); // Add event listeners. watcher .on('add', path => log(File ${path} has been added)) .on('change', path => log(File ${path} has been changed)) .on('unlink', path => log(File ${path} has been removed));

// More possible events. watcher .on('addDir', path => log(Directory ${path} has been added)) .on('unlinkDir', path => log(Directory ${path} has been removed)) .on('error', error => log(Watcher error: ${error})) .on('ready', () => log('Initial scan complete. Ready for changes')) .on('raw', (event, path, details) => { // internal log('Raw event info:', event, path, details); });

// 'add', 'addDir' and 'change' events also receive stat() results as second // argument when available: https://nodejs.org/api/fs.html#fs_class_fs_stats watcher.on('change', (path, stats) => { if (stats) console.log(File ${path} changed size to ${stats.size}); });

// Watch new files. watcher.add('new-file'); watcher.add(['new-file-2', 'new-file-3']);

// Get list of actual paths being watched on the filesystem let watchedPaths = watcher.getWatched();

// Un-watch some files. await watcher.unwatch('new-file');

// Stop watching. The method is async! await watcher.close().then(() => console.log('closed'));

// Full list of options. See below for descriptions. // Do not use this example! chokidar.watch('file', { persistent: true,

// ignore .txt files ignored: (file) => file.endsWith('.txt'), // watch only .txt files // ignored: (file, _stats) => _stats?.isFile() && !file.endsWith('.txt'),

awaitWriteFinish: true, // emit single event when chunked writes are completed atomic: true // emit proper events when "atomic writes" (mv _tmp file) are used

// The options also allow specifying custom intervals in ms // awaitWriteFinish: { // stabilityThreshold: 2000, // pollInterval: 100 // }, // atomic: 100, interval: 100, binaryInterval: 300,

cwd: '.', depth: 99,

followSymlinks: true, ignoreInitial: false, ignorePermissionErrors: false, usePolling: false, alwaysStat: false, });

```

chokidar.watch(paths, [options])

Persistence

Path filtering

Performance

Errors

Methods & Events

chokidar.watch() produces an instance of FSWatcher. Methods of FSWatcher:

CLI

If you need a CLI interface for your file watching, check out third party chokidar-cli, allowing you to execute a command on each change, or get a stdio stream of change events.

Troubleshooting

Changelog

Upgrading

If you've used globs before and want do replicate the functionality with v4:

```js // v3 chok.watch('/*.js'); chok.watch("./directory//*");

// v4 chok.watch('.', { ignored: (path, stats) => stats?.isFile() && !path.endsWith('.js'), // only watch js files }); chok.watch('./directory');

// other way import { glob } from 'node:fs/promises'; const watcher = watch(await glob('*/.js'));

// unwatching // v3 chok.unwatch('/*.js'); // v4 chok.unwatch(await glob('/*.js')); ```

Also

Why was chokidar named this way? What's the meaning behind it?

Chowkidar is a transliteration of a Hindi word meaning 'watchman, gatekeeper', चौकीदार. This ultimately comes from Sanskrit _ चतुष्क_ (crossway, quadrangle, consisting-of-four). This word is also used in other languages like Urdu as (چوکیدار) which is widely used in Pakistan and India.

License

MIT (c) Paul Miller (https://paulmillr.com), see LICENSE file.