#size-optimization #perseus #web-dev #bundle #user #browser

perseus-size-opt

Perseus的一个插件,可以在一行代码中添加大小优化,无需卸载

10个版本

0.1.9 2022年4月20日
0.1.8 2022年4月20日
0.1.7 2021年12月21日
0.1.3 2021年11月29日
0.1.1 2021年10月30日

#526WebAssembly


2 个Crate中使用(通过 tribble-app

MIT 许可证

20KB
167

Perseus Size Optimization Plugin

注意:v0.1.0-v0.1.3版本的用户,如果使用Rust 2021,应升级到v0.1.4,因为在发布模式下尝试编译您的应用程序时会发生上游错误。有关详细信息,请参阅 此处

这是一个非常简单的Perseus插件,可以自动应用大小优化,显著减小最终Wasm包的大小,这意味着用户加载速度更快,因为需要传输到浏览器中的数据更少。由于Perseus通过静态生成几乎立即渲染页面,然后需要Wasm包使页面交互式,应用此插件将减少应用程序的交互时间和总阻塞时间(这是一个Lighthouse指标,普通Perseus应用程序在移动设备上表现不佳)。

如果您是Perseus的新用户,请在其网站GitHub上查看!基本上,它是一个非常快且功能齐全的Rust网络框架!

用法

在您的 src/lib.rs 中,对 PerseusApp 调用以下函数

PerseusApp::new()
    [...]
    .plugins(Plugins::new()
        .plugin(
            perseus_size_opt,
            SizeOpts::default()
        ))
我正在使用 `define_app!`

如果您仍在使用v0.3.3中的 define_app!,您应尽快升级到使用 PerseusApp,但您仍然可以通过在 define_app! 调用底部添加以下内容来使用此插件

plugins: Plugins::new().plugin(perseus_size_opt, SizeOpts::default())

如果您已定义其他插件,请在适当的位置添加 .plugin() 调用。您还需要添加以下导入

use perseus_size_opt::{perseus_size_opt, SizeOpts};

完成后,运行 perseus tinker 以应用优化(因为这些涉及修改 .perseus/ 目录,所以需要单独的命令),然后您就可以像平常一样处理应用程序了!

如果您想卸载插件,只需移除相关的 .plugin() 调用,然后重新运行 perseus tinker,它将被完全移除。

优化

此插件目前执行以下优化

  • wee_alloc -- 专为 Wasm 设计的替代分配器,以略微减慢分配速度为代价来减少二进制文件大小
  • lto -- 当设置为 true 时,通过启用链接时优化来减少二进制文件大小
  • opt-level -- 当设置为 z 时,积极优化二进制文件大小
  • codegen-units -- 当设置为较低值时,生成更快、更小的代码(但在发布模式下会减慢编译时间)

请注意,所有优化都仅适用于发布构建,除了 wee_alloc,它还会影响开发构建。

选项

有一些默认选项可用于设置大小优化级别,或者您可以手动构建 SizeOpts 来轻松创建自定义设置。

  • ::default() -- 启用所有优化
  • ::default_no_lto() -- 启用所有优化,除了 lto = true,因为这可能会破坏某些托管提供商(如 Netlify)的编译和执行,
  • ::only_wee_alloc() -- 仅使用 wee_alloc,不应用其他优化
  • ::no_wee_alloc() -- 应用除 wee_alloc 之外的所有优化

已知错误

发布模式编译永远无法完成

是由于 Rust 2021 中的上游问题,导致 fluent-bundle 包的尺寸优化导致 LLVM 过载(见 此问题)。截至 v0.1.4,此插件考虑了这一点,不会尝试使用 default() 选项来优化 fluent-bundle。然而,这将增加包的大小,因此建议,在解决这个问题之前,使用此插件的用户现在仍然使用 Rust 2018,并使用 default_2018() 函数。这将适当优化 fluent-bundle,同时确保不会出现此错误。如果迁移到 Rust 2018 不切实际,您将不得不暂时忍受略大的包,直到上游问题得到解决(这似乎取决于 LLVM 团队)。

稳定性

由于此插件的优化非常基本(整个插件仅一个文件),因此其稳定性主要取决于 Perseus。如果您愿意使用 Perseus,那么您也不必担心使用此插件(实际上,建议所有 Perseus 应用都使用此插件)。

许可证

请参阅LICENSE

依赖项

约22MB
约384K SLoC