#文件服务 #brotli #静态文件 #axum #Web应用 #缓存

memory-serve

为axum Web应用提供快速的静态文件服务

12个版本 (5个重大更新)

0.6.0 2024年7月22日
0.4.5 2024年4月30日
0.4.4 2024年3月7日
0.4.0 2023年12月4日
0.3.0 2023年10月27日

#63压缩

Download history 64/week @ 2024-05-03 29/week @ 2024-05-10 75/week @ 2024-05-17 27/week @ 2024-05-24 60/week @ 2024-05-31 111/week @ 2024-06-07 86/week @ 2024-06-14 78/week @ 2024-06-21 143/week @ 2024-06-28 201/week @ 2024-07-05 78/week @ 2024-07-12 366/week @ 2024-07-19 298/week @ 2024-07-26 90/week @ 2024-08-02 76/week @ 2024-08-09 69/week @ 2024-08-16

每月下载量 587次

Apache-2.0 OR MIT

40KB
761

Memory serve

memory-serve 通过在内存中保留所有资产,为axum Web应用提供快速的静态文件服务。

它会在编译时将静态Web资产(如HTML、样式表、图片和脚本)加载到Rust二进制文件中,并以axum路由器的方式公开它们。它自动添加缓存头并处理文件压缩。

在开发过程中(调试构建),文件是动态服务的,它们在请求时被读取和压缩。

基于文本的文件,如HTML或javascript,会在编译时使用brotli进行压缩,并在启动时解压缩,以最小化二进制文件大小。

所有文件都通过一个etag头和If-None-Match请求相应地处理。

基于客户端的能力和偏好,基于文本的文件以纯文本或gzip或brotli压缩的形式提供。

路由可以灵活配置,例如以适应SPA。

兼容性

memory-serve旨在与axum一起使用

用法

将包含您静态资产的目录的相对路径提供给load_assets!宏。此宏创建一个旨在由MemoryServe::new消费的数据结构。对生成的实例调用[MemoryServe::into_router()]会产生一个axum Router,它可以被合并到另一个Router中,或者通过调用Router::into_make_service()直接在服务器中使用。

示例

use axum::{response::Html, routing::get, Router};
use memory_serve::{load_assets, MemoryServe};
use std::net::SocketAddr;

#[tokio::main]
async fn main() {
    let memory_router = MemoryServe::new(load_assets!("static"))
        .index_file(Some("/index.html"))
        .into_router();

    // possible other routes can be added at this point, like API routes
    let app = Router::new()
        .merge(memory_router);

    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
    let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

配置选项

可以通过调用以下配置方法配置MemoryServe结构实例

方法 默认值 描述
MemoryServe::index_file Some("/index.html") 在路由 "/" 上服务哪个文件
MemoryServe::index_on_subdirectories false 是否在子目录中服务相应的索引文件
MemoryServe::fallback None 如果没有匹配到路由,则服务哪个文件
MemoryServe::fallback_status StatusCode::NOT_FOUND 未匹配路由的 HTTP 状态码
MemoryServe::enable_gzip true 允许服务 gzip 编码的文件
MemoryServe::enable_brotli true 允许服务 brotli 编码的文件
MemoryServe::html_cache_control CacheControl::Short 服务 HTML 文件时的缓存控制头
MemoryServe::cache_control CacheControl::Medium 服务其他文件时的缓存控制头
MemoryServe::add_alias [] 创建路由/文件别名
MemoryServe::enable_clean_url false 启用干净 URL

有关缓存控制选项,请参阅 Cache control

日志记录

在编译过程中,资产包含或压缩中发生的问题被记录到 stdout,例如

WARN skipping file "static/empty.txt": file empty

运行生成的可执行文件时,所有注册的路由和资产大小都会使用 tracing 包进行记录。要打印或记录它们,请使用 tracing-subscriber。示例输出

 INFO memory_serve: serving /assets/icon.jpg 1366 bytes
 INFO memory_serve: serving /assets/index.css 1552 bytes
 INFO memory_serve: serving /assets/index.css (brotli compressed) 509 bytes
 INFO memory_serve: serving /assets/index.css (gzip compressed) 624 bytes
 INFO memory_serve: serving /assets/index.js 20 bytes
 INFO memory_serve: serving /assets/stars.svg 2255 bytes
 INFO memory_serve: serving /assets/stars.svg (brotli compressed) 907 bytes
 INFO memory_serve: serving /assets/stars.svg (gzip compressed) 1048 bytes
 INFO memory_serve: serving /index.html 437 bytes
 INFO memory_serve: serving /index.html (brotli compressed) 178 bytes
 INFO memory_serve: serving /index.html (gzip compressed) 274 bytes
 INFO memory_serve: serving /index.html as index on /

缓存控制

缓存控制设置有 5 个不同的值可供选择

选项 描述
CacheControl::Long 客户端可以保留具有缓存破坏的资产一年 max-age=31536000,immutable
CacheControl::Medium 未进行缓存破坏的资产在一天后重新验证,可以保留一周 max-age=604800,stale-while-revalidate=86400
CacheControl::Short 缓存最多保留 5 分钟,仅在客户端(不在代理中) max-age:300,private
CacheControl::NoCache 如果新鲜度非常重要,则不缓存 no-cache
CacheControl::Custom 自定义值 用户定义

依赖项

~11–20MB
~417K SLoC