#web-server #static-file #static #server #web #embed #file-server

rust-embed-for-web

Rust 宏,将文件嵌入您的可执行文件。是 rust-embed 的分支,重点在于在网页服务器上的使用。

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 网页编程

Download history 386/week @ 2024-05-02 1150/week @ 2024-05-09 928/week @ 2024-05-16 1058/week @ 2024-05-23 970/week @ 2024-05-30 554/week @ 2024-06-06 768/week @ 2024-06-13 715/week @ 2024-06-20 868/week @ 2024-06-27 1247/week @ 2024-07-04 636/week @ 2024-07-11 603/week @ 2024-07-18 672/week @ 2024-07-25 786/week @ 2024-08-01 565/week @ 2024-08-08 564/week @ 2024-08-15

每月下载量 2,781
用于 actix-web-rust-embed-resp…

MIT 许可证

1MB
382

Rust Embed for Web

All Contributors

Crates.io Test coverage report lint checks MIT license

Rust 宏,将文件嵌入您的可执行文件。是 rust-embed 的分支,重点在于在网页服务器上的使用。

rust-embed 的区别

此包选择了一些可能会增加您的可执行文件大小,但可以换取运行时更好性能的选择。特别是

  • 文件内容可能被存储多次,包括压缩和不压缩的。这使得服务器能够根据客户端是否接受压缩来提供文件,而无需在运行时压缩或解压缩任何内容。
    • 如果压缩没有太大区别,例如 jpeg 文件可能根本不会进一步压缩,则不会包含压缩版本。
    • 您还可以通过添加属性 #[gzip = false]#[br = false] 来禁用此行为。禁用时,该嵌入将不包含压缩文件。
  • 一些对网页头部有用的元数据(如 ETagLast-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-embedcrate不同,所以请仔细检查您的包含和排除属性以确保文件正确。

例如,如果您想排除所有.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");
}

贡献者

Hengfei Yang
杨恒飞

💻
peroxid
peroxid

🐛
Nicolas Guiard
尼古拉斯·居雅德

💻 🐛

依赖项

~9–17MB
~371K SLoC