The cool thing about Phoenix specifically is that they provide a JS client to integrate with a Phoenix Channels [1] backend that will automatically fail-over to long-polling if window.WebSocket is not available [2]. These Phoenix Channels are set up to be transport agnostic, so you don't have to write any special backend or client code to handle one way or the other, it "just works" for the most part.
[0] https://caniuse.com/#search=Websockets
[1] https://hexdocs.pm/phoenix/channels.html
[2] https://github.com/phoenixframework/phoenix/blob/master/asse...
[EDIT] I see another commenter in this thread mentions phoenix.js beating socket.io. Thanks, I will have to look into this!
But Phoenix contains these workarounds and it works great. So with Phoenix Channels you can really just act like It Just Works.
(phoenix.js is one of the best parts of the library IMHO - its design beats eg socket.io dead out of the water)