I’m encountering an issue with nodemon in my Rails esbuild application. The esbuild setup for a new rails app uses nodemon by default to watch for changes in the .scss files and trigger the CSS build process (yarn build:css) whenever changes occur. However, despite trying various configurations and troubleshooting steps, I haven’t been able to get it to work properly and the ./bin/dev keeps ending unexpectedly. I wonder if anyone else had experience with this or might have an idea on what other steps I can take to troubleshoot?
Project Setup:
I’m using Rails with esbuild for JavaScript bundling and Sass for CSS preprocessing. My project is structured as a Rails application with the usual directory layout.
Steps Taken:
1. I initialised my project with the following command:
rails new app_name -d postgresql -j esbuild --css bootstrap
2. Then I added esbuild-rails by running (https://github.com/excid3/esbuild-rails):
yarn add esbuild-rails
3. I created an esbuild.config.js in the root folder with the following content:
const path = require("path");
const rails = require("esbuild-rails");
require("esbuild")
.build({
entryPoints: ["application.js"],
bundle: true,
outdir: path.join(process.cwd(), "app/assets/builds"),
absWorkingDir: path.join(process.cwd(), "app/javascript"),
plugins: [rails()],
})
.catch(() => process.exit(1));
- In the package.json, I changed the script to:
"build": "node esbuild.config.js" - Then ran yarn build.
What I’ve Tried:
Nodemon comes installed by default with Rails esbuild, but I encountered issues where it exits with code 1 without triggering the CSS build process or a log with more info about the error.
I tried switching to chokidar as an alternative file watcher, but encountered the same issue.
I verified the installation of both nodemon and chokidar and ensured they were accessible from my project directory.
I reviewed my project configuration files (package.json, esbuild.config.js, etc.) for any syntax errors or typos.
I uninstalled nodemon globally and reinstalled it locally in my project to ensure it was using the correct version.
I’ve checked the compatibility of my Node.js version, nodemon, and other dependencies to ensure they were compatible. Here are the versions being used:
- npm -v: 10.5.0
- yarn -v: 1.22.22
- node -v: v21.7.3
- nvm -v: 0.39.1
- rails -v: Rails 7.1.3.2
- nodemon -v: 3.1.0
When running yarn build:css manually, it works fine without any issues:
yarn build:css
$ yarn run v1.22.22
$ yarn build:css:compile && yarn build:css:prefix
$ sass ./app/assets/stylesheets/application.bootstrap.scss:./app/assets/builds/application.css --no-source-map --load-path=node_modules
$ postcss ./app/assets/builds/application.css --use=autoprefixer --output=./app/assets/builds/application.css
✨ Done in 3.72s.
Current behaviour:
When running ./bin/dev to start my Rails application, nodemon starts watching for changes in my .scss files but exits with code 1 without triggering the CSS build process (yarn build:css).
Expected Behavior:
I expect nodemon to watch for changes in my .scss files and trigger the CSS build process (yarn build:css) whenever changes occur, without exiting prematurely.
Additional Information:
I’ve tried adding --verbose and --inspect flags next to nodemon in the script, but still didn’t receive any error messages.
12:20:17 web.1 | started with pid 38513
12:20:17 js.1 | started with pid 38514
12:20:17 css.1 | started with pid 38515
12:20:18 js.1 | yarn run v1.22.22
12:20:18 css.1 | yarn run v1.22.22
12:20:18 js.1 | $ node esbuild.config.js --watch
12:20:18 css.1 | $ nodemon --watch ./app/assets/stylesheets/ --ext scss --exec "yarn build:css"
12:20:18 css.1 | [nodemon] 3.1.0
12:20:18 css.1 | [nodemon] to restart at any time, enter `rs`
12:20:18 css.1 | [nodemon] watching path(s): app/assets/stylesheets/**/*
12:20:18 css.1 | [nodemon] watching extensions: scss
12:20:18 css.1 | [nodemon] starting `yarn build:css`
12:20:18 js.1 | Done in 0.55s.
12:20:18 js.1 | exited with code 0
12:20:18 system | sending SIGTERM to all processes
12:20:18 css.1 | exited with code 1
12:20:18 web.1 | terminated by SIGTERM
Here’s the full package.json file for context:
{
"name": "app",
"private": true,
"dependencies": {
"@hotwired/stimulus": "^3.2.2",
"@hotwired/turbo-rails": "^8.0.4",
"@popperjs/core": "^2.11.8",
"autoprefixer": "^10.4.19",
"bootstrap": "^5.3.3",
"bootstrap-icons": "^1.11.3",
"esbuild": "^0.20.2",
"esbuild-rails": "^1.0.7",
"nodemon": "^3.1.0",
"postcss": "^8.4.38",
"postcss-cli": "^11.0.0",
"sass": "^1.75.0"
},
"scripts": {
"build": "node esbuild.config.js",
"build:css:compile": "sass ./app/assets/stylesheets/application.bootstrap.scss:./app/assets/builds/application.css --no-source-map --load-path=node_modules",
"build:css:prefix": "postcss ./app/assets/builds/application.css --use=autoprefixer --output=./app/assets/builds/application.css",
"build:css": "yarn build:css:compile && yarn build:css:prefix",
"watch:css": "nodemon --watch ./app/assets/stylesheets/ --ext scss --exec \"yarn build:css\""
},
"browserslist": [
"defaults"
]
}
Any insights or suggestions on how to resolve this issue would be greatly appreciated. Thank you in advance for your help!