Swift framework to interact with JavaScript through WebAssembly.
Check out the Hello World tutorial for a step-by-step guide to getting started.
JavaScriptKit provides a seamless way to interact with JavaScript from Swift code when compiled to WebAssembly. It allows Swift developers to:
- Access JavaScript objects and functions
- Create closures that can be called from JavaScript
- Convert between Swift and JavaScript data types
- Use JavaScript promises with Swift's
async/await - Work with multi-threading
import JavaScriptKit
// Access global JavaScript objects
letdocument=JSObject.global.document
// Create and manipulate DOM elements
vardiv= document.createElement("div")
div.innerText ="Hello from Swift!"
_ = document.body.appendChild(div)
// Handle events with Swift closures
varbutton= document.createElement("button")
button.innerText ="Click me"
button.onclick =.object(JSClosure{ _ inJSObject.global.alert!("Button clicked!")return.undefined
})
_ = document.body.appendChild(button)Learn more:JavaScript Interop Cheat Sheet
Note: BridgeJS is experimental. APIs may change in future releases.
BridgeJS provides easy interoperability between Swift and JavaScript/TypeScript. It enables:
- Export Swift to JavaScript - Expose Swift functions, classes, and types to JavaScript; the plugin also generates TypeScript definitions (
.d.ts) for the exported API. - Import JavaScript into Swift - Make JavaScript/TypeScript APIs (functions, classes, globals like
documentorconsole) callable from Swift with type-safe bindings. You can declare bindings with macros in Swift or generate them from a TypeScript declaration file (bridge-js.d.ts).
For architecture details, see the BridgeJS Plugin README. For package and build setup, see Setting up BridgeJS in the documentation.
Mark Swift code with @JS to make it callable from JavaScript:
import JavaScriptKit
@JSclassGreeter{@JSvarname:String@JSinit(name:String){self.name = name
}@JSfunc greet()->String{return"Hello, \(name)!"}}JavaScript usage:
constgreeter=newexports.Greeter("World");console.log(greeter.greet());// "Hello, World!"Learn more:Exporting Swift to JavaScript
Declare bindings in Swift with macros such as @JSFunction, @JSClass, @JSGetter, and @JSSetter:
import JavaScriptKit
@JSClassstruct Document {@JSFunctionfunc getElementById(_ id:String)throws(JSException)-> HTMLElement
@JSFunction func createElement(_ tagName:String)throws(JSException)-> HTMLElement
}@JSGetter(from:.global)var document: Document
@JSClassstructHTMLElement{@JSGettervarinnerText:String@JSSetterfunc setInnerText(_ newValue:String)throws(JSException)@JSFunction func appendChild(_ child:HTMLElement)throws(JSException)}@JS func run()throws(JSException){letbutton=try document.createElement("button")try button.setInnerText("Click Me")letcontainer=try document.getElementById("app")try container.appendChild(button)}You can also generate the same macro-annotated Swift from a TypeScript file (bridge-js.d.ts). See Generating bindings from TypeScript in the documentation.
Learn more:Importing JavaScript into Swift
Use the BridgeJS Playground to preview what interfaces will be exposed on the Swift/TypeScript sides.
Check out the examples for more detailed usage patterns.
The minimum supported Swift version is 6.3.
Contributions are welcome! See CONTRIBUTING.md for details on how to contribute to the project.
Become a gold or platinum sponsor and contact maintainers to add your logo on our README on Github with a link to your site.