这是使用 Rust 和 WebAssembly 的未发布文档,已发布的文档可在 Rust 和 WebAssembly 主文档网站上找到。此处记录的功能可能在 Rust 和 WebAssembly 工具的已发布版本中不可用。

缩小 .wasm 文件大小

对于我们通过网络交付给客户的 .wasm 二进制文件,例如我们的生命游戏 Web 应用程序,我们希望关注代码大小。.wasm 文件越小,页面加载速度越快,用户体验越好。

我们如何通过构建配置来缩小生命游戏 .wasm 二进制文件的大小?

花点时间回顾一下我们可以调整的构建配置选项,以获得更小的 .wasm 代码大小。

使用默认的发布构建配置(没有调试符号),我们的 WebAssembly 二进制文件大小为 29,410 字节

$ wc -c pkg/wasm_game_of_life_bg.wasm
29410 pkg/wasm_game_of_life_bg.wasm

在启用 LTO、设置 opt-level = "z" 并运行 wasm-opt -Oz 后,生成的 .wasm 二进制文件缩小到只有 17,317 字节

$ wc -c pkg/wasm_game_of_life_bg.wasm
17317 pkg/wasm_game_of_life_bg.wasm

如果我们使用 gzip(几乎所有 HTTP 服务器都使用)压缩它,我们就可以将其缩小到只有 9,045 字节!

$ gzip -9 < pkg/wasm_game_of_life_bg.wasm | wc -c
9045

练习

  • 使用wasm-snip 工具从我们的生命游戏的 .wasm 二进制文件中删除恐慌基础设施函数。它节省了多少字节?

  • 使用和不使用wee_alloc 作为其全局分配器来构建我们的生命游戏板条箱。我们克隆来启动此项目的 rustwasm/wasm-pack-template 模板有一个“wee_alloc”货物功能,您可以通过将其添加到 wasm-game-of-life/Cargo.toml[features] 部分的 default 键中来启用它

    [features]
    default = ["wee_alloc"]
    

    使用 wee_alloc 可以将 .wasm 二进制文件的大小缩小多少?

  • 我们只实例化一个 Universe,因此,与其提供构造函数,不如导出操作来操作单个 static mut 全局实例。如果此全局实例也使用前面章节中讨论的双缓冲技术,我们可以将这些缓冲区也设为 static mut 全局变量。这将从我们的生命游戏实现中删除所有动态分配,并且我们可以将其设为 #![no_std] 板条箱,该板条箱不包含分配器。完全删除分配器依赖项后,从 .wasm 中删除了多少大小?