The JavaScript Backend
std/dom, std/jsffi, std/asyncjs (async with JS promises), std/jsfetch, std/jsconsole, std/jsre, std/jsbigints.
Karax: SPA framework with a virtual DOM. HappyX: full-stack. You can share the same Nim code between backend (C) and frontend (JS) with when defined(js).
Node.js targets: nim js -d:nodejs.
# app.nim
import std/[dom, jsconsole, jsffi]
proc onClick(e: Event) =
let el = document.getElementById("out")
el.innerHTML = "Clicked at " & $e.clientX
console.log("clicked")
window.onload = proc (e: Event) =
document.getElementById("btn").addEventListener("click", onClick)
# JS interop
proc alert(msg: cstring) {.importjs: "alert(#)".}
var jsObj {.importjs: "window.myGlobal", nodecl.}: JsObject
let parsed = JSON.parse("{\"a\":1}".cstring)nim js -d:release -o:public/app.js app.nim