14 个稳定版本 (3 个主要版本)
11.2.1 | 2024 年 5 月 17 日 |
---|---|
11.2.0 | 2024 年 1 月 13 日 |
11.1.4 | 2023 年 10 月 26 日 |
11.1.1 | 2023 年 4 月 5 日 |
7.0.0 | 2022 年 10 月 9 日 |
#167 in 网页编程
每月下载量 2,781
用于 actix-web-rust-embed-resp…
1MB
382 行
Rust Embed for Web
Rust 宏,将文件嵌入您的可执行文件。是 rust-embed
的分支,重点在于在网页服务器上的使用。
与 rust-embed
的区别
此包选择了一些可能会增加您的可执行文件大小,但可以换取运行时更好性能的选择。特别是
- 文件内容可能被存储多次,包括压缩和不压缩的。这使得服务器能够根据客户端是否接受压缩来提供文件,而无需在运行时压缩或解压缩任何内容。
- 如果压缩没有太大区别,例如 jpeg 文件可能根本不会进一步压缩,则不会包含压缩版本。
- 您还可以通过添加属性
#[gzip = false]
和#[br = false]
来禁用此行为。禁用时,该嵌入将不包含压缩文件。
- 一些对网页头部有用的元数据(如
ETag
和Last-Modified
)预先计算并嵌入到可执行文件中。这使得在网页服务器中使用这些信息而无需在运行时进行计算成为可能。 - 文件哈希以
base85
编码而不是十六进制,这稍微更紧凑。当用作请求中文件的ETag
值时,这略微减少了需要传输的数据量。 - 文件数据(在发布构建中)以
&'static
引用返回。这使得在服务器响应中使用文件数据变得容易,而无需创建副本或引用计数。- 在调试构建中,当访问嵌入时,将动态读取文件。这意味着在调试时,不需要重新编译就可以看到嵌入文件的更改。
安装
[dependencies]
rust-embed-for-web="11.1.4"
使用方法
要使用此宏,请添加一个空的struct,然后添加derive。然后,指定要使用的文件夹。
use rust_embed_for_web::{EmbedableFile, RustEmbed};
#[derive(RustEmbed)]
#[folder = "examples/public/"]
struct Asset;
fn main() {
let index = Asset::get("index.html").unwrap().data();
let contents = std::str::from_utf8(index.as_ref()).unwrap();
println!("Index file: {}", contents);
}
folder
的路径是相对于Cargo.toml
的位置解析的。
禁用压缩
您可以为您的embed添加#[gzip = false]
和/或#[br = false]
属性,以禁用该embed中文件的gzip和brotli压缩。rust-embed-for-web
将只包括压缩文件,如果压缩实际上使文件更小,所以那些不会很好地压缩的文件,如图像或存档,已经不包括它们的压缩版本。然而,您可以
功能
以下两个功能默认启用。
interpolate-folder-path
允许在folder
路径中使用环境变量和~
。例如
#[derive(RustEmbed)]
#[folder = "~/${PROJECT_NAME}/assets"]
struct Asset;
~
将展开到您的家目录,而${PROJECT_NAME}
将展开到PROJECT_NAME
环境变量的值。
include-exclude
您可以通过添加一个或多个#[include = "*.txt"]
和#[exclude = "*.jpg"]
属性来过滤要嵌入的文件。匹配是在相对文件路径上进行的——您用于.get
调用的路径——通过globset
。首先处理排除项,然后应用包含项以提供例外。
⚠️ 这与原始的
rust-embed
crate不同,所以请仔细检查您的包含和排除属性以确保文件正确。
例如,如果您想排除所有.svg
文件(除了一个名为logo.svg
的文件),您可以这样做
#[derive(RustEmbed)]
#[exclude = "*.svg"]
#[include = "logo.svg"]
#[folder = "assets/"]
struct Assets;
prefix
您可以指定一个前缀,该前缀将被添加到文件的路径中。例如
#[derive(RustEmbed)]
#[folder = "public/"]
#[prefix = "static/"]
struct Asset;
fn main() {
// Say you had a file named "image.png" in a folder named "public".
// You'll get the asset when requesting it with the prefix.
let correct = Asset::get("static/image.png");
// You'll get None, because you didn't specify the prefix
let wrong = Asset::get("image.png");
}
贡献者
杨恒飞 💻 |
peroxid 🐛 |
尼古拉斯·居雅德 💻 🐛 |
依赖项
~9–17MB
~371K SLoC