#actix-web #压缩 #响应 #响应器 #缓存 #嵌入 #性能

actix-web-rust-embed-responder

为 rust-embed 实现缓存验证和压缩响应的 actix-web 响应器

8 个稳定版本

2.2.3 2024 年 6 月 28 日
2.2.2 2023 年 10 月 8 日
2.2.1 2023 年 4 月 6 日
2.2.0 2023 年 2 月 3 日
0.1.0 2022 年 10 月 21 日

#43 in HTTP 服务器

Download history 508/week @ 2024-05-03 1010/week @ 2024-05-10 752/week @ 2024-05-17 1117/week @ 2024-05-24 811/week @ 2024-05-31 625/week @ 2024-06-07 664/week @ 2024-06-14 685/week @ 2024-06-21 1181/week @ 2024-06-28 1150/week @ 2024-07-05 585/week @ 2024-07-12 688/week @ 2024-07-19 493/week @ 2024-07-26 797/week @ 2024-08-02 482/week @ 2024-08-09 680/week @ 2024-08-16

2,656 每月下载量

MIT 许可证

1.5MB
511

Rust Embed 响应器 for Actix Web

All Contributors Crates.io docs.rs tests Test coverage report lint checks MIT license

用于在服务器中提供嵌入文件的 Actix Web 响应器。您可以将文件嵌入到您的服务器中,然后使用此响应器从您的服务器中提供它们。例如,您可以有一个 Web 应用程序提供其自身的资产、html、css、javascript 文件等。

此 crate 实现了对 rust embed 的响应器,以及一个更高效的分支 rust-embed-for-web

使用方法

首先,将此 crate 和 rust-embedrust-embed-for-web 添加到您的 Cargo.toml

[dependencies]
actix-web = "4.2"
rust-embed = "6.4" # or rust-embed-for-web = "11.1"
actix-web-rust-embed-responder = "2.1.1"

然后,设置您的嵌入和处理器,并添加您的响应器。

use actix_web::{route, web, App, HttpServer};
use actix_web_rust_embed_responder::{EmbedResponse, IntoResponse};
use rust_embed::{EmbeddedFile, RustEmbed};

#[derive(RustEmbed)]
#[folder = "path/to/assets/"]
struct Embed;

// This responder implements both GET and HEAD
#[route("/{path:.*}", method = "GET", method = "HEAD")]
// The return type is important, that is the type for this responder
async fn serve_assets(path: web::Path<String>) -> EmbedResponse<EmbeddedFile> {
    // This is not required, but is likely what you want if you want this
    // to serve `index.html` as the home page.
    let path = if path.is_empty() {
        "index.html"
    } else {
        path.as_str()
    };
    // There are implementations of `.into_response()` for both `EmbeddedFile` and `Option<EmbeddedFile>`.
    // With `Option<EmbeddedFile>`, this responder will also handle sending a 404 response for `None`.
    // If you want to customize the `404` response, you can handle the `None` case yourself: see the
    // `custom-404.rs` test for an example.
    Embed::get(path).into_response().
}

#[actix_web::main] // or #[tokio::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| App::new().service(serve_assets))
        .bind(("127.0.0.1", 8080))?
        .run()
        .await
}

关于 rust-embed-for-web 分支的说明

此分支预先计算某些内容,例如用于响应的头部值。它还可以提前压缩数据。这可能会显著增加编译二进制文件的大小,但作为交换,可以显著提高性能。您可以选择禁用预压缩,这将最小化增加(有关详细信息,请参阅 rust-embed-for-web 的说明)。

为了这些限制,您将获得改进的性能。根据某些基准测试,使用此分支的速度可以提高 16% 到 35%。有关更详细的信息,请查看 基准测试报告

压缩

使用 rust-embed-for-web,如果为嵌入启用了压缩(您没有添加 #[gzip = false]#[br = false]),并且实际提供的文件可以从压缩中受益,此 crate 将为支持它们的客户端提供压缩响应。

使用 rust-embed,默认情况下不会提供压缩后的响应。但是,您可以设置 .use_compression(Compress::Always) 来启用它。如果这样做,文件将在运行时压缩并缓存。这将始终压缩文件,即使是像图像文件这样不太可能从压缩中受益的文件。

Embed::get(path).into_response().use_compression(Compress::Always)

对于 rust-embed-for-web,如果您已通过 #[gzip = false]#[br = false] 禁用了预压缩,您也可以使用 Compress::Always 来启用即时压缩。或者,您可以使用 Compress::IfWellKnown,这将仅压缩已知可压缩的文件,如html、css和javascript。您还可以使用 Compress::Never 完全禁用压缩。

自定义响应

Actix-web 内置了您可以使用的响应自定义功能。

#[route("/{path:.*}", method = "GET", method = "HEAD")]
async fn handler(
    path: web::Path<String>,
) -> CustomizeResponder<EmbedResponse<EmbeddedFile>> {
    EmbedRE::get(path)
        .into_response()
        .customize()
        .insert_header(("X-My-Header", "My Header Value"))
}

示例

示例文件夹 中提供了 rust-embedrust-embed-for-web 的示例。您可以通过使用 cargo run --example rust_embed --releasecargo run --example rust_embed_for_web --release 来运行这些示例,然后在您的浏览器中访问 localhost:8080

功能

默认情况下,此软件包同时启用了对 rust-embedrust-embed-for-web 的支持。您可以选择禁用您未使用的支持。

# If you are using `rust-embed`:
actix-web-rust-embed-responder = { version = "2.1.1", default-features = false, features = ["support-rust-embed"] }
# If you are using `rust-embed-for-web`:
actix-web-rust-embed-responder = { version = "2.1.1", default-features = false, features = ["support-rust-embed-for-web"] }

还有一个名为 always-embed 的功能标志,默认情况下是禁用的。这仅适用于测试,您可以忽略此功能。

actix-plus-static-files 相比

actix-plus-static-files 相比

  • 此软件包在具有 If-None-MatchIf-Unmodified-Since 标头的 304 Not Modified 响应的同时发送时,同时处理 actix-plus-static-files 仅支持 If-None-Match
  • 此软件包支持使用 rust-embed-for-web 进行预先压缩或在传输中使用 rust-embed 进行压缩。
  • 此软件包使用 base85 与 rust-embed-for-web 和 base64 与 rust-embed 一起用于 ETag,这比 actix-plus-static-files 使用的十六进制编码更节省空间。
  • 这个crate仅是用于处理EmbeddedFile类型的响应器,您可以将它添加到您的处理器中,而actix-plus-static-files则实现了一个可以直接添加到您应用程序中的服务。
  • actix-plus-for-web实现了If-Any-Match条件请求,而这个crate没有。这些通常不用于GETHEAD请求。

贡献者

Hengfei Yang
杨恒飞

💻
Matt Palmer
马特·帕尔默

💻

依赖项

~24–37MB
~797K SLoC