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:
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
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).