Files
plainleaf/docs/Space Lua/JavaScript Interop.md
T

70 lines
2.1 KiB
Markdown

---
references:
- client/space_lua/stdlib/js.ts
- client/space_lua/runtime.ts
---
Space Lua runs in the browser and has direct access to JavaScript APIs through the `js` module. This enables you to use the browser's native capabilities and import external JavaScript libraries. Use this functionality with caution. With great power comes comes great responsibility.
The full API reference is at [[API/js]].
# Accessing browser APIs
Use `js.window` to access the browser's `window` object:
```lua
-- Get the current URL
local url = js.window.location.href
-- Set a timeout
js.window.setTimeout(function()
editor.flashNotification("Timer fired!")
end, 3000)
```
# Importing JavaScript modules
Use `js.import` to load JavaScript modules from URLs (typically via CDNs like esm.sh):
```lua
local lodash = js.import("https://esm.sh/lodash@4.17.21")
local chunks = lodash.chunk({1, 2, 3, 4, 5, 6}, 2)
print(js.stringify(chunks)) -- [[1,2],[3,4],[5,6]]
```
# Converting between Lua and JavaScript values
Lua tables and JavaScript objects/arrays are different types. Space Lua tries its best to map between them the best in can, but sometimes you may need finer grained control:
* `js.tojs(luaValue)` — converts a Lua value to its JavaScript equivalent
* `js.tolua(jsValue)` — converts a JavaScript value to its Lua equivalent
# Creating JavaScript objects
Use `js.new` to instantiate JavaScript classes:
```lua
local obj = js.new(SomeConstructor, arg1, arg2)
```
# Async transparency
Space Lua handles JavaScript promises transparently. When a JavaScript function returns a Promise, Space Lua automatically awaits it — you don't need to write any special async/await code:
```lua
-- This just works, even though fetch() returns a Promise
local response = js.window.fetch("https://api.example.com/data")
```
# Iterating JavaScript async iterables
Use `js.eachIterable` to iterate over JavaScript async iterables:
```lua
for value in js.eachIterable(someAsyncIterable) do
print(value)
end
```
# Logging
Use `js.log` to write to the browser's developer console:
```lua
js.log("Debug:", {name = "test", count = 42})
```
See also: [[API/js]], [[Space Lua]]