The problem that I find with Makefiles, in Node projects, is that node scripts and tools are pretty slow to startup and pretty much all of them have some run-on-all-files type of setup<p>So, for example, instead of running the typescript compiler for a single file<p><pre><code> tsc src/index.ts
</code></pre>
You are better suited to run the compiler to the whole repository:<p><pre><code> tsc --build ./tsconfig.json
</code></pre>
Which implements incremental building and dependency tracking automatically.<p>For this case having make run tsc for each file individually hurts performance pretty bad. Something like this will not scale very well:<p><pre><code> src/%.js: src/%.ts
tsc $<
</code></pre>
There's definitely a overlap where each JS tool implements its own incremental building, cache system and dependency resolver. Eslint, prettier, npm, webpack could all benefit from being more Unixy and forwarding the task management to a tool to rule them all.<p>Things are changing though, and tools like swc and esbuild are getting pretty fast. And there a few attempts for an universal build system on NX and TurboRepo. My dream scenario is where we get a single command interface, similar to gradle or bazel, where you just run `tool build` and everything gets setup for you without fuzz