JavaScript 互操作性
Trunk 将会创建必要的 JavaScript 代码来引导和运行基于 WebAssembly 的应用程序。它也会包含所有 wasm-bindgen
生成的 JavaScript 代码片段,用于与 JavaScript 功能交互。
默认情况下,使用 wasm-bingen
从 Rust 导出的函数可以通过全局变量 window.wasmBindings
在 JavaScript 代码中访问。此行为可以禁用,并且名称可以自定义。有关更多信息,请参阅 rust
资源类型。
库 crate
除了拥有一个 main
函数之外,也可以将你的项目设置为 cdylib
项目。为了做到这一点,请将以下内容添加到你的 Cargo.toml
[lib]
crate-type = ["cdylib", "rlib"]
然后,像这样在你的 lib.rs
中定义入口点(不需要是 async
)
#[wasm_bindgen(start)]
pub async fn run() {}
初始化器
自从:0.19.0-alpha.1
。
Trunk 支持接入 WASM 应用程序的初始化过程。默认情况下,此功能未激活,并且工作方式与以前的版本相同。
默认过程是 Trunk 注入一个小的 JavaScript 代码片段,该片段导入 wasm_bindgen
生成的 JavaScript 加载器并调用 init
方法。这将获取 WASM blob 并运行它。
缺点是,在此过程中,没有给用户的反馈。无论是加载 WASM 文件需要更长时间,还是出现问题时,都没有反馈。
现在可以通过将 data-initializer
设置为 JavaScript 模块文件来接入此过程。此模块文件需要(默认)导出一个函数,该函数返回 “initializer” 实例。这是一个例子
export default function myInitializer () {
return {
onStart: () => {
// called when the loading starts
},
onProgress: ({current, total}) => {
// the progress while loading, will be called periodically.
// "current" will contain the number of bytes of the WASM already loaded
// "total" will either contain the total number of bytes expected for the WASM, or if the server did not provide
// the content-length header it will contain 0.
},
onComplete: () => {
// called when the initialization is complete (successfully or failed)
},
onSuccess: (wasm) => {
// called when the initialization is completed successfully, receives the `wasm` instance
},
onFailure: (error) => {
// called when the initialization is completed with an error, receives the `error`
}
}
};
有关完整示例,请参阅:https://github.com/trunk-rs/trunk/tree/main/examples/initializer。
更新检查
自从:0.19.0-alpha.2
。
Trunk 内置了更新检查。默认情况下,它会在 crates.io
上检查 trunk
crate 是否有更新的(非预发布)版本。如果找到,信息将显示在命令行中。
此检查可以完全禁用,但不能启用 cargo feature update_check
。它也可以在运行时使用环境变量 TRUNK_SKIP_VERSION_CHECK
或使用命令行开关 --skip-version-check
禁用。
检查仅每 24 小时执行一次。
基础 URL、公共 URL、路径 & 反向代理
自从:0.19.0-alpha.3
。
最初,trunk
有一个单一的 --public-url
,它允许设置托管应用程序的基础 URL。简单明了。这是所有生成的 URL 的前缀,并作为 trunk serve
的基础。
不幸的是,生活并没有那么简单,命名也很难。
现在 trunk
有三个路径
- “公共基础 URL”:充当所有生成的 URL 的前缀
- “服务基础”:充当
trunk serve
服务的所有内容的范围/前缀 - “websocket 基础”:充当自动重载 websocket 的基础路径
所有这三个都可以配置,但都有合理的默认值。默认情况下,服务基础和 websocket 基础默认为公共基础的绝对路径。如果公共基础没有斜杠,则会附加一个斜杠。公共基础可以是以下之一
- 未设置/无/默认(意味着
/
) - 绝对 URL(例如
http://domain/path/app
) - 绝对路径(例如
/path/app
) - 相对路径(例如
foo
或./
)
如果公共基础是绝对 URL,则该 URL 的路径将用作服务和 websocket 基础。如果公共基础是相对路径,则它将被转换为绝对路径。这两种方法都可能导致应用程序功能失常,具体取决于您的环境。控制台上会显示警告。但是,通过使用 serve-base 或 ws-base 提供显式值,可以解决此问题。
为什么这是必要的?它在什么时候有用?它主要是为了在没有考虑到的情况下提供所有的旋钮/配置。public-url 的魔力对很多人都有效,但并非对所有人有效。为了支持这种情况,现在可以调整所有设置,但代价是增加了复杂性。拥有合理的默认值应该使简单的情况保持简单。
一个示例用例是在 trunk serve
*前面*的反向代理,它无法配置为在 trunk serve
期望的位置服务 trunk websocket。现在,可以使用 --public-url
在生成链接时选择基础,以便在代理服务时看起来是正确的。但也可以使用 --serve-base /
以保持从根目录提供资源。