blues-stack
blues-stack copied to clipboard
Race condition in npm run dev
Have you experienced this bug with the latest version of the template?
Yes
Steps to Reproduce
npm run dev
Expected Behavior
I would expect npm run dev to always build and start the various servers without problems related to build timing/order.
Actual Behavior
Sometimes when running npm run dev, the various parallel build processes happen in an order such that the server can't start:
https://github.com/remix-run/blues-stack/blob/main/package.json#L10-L14
The only way to fix this is to manually run npm run build then re-try npm run dev. I guess because these commands aren't finishing (due to --watch), it isn't easy to know when to run the next step? Regardless, it would be good to find a better way to do this that doesn't randomly fail.
I found that even changing https://github.com/remix-run/blues-stack/blob/main/package.json#L10 to this helps a bunch:
"dev": "run-p dev:build dev:remix dev:server",
Just ran into this issue today as well when trying to follow this stack's dev/build scripts. Explicitly expanding the script names didn't work for me but as a workaround I've set a three second delay for the dev:server script:
"delay": "node -e \"setTimeout(() => process.exit(0), 3000)\"",
"dev:server": "npm run delay && cross-env NODE_ENV=development node --inspect --require ./node_modules/dotenv/config --require ./mocks ./build/server.js"
And now it works without having to run npm run build first.
But it's still a potential race condition though, although the longer the delay the less likely it is.
UPDATE
For anyone reading this in the future: if you don't mind installing an npm package, you can use wait-on to wait for the build files to exist before trying to run node. This way, you don't have to wait longer than needed (or risk not waiting long enough); you'll wait just until the files are built. In my case I installed the package and updated the scripts in package.json:
"scripts": {
...
"dev:server": "cross-env NODE_ENV=development npm run wait-build && node --inspect --require ./node_modules/dotenv/config --require ./mocks ./build/server.js",
"wait-build": "wait-on -t 20000 ./build/server.js ./build/index.js"
},
The -t 20000 option makes wait-on wait a maximum of 20,000 ms (20 seconds) for the files before failing.
Another alternative if you don't want to add another npm dependency is to write a custom node script which polls for the files existence and use that instead.
@kwabe007 this is better for sure, thanks for sharing.
I'm wondering if this issue should be resolved with the latest release of remix?
https://github.com/remix-run/remix/releases/tag/remix%401.16.0
I have used the Blue Stack pretty much as-is, so I'm not 100% sure on the internals. But if I understand correctly, couldn't the scripts be changed such that dev is just a single command?
Hi there,
Updating to node 20 fixed this issue for me.