Servidor Estático

Middleware que fornece arquivos estáticos ou incorporados como serviço. Para a API específica, consulte a documentação.

Cenários de Aplicação

O serviço de arquivos estáticos tem ampla aplicação em aplicações web:

  • Fornecer recursos estáticos como CSS, JavaScript, imagens, etc.
  • Hospedar aplicativos de página única (SPA)
  • Distribuir documentos, arquivos de mídia, conteúdos para download
  • Servir como solução completa de hospedagem para sites simples

Principais Funcionalidades

  • StaticDir oferece suporte a pastas locais estáticas. Pode receber uma lista de múltiplas pastas como parâmetro. Exemplo:
main.rs
Cargo.toml
static-dir-list/src/main.rs
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:5800").bind().await;
    Server::new(acceptor).serve(router).await;
}

Se o arquivo não for encontrado na primeira pasta, a busca continua na segunda.

StaticDir prioriza o envio de arquivos compactados quando disponíveis. Por exemplo, se existirem index.html, index.html.gz, index.html.zst, index.html.br, os últimos três são considerados versões pré-comprimidas de index.html e serão enviados conforme o cabeçalho Accept-Encoding da requisição.

  • Suporte a rust-embed, por exemplo:

Vantagens e Desvantagens do rust-embed

Vantagens:

  • Compila arquivos estáticos no binário, simplificando a implantação
  • Elimina a necessidade de gerenciar arquivos estáticos separadamente em produção
  • Potencialmente melhor desempenho (acesso à memória vs I/O de disco)
  • Maior segurança, arquivos não podem ser modificados acidentalmente

Desvantagens:

  • Aumenta o tamanho do binário da aplicação
  • Atualizações de conteúdo estático exigem recompilação e nova implantação
  • Não adequado para conteúdos estáticos grandes com alterações frequentes
main.rs
Cargo.toml
static-embed-files/src/main.rs
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:5800").bind().await;
    Server::new(acceptor).serve(router).await;
}

É possível definir uma página padrão com default. with_fallback e fallback permitem configurar um arquivo substituto quando o original não for encontrado, útil para aplicativos de página única (SPA).