高级主题

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 有三个路径

所有这三个都可以配置,但都有合理的默认值。默认情况下,服务基础和 websocket 基础默认为公共基础的绝对路径。如果公共基础没有斜杠,则会附加一个斜杠。公共基础可以是以下之一

如果公共基础是绝对 URL,则该 URL 的路径将用作服务和 websocket 基础。如果公共基础是相对路径,则它将被转换为绝对路径。这两种方法都可能导致应用程序功能失常,具体取决于您的环境。控制台上会显示警告。但是,通过使用 serve-base 或 ws-base 提供显式值,可以解决此问题。

为什么这是必要的?它在什么时候有用?它主要是为了在没有考虑到的情况下提供所有的旋钮/配置。public-url 的魔力对很多人都有效,但并非对所有人有效。为了支持这种情况,现在可以调整所有设置,但代价是增加了复杂性。拥有合理的默认值应该使简单的情况保持简单。

一个示例用例是在 trunk serve *前面*的反向代理,它无法配置为在 trunk serve 期望的位置服务 trunk websocket。现在,可以使用 --public-url 在生成链接时选择基础,以便在代理服务时看起来是正确的。但也可以使用 --serve-base / 以保持从根目录提供资源。