70 lines
2.1 KiB
Markdown
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]]
|