https://github.com/jedwards1211/smart-restart
CommonJS module load hook that restarts or does Webpack-style hot module replacement when a file is changed
https://github.com/jedwards1211/smart-restart
commonjs file-watcher file-watching hmr hot-module-replacement hot-reloading node
Last synced: about 1 month ago
JSON representation
CommonJS module load hook that restarts or does Webpack-style hot module replacement when a file is changed
- Host: GitHub
- URL: https://github.com/jedwards1211/smart-restart
- Owner: jedwards1211
- License: mit
- Created: 2016-09-21T14:34:45.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2024-07-08T15:45:59.000Z (11 months ago)
- Last Synced: 2025-04-21T00:31:19.626Z (about 2 months ago)
- Topics: commonjs, file-watcher, file-watching, hmr, hot-module-replacement, hot-reloading, node
- Language: TypeScript
- Homepage:
- Size: 646 KB
- Stars: 7
- Watchers: 2
- Forks: 1
- Open Issues: 23
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# smart-restart
CommonJS module load hook that restarts or does Webpack-style hot module replacement when a file is changed
[](https://circleci.com/gh/jedwards1211/smart-restart)
[](https://github.com/semantic-release/semantic-release)
[](http://commitizen.github.io/cz-cli/)
[](https://badge.fury.io/js/smart-restart)`nodemon` and `piping` are great, but each has their limitations:
`nodemon` sometimes restarts when you change files the server isn't using, which is a hassle when you're working on
isomorphic apps and just want a webpack hot update on the client.`piping` is difficult to use with `node-inspector` because it runs a cluster; the supervisor process gets debug port 5858,
and your app process gets something else. It's even more of a pain to use with `--debug-brk` because the supervisor
process starts with a breakpoint as well, so you have to open `node-inspector` for it, resume it, _then_ open
`node-inspector` for your actual app.On top of that, neither supports any hot module replacement, which is the only way to react to changes quickly in a
large project.`smart-restart` combines both approaches: it uses `piping`'s require hook to only watch files that have been required,
but it `spawns` your app instead of running a cluster, so that you can pass `--debug` or `--debug-brk` to your app.
And it provides a basic version of Webpack's hot module replacement API for Node CommonJS, without using Webpack or
doing any bundling.## Usage
To run `./src/index.js` in a child process and watch files it `require`s:
```js
var launch = require('smart-restart')launch({
main: './src/index.js', // path to your script
command: 'node', // optional, the command to `spawn` (default: `process.argv[0]`)
commandOptions: ['--inspect'], // optional, arguments that come before `main`
args: [...], // optional, arguments that come after `main`
spawnOptions: {...}, // optional, options for `spawn`
onChildSpawned: child => {}, // optional, callback to receive ChildProcess instance
ignore: /(\/\.|~$)/, // optional, ignore pattern for `chokidar` (default: /(\/\.|~$)/)
usePolling: false, // optional, whether to use polling in `chokidar` (default: false)
interval: 100, // optional, polling interval for `chokidar` (default: 100)
binaryInterval: 300, // optional, binary polling interval for `chokidar` (default: 300)
includeModules: false, // optional, whether to include `node_modules` (default: false)
killSignal: 'SIGTERM', // optional, signal to kill process with when restarting
killTimeout: 5000, // optional, max amount of milliseconds to wait for process to get killed (default: 10000)
deleteRequireCache: [ // optional, when any files in this array (or files they require)
// are changed, all of these files will be deleted from `require.cache`
// instead of restarting the process.
'src/server/ssr/serverSideRender.js',
],
restartOnError: true, // optional, restart when child process has an uncaught error/promise rejection (default: true)
restartOnExit: true, // optional, restart when child process exits (default: true)
})
```You can `launch` as many other processes as you want in the same supervisor process.
## Hot Module Replacement
`smart-restart` supports the following subset of Webpack's hot module replacement API:
```js
if (module.hot) {
module.hot.accept('./myModule', () => {
const newVersion = require('./myModule')
// do something with newVersion
})
}
```Webpack's other overloads for `module.hot.accept` aren't supported.
If not all ancestors of a changed module have `module.hot.accept` hooks, then `smart-restart` will
relaunch the whole process.## Exiting for good
You can `process.send({exit:
})` to tell `smart-restart` to exit
immediately instead of waiting to relaunch your process.