333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# egg-watcher
File watcher plugin for egg
 
[![NPM version][npm-image]][npm-url]
[![build status][travis-image]][travis-url]
[![Test coverage][codecov-image]][codecov-url]
[![David deps][david-image]][david-url]
[![Known Vulnerabilities][snyk-image]][snyk-url]
[![npm download][download-image]][download-url]
 
[npm-image]: https://img.shields.io/npm/v/egg-watcher.svg?style=flat-square
[npm-url]: https://npmjs.org/package/egg-watcher
[travis-image]: https://img.shields.io/travis/eggjs/egg-watcher.svg?style=flat-square
[travis-url]: https://travis-ci.org/eggjs/egg-watcher
[codecov-image]: https://codecov.io/github/eggjs/egg-watcher/coverage.svg?branch=master
[codecov-url]: https://codecov.io/github/eggjs/egg-watcher?branch=master
[david-image]: https://img.shields.io/david/eggjs/egg-watcher.svg?style=flat-square
[david-url]: https://david-dm.org/eggjs/egg-watcher
[snyk-image]: https://snyk.io/test/npm/egg-watcher/badge.svg?style=flat-square
[snyk-url]: https://snyk.io/test/npm/egg-watcher
[download-image]: https://img.shields.io/npm/dm/egg-watcher.svg?style=flat-square
[download-url]: https://npmjs.org/package/egg-watcher
 
## Usage
 
In worker process:
 
### app.watcher.watch(path, listener)
Start watching file(s).
 
- path(String|Array): file path(s)
- listener(Function): file change callback
 
### app.watcher.unwatch(path[, listener])
Stop watching file(s).
 
- path(String|Array): file path(s)
- listener(Function): file change callback
 
In agent process:
 
### agent.watcher.watch(path, listener)
Start watching file(s).
 
- path(String|Array): file path(s)
- listener(Function): file change callback
 
### agent.watcher.unwatch(path[, listener])
Stop watching file(s).
 
- path(String|Array): file path(s)
- listener(Function): file change callback
 
## Watching mode
 
### `development` Mode
 
There's a built-in [development mode](https://github.com/eggjs/egg-watcher/blob/master/lib/event-sources/development.js) which works in local(env is `local`). Once files on disk is modified it will emit a `change` event immediately.
 
### Customize Watching Mode
 
Say we want to build a custom event source plugin (package name: `egg-watcher-custom`, eggPlugin.name: `watcherCustom`).
 
Firstly define our custom event source like this:
 
```js
// {plugin_root}/lib/custom_event_source.js
const Base = require('sdk-base');
 
class CustomEventSource extends Base {
  // `opts` comes from app.config[${eventSourceName}]
  // `eventSourceName` will be registered later in
  // `config.watcher.eventSources` as the key shown below
  constructor(opts) {
    super(opts);
    this.ready(true);
  }
 
  watch(path) {
    // replace this with your desired way of watching,
    // when aware of any change, emit a `change` event
    // with an info object containing `path` property
    // specifying the changed directory or file.
    this._h = setInterval(() => {
      this.emit('change', { path });
    }, 1000);
  }
 
  unwatch() {
    // replace this with your implementation
    if (this._h) {
      clearInterval(this._h);
    }
  }
}
 
module.exports = CustomEventSource;
```
 
Event source implementations varies according to your running environment. When working with vagrant, docker, samba or such other non-standard way of development, you should use a different watch API specific to what you are working with.
 
Then add your custom event source to config:
 
```js
// config.default.js
exports.watcher = {
  eventSources: {
    custom: require('../lib/custom_event_source'),
  },
};
```
 
Choose to use your custom watching mode in your desired env.
 
```js
// config.${env}.js
exports.watcher = {
  type: 'custom',
};
 
// this will pass to your CustomEventSource constructor as opts
exports.watcherCustom = {
  // foo: 'bar',
};
```
 
If possible, plugins named like `egg-watcher-${customName}`(`egg-watcher-vagrant` eg.) are recommended.
 
## Questions & Suggestions
 
Please open an issue [here](https://github.com/eggjs/egg/issues).
 
## License
 
[MIT](https://github.com/eggjs/egg-watcher/blob/master/LICENSE)