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日

#1239 in 过程宏

Download history 23/week @ 2024-04-14 25/week @ 2024-04-21 190/week @ 2024-04-28 34/week @ 2024-05-05 57/week @ 2024-05-12 63/week @ 2024-05-19 25/week @ 2024-05-26 117/week @ 2024-06-02 61/week @ 2024-06-09 90/week @ 2024-06-16 63/week @ 2024-06-23 244/week @ 2024-06-30 111/week @ 2024-07-07 57/week @ 2024-07-14 390/week @ 2024-07-21 296/week @ 2024-07-28

每月933次下载
用于 memory-serve

Apache-2.0 OR MIT

16KB
213

内存服务

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

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

在开发期间(调试构建),文件以动态方式提供服务,它们在请求时读取和压缩。

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

所有文件都带有etag头和If-None-Match请求相应处理。

基于客户端的能力和偏好,文本文件(如HTML或javascript)以纯文本或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 crate 进行记录。要打印或记录它们,请使用 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::自定义 自定义值 用户定义

依赖项

~9–17MB
~360K SLoC