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