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 在 压缩
每月下载量 587次
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