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 过程宏
每月933次下载
用于 memory-serve
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