You’re approaching this from a different background, which naturally comes with expectations about how certain things should work.
Using pnpm
There’s a wide range of package manager setups in the JS ecosystem today, and it’s genuinely difficult to keep up with all of them.
The
.mjsfiles polluting thesrcwere not appealing at all.
This is largely a matter of perspective. It’s only a problem if you consider it one. I had the same reaction initially, especially to the fact that files need to be written to disk for Vite to pick them up. Over time you adjust to this and accept that this is not intended to be a 1:1 replacement for the toolchain you’re coming from.
I first thought
.resifiles were mandatory. It was a deal breaker for me.
Signature files are only required to support React Fast Refresh. That nuance isn’t emphasized enough in the documentation. It is mentioned in this blog post, but it’s easy to miss.
I was surprised to see that setting a screaming case variable like
let SNACKBAR_TIMEOUT = 5_000produced a cryptic “variant constuctor not found” error.
This error only feels cryptic if you’re not yet familiar with the language fundamentals. In ReScript, capitalized identifiers are reserved for modules and variant constructors. Documentation can’t realistically enumerate all assumptions brought over from other languages.
Overall, it feels like you’re evaluating ReScript too much through an F# lens. The documentation does cover most of these points, but it does require a linear, end-to-end read rather than selective lookup.
It’s also worth weighing the positives:
-
Much smoother integration with the JS ecosystem. The compiler is distributed via npm and that’s it, no dual package manager setup.
-
Very fast builds. While Fable can be quick, it still depends on slower components like NuGet and MSBuild.
-
Once you’re comfortable with bindings, they’re arguably simpler than their Fable equivalents.
-
A smaller but relevant advantage: if you’re motivated to fix a specific issue, the feedback loop is extremely fast. Maintainers are responsive and changes can land quickly. In contrast, fixes to the F# compiler typically require navigating a much larger process and release pipeline.
For me, the switch was worth it. I do miss some aspects of F# occasionally, but overall I’m very happy with ReScript.