Skip to content

Instantly share code, notes, and snippets.

@luisfarzati
Created May 6, 2017 01:44
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save luisfarzati/1e6a7e11d0e3f456c236f80627908f5b to your computer and use it in GitHub Desktop.
Save luisfarzati/1e6a7e11d0e3f456c236f80627908f5b to your computer and use it in GitHub Desktop.
Node.js hot-reloading using Cluster
const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.status(200)
.contentType('application/json')
.json({ hello: 'world' })
})
module.exports = app
{
"name": "hotreload-example",
"version": "1.0.0",
"author": "Luis Farzati <lfarzati@gmail.com>",
"scripts": {
"start": "node .",
"dev": "NODE_ENV=development npm start"
},
"dependencies": {
"express": "^4.15.2"
},
"devDependencies": {
"chokidar": "^1.6.1"
}
}
const start = () => {
require('./app').listen(3000, () => console.log(`Server ready at port 3000`))
}
if (process.env.NODE_ENV !== 'development') {
return start()
}
const fork = (cluster) => {
let worker = cluster.fork()
worker.on('disconnect', () => console.log(`[WORKER-${worker.id}] terminated`))
console.log(`[MASTER] forked worker ${worker.id}`)
return worker
}
const setupMaster = (cluster) => {
const chokidar = require('chokidar')
const watcher = chokidar.watch('./app')
let worker = fork(cluster)
watcher.on('ready', () => {
watcher.on('all', (event, filename) => {
worker.send({ type: 'hotreload', args: { filename, id: worker.id } })
setTimeout(((worker) => () => worker.kill())(worker), 1000)
process.nextTick(() => worker = fork(cluster))
})
})
}
const cluster = require('cluster')
if (cluster.isMaster) {
setupMaster(cluster)
}
else if (cluster.isWorker) {
start()
process.on('message', ({type, args}) => {
if (type === 'hotreload') {
console.log(`[WORKER-${args.id}] Hot-reloading ${args.filename}`)
delete require.cache[require.resolve(`./${args.filename}`)]
process.disconnect()
}
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment