Servidor Estático

Middleware que serve arquivos estáticos ou arquivos embutidos. Para a API detalhada, por favor consulte a documentação.

Casos de Uso

Servidores de arquivos estáticos têm uma ampla gama de aplicações no desenvolvimento web:

  • Servir recursos estáticos para sites, como CSS, JavaScript, imagens, etc.
  • Hospedar Aplicações de Página Única (SPAs)
  • Distribuir documentos, arquivos de mídia, conteúdo para download, etc.
  • Servir como uma solução completa de hospedagem para sites simples

Principais Funcionalidades

  • StaticDir fornece suporte para servir arquivos estáticos a partir de diretórios locais. Pode aceitar uma lista de múltiplos diretórios como parâmetros. Por exemplo:
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;
}

Se um arquivo não for encontrado no primeiro diretório, será procurado no segundo diretório.

StaticDir suporta servir arquivos pré-comprimidos quando disponíveis. Por exemplo, se existirem arquivos como index.html, index.html.gz, index.html.zst e index.html.br, então index.html.gz, index.html.zst e index.html.br são considerados versões pré-comprimidas de index.html. O arquivo comprimido apropriado será servido com base nas informações da requisição.

  • Fornece suporte para rust-embed. Por exemplo:

Prós e Contras do rust-embed

Prós:

  • Compila arquivos estáticos no binário, simplificando a implantação.
  • Não é necessário gerenciar arquivos estáticos separadamente em ambientes de produção.
  • Potencialmente melhor desempenho (acesso à memória vs. I/O de disco).
  • Segurança aprimorada, pois os arquivos não podem ser modificados acidentalmente.

Contras:

  • Aumenta o tamanho do binário da aplicação.
  • Atualizar conteúdo estático requer recompilar e reimplantar toda a aplicação.
  • Não é adequado para conteúdo estático grande que muda frequentemente.
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;
}

Você pode definir uma página padrão para exibir usando a opção default. Os métodos with_fallback e fallback permitem especificar um arquivo de fallback para servir quando um arquivo solicitado não for encontrado, o que é útil para certas aplicações de sites de página única.