Hi, the way I do it is to run my development version of Node-RED under PM2. I then configure PM2 with a series of watch folders and when it detects a changed file in one of those folders, it automatically restarts Node-RED.
What that doesn't do is refresh the Editor though. If you've made changes to your node's HTML file, after Node-RED restarts, you need to refresh the editor window as well.
I install Node-RED into a local folder rather than globally and I set the userDir to be a sub-folder of that. (see my alternate installer on GitHub). This makes it easy to have a package.json file containing scripts so that you can simply do npm start, npm restart, etc. It also means that you can put the ecosystem.config.js file for PM2 in the same folder.
Here is my current config file for PM2:
// PM2 Configuration for running Node-RED test/dev
module.exports = {
apps : [{
name: 'Node-RED',
script: 'C:/src/nr/node_modules/node-red/red.js',
// Options reference: https://pm2.keymetrics.io/docs/usage/application-declaration/
args: '--userDir ./data',
// instances: 1,
// autorestart: true,
watch: [
'C:/src/nr/data/settings.js',
'C:/src/nr/data/projects/uib1/uibuilder/.config/security.js',
'C:/src/node-red-contrib-infocache/nodes/',
'C:/src/node-red-contrib-uibuilder/nodes/',
'C:/src/node-red-contrib-pouchdb/nodes/',
'C:/src/node-red-contrib-jktesting/nodes/',
'C:/src/node-red-contrib-events/nodes/',
'C:/src/node-red-contrib-drayton-wiser/nodes/',
'C:/src/node-red-experimental-nodes/nodes/',
'C:/src/node-red-experimental-nodes/package.json',
'C:/src/nr-test/nodes/',
'C:/src/nr/data/settings.js',
'C:/src/nr/node_modules/node-red/red.js',
'C:/src/nr/node_modules/@node-red/runtime/lib/nodes/index.js',
//'C:/src/nr-source/ti-theme/style.css'
],
ignore_watch: [
'C:/src/nr/node_modules',
'C:/src/nr/data/node_modules',
'C:/src/nr/.vscode',
'C:/src/node-red-contrib-uibuilder/front-end/dist',
'C:/src/node-red-contrib-uibuilder/nodes/icons',
'C:/src/node-red-contrib-uibuilder/nodes/.*\.html',
'C:/src/node-red-contrib-uibuilder/front-end/src',
'C:/src/node-red-contrib-uibuilder/templates',
'C:/src/node-red-contrib-uibuilder/node-src',
'C:/src/node-red-contrib-events/nodes/.*\.html',
'C:/src/node-red-contrib-drayton-wiser/nodes/.*\.html',
'C:/src/node-red-contrib-drayton-wiser/src/.*',
'C:/src/node-red-experimental-nodes/nodes/.*\.html',
],
// max_memory_restart: '1G',
env: {
NODE_ENV: 'development',
TI_ENV: 'debug',
//DEBUG: 'express:paths,express:router',
},
env_production: {
NODE_ENV: 'production'
},
//shutdown_with_message: true,
//kill_timeout : 3000,
//listen_timeout: 10000,
error_file: 'C:/src/nr/logout.log', // default: $HOME/.pm2/logs/XXXerr.log
out_file: 'C:/src/nr/logout.log', // default: $HOME/.pm2/logs/XXXout.log
pid_file: 'C:/src/nr/nrtest.pid', // default: $HOME/.pm2/pid/app-pm_id.pid
combine_logs: true,
merge_logs: true,
//log_date_format: 'DD HH:mm', // default: 'YYYY-MM-DD HH:mm Z'
}],
}
And the package.json scripts:
"scripts": {
"start": "pm2 start ecosystem.config.js && pm2 logs",
"restart": "pm2 restart Node-RED --update-env && pm2 logs",