Script startup freezes: `concurrently` + `mysql2` + `tsx watch`
Brief
Following setup freezes:
concurrently "vite" "tsx watch index.ts"
index.ts
console.log("hello world");
import "mysql2"
hello world does not log before app freezes.
Works:
# terminal 1:
vite
# terminal 2:
tsx watch index.ts
Or:
index.ts
console.log("hello world");
// import "mysql2"
Detailed Explanation
I was using concurrently with the mysql2 package, with tsx watch to run my code and watch for changes. At some point, it started freezing completely on startup. I even added a console.log at the very beginning of the entry point script that would not even print, which made me think it was an import issue (since I think imports run even before that console.log).
After disabling various parts of code, I finally disabled my import for mysql2 and it started running again. But, even if I did not use the value imported, just having the import "mysql2" by itself would cause it to freeze.
Finally, I tried running the two-part application without concurrently and just in separate terminals, and it worked fine, with the mysql2 import and everything.
I presume this is an issue with concurrently, mysql2, and tsx watch since it works fine if I remove any one of these three dependents (using tsx not in watch mode also works). I switched to npm-run-all and it works fine now. Not sure exactly what mysql2 is doing as a side-effect, or what breaks it when using concurrently.
Environment
OS: Windows 10 x64 Terminal: Powershell integrated in VSCode 1.96.2
Minimal Example
I've reproduced this issue with two files:
- The following minimal
package.json:
{
"name": "test",
"version": "0.0.1",
"scripts": {
"dev": "concurrently \"vite\" \"tsx watch index.ts\"",
"dev-nowatch": "concurrently \"vite\" \"tsx index.ts\"",
"dev-index": "tsx watch index.ts"
},
"dependencies": {
"mysql2": "^3.12.0"
},
"devDependencies": {
"concurrently": "^9.1.2",
"tsx": "^4.19.2",
"typescript": "~5.6.2",
"vite": "^6.0.5"
}
}
- The following file,
index.ts:
console.log("hello world");
import "mysql2";
With these files, run:
npm i
The following shows that hello world does not log as expected:
npm run dev
The following commands show that it does print when not using concurrently or when not using watch mode:
npm run dev-nowatch
npm run dev-index
Also try commenting out import "mysql2" to see that this also works:
console.log("hello world");
// import "mysql2"
Thanks for the report! I confirmed it on a Windows VM, but can't replicate it on macOS.
I am having the same issue.
My use-case is running TailwindCSS v4 in watch mode concurrently with tsx watch main.tsx on Windows 11 (no WSL), Node v20.3.1, PNPM v10.6.5.
"dev": "concurrently \"pnpm dev:tsx\" \"pnpm dev:tailwind\"",
"dev:tsx": "tsx watch src/main.tsx",
"dev:tailwind": "tailwindcss -i ./src/input.css -o ./dist/output.css --watch",
The Tailwind process works flawlessly. The TSX process appears to work for a split second after launch, and then the server stops responding and a setInterval I used for debugging stops running.
Both processes restart (individually, not together) when the respective files they're watching change.
dev:tsx and dev:tailwind work flawlessly when I run them in separate terminal sessions at the same time.