静态服务器

将静态文件或者内嵌的文件作为服务提供的中间件. 具体 API 请查看文档.

应用场景

静态文件服务在web应用中有广泛的应用场景:

  • 提供网站的静态资源如CSS、JavaScript、图片等文件
  • 托管单页应用(SPA)
  • 分发文档、媒体文件、下载内容等
  • 作为简单网站的完整托管方案

主要功能

  • StaticDir 提供了对静态本地文件夹的支持. 可以将多个文件夹的列表作为参数. 比如:
main.rs
Cargo.toml
use salvo::prelude::*;
use salvo::serve_static::StaticDir;

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt().init();

    let router = Router::with_path("{*path}").get(
        StaticDir::new([
            "static-dir-list/static/boy",
            "static-dir-list/static/girl",
            "static/boy",
            "static/girl",
        ])
        .include_dot_files(false)
        .defaults("index.html")
        .auto_list(true),
    );

    let acceptor = TcpListener::new("0.0.0.0:8698").bind().await;
    Server::new(acceptor).serve(router).await;
}

如果在第一个文件夹中找不到对应的文件, 则会到第二个文件夹中找.

StaticDir 支持在存在压缩文件的情况下,优先发送压缩文件. 比如存在 index.html, index.html.gz, index.html.zst, index.html.br 这几个文件,则 index.html.gz, index.html.zst, index.html.br 被认为是 index.html 的预压缩版本,会根据请求信息,发送对应的压缩文件.

  • 提供了对 rust-embed 的支持, 比如:

rust-embed的优缺点

优点:

  • 将静态文件编译进二进制文件中,简化部署流程
  • 无需在生产环境中单独管理静态文件
  • 可能获得更好的性能(内存访问vs磁盘I/O)
  • 更安全,文件不会被意外修改

缺点:

  • 增加应用二进制文件的大小
  • 更新静态内容需要重新编译和部署整个应用
  • 不适合频繁变更的大型静态内容
main.rs
Cargo.toml
use rust_embed::RustEmbed;
use salvo::prelude::*;
use salvo::serve_static::static_embed;

#[derive(RustEmbed)]
#[folder = "static"]
struct Assets;

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt().init();

    let router = Router::with_path("{*path}").get(static_embed::<Assets>().fallback("index.html"));

    let acceptor = TcpListener::new("0.0.0.0:8698").bind().await;
    Server::new(acceptor).serve(router).await;
}

可以通过 default 设置默认显示页面. with_fallbackfallback 可以设置在文件找不到时, 用这里设置的文件代替, 这个对应某些单页网站应用来还是有用的.