Having worked on a small BuckleScript/ReasonReact app full time for two weeks, my experience is mixed.
On the one hand, the experience with BuckleScript is quite smooth. The build system, the standard library (Belt), built-in syntax extensions, libraries like ReasonReact, all work well together and present a compelling package. They are built with a lot of care and attention to details.
On the other hand, BuckleScript makes it very hard to reuse any existing code. (Not a lot of people have the luxury of having this problem, though!) You can’t just use an opam package; you need to convert it to an NPM package first. Can’t use your favorite ppx. Can’t share async code between native and JS.
While with js_of_ocaml you can take any package from opam, use any ppx, use Lwt on both client and server. This is very compelling for me.
My impression is that, while BuckleScript is faithful to OCaml, the language, it forks the OCaml ecosystem. And that’s not necessarily a bad thing. Existing OCaml ecosystem has a huge survivorship bias. Just compare what is being worked on in the “new world” (BuckleScript/Reason) and the “old world”. The old world is addressing the issues of the existing OCaml users, big and small. While the new world is focused users, who are yet to be OCaml developers. The new world is working at the beginning of the acquisition funnel, while the old world—with the end of it.
So I plan to stick to the old world myself but will keep promoting both the old-world as well as BuckleScript, Reason, and Elm—depending on who I talk to.