Ports are essentially event emitters. You can expose them from elm, and in your JS code you attach event handlers to them using .onMessage (I think, been a while).<p>You can post and receive messages from ports (depending on type). Type checking is done at runtime to make sure nothing breaks.<p>Cljs interop is easier (can just call a function directly).