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日 |
#526 在 WebAssembly 中
在 2 个Crate中使用(通过 tribble-app)
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