Server Statico

Middleware che serve file statici o file incorporati. Per l'API dettagliata, consultare la documentazione.

Casi d'Uso

I server di file statici trovano ampia applicazione nello sviluppo web:

  • Servire risorse statiche per siti web, come CSS, JavaScript, immagini, ecc.
  • Ospitare Applicazioni a Pagina Singola (SPA)
  • Distribuire documenti, file multimediali, contenuti scaricabili, ecc.
  • Fungere da soluzione di hosting completa per siti web semplici

Caratteristiche Principali

  • StaticDir fornisce supporto per servire file statici da directory locali. Può accettare una lista di più directory come parametri. Ad esempio:
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 un file non viene trovato nella prima directory, verrà cercato nella seconda.

StaticDir supporta la distribuzione di file precompressi quando disponibili. Ad esempio, se esistono file come index.html, index.html.gz, index.html.zst e index.html.br, allora index.html.gz, index.html.zst e index.html.br sono considerati versioni precompresse di index.html. Il file compresso appropriato verrà servito in base alle informazioni della richiesta.

  • Fornisce supporto per rust-embed. Ad esempio:

Vantaggi e Svantaggi di rust-embed

Vantaggi:

  • Compila i file statici nel binario, semplificando il deployment.
  • Non è necessario gestire separatamente i file statici negli ambienti di produzione.
  • Potenzialmente migliori prestazioni (accesso in memoria vs. I/O del disco).
  • Maggiore sicurezza, poiché i file non possono essere modificati accidentalmente.

Svantaggi:

  • Aumenta la dimensione del binario dell'applicazione.
  • L'aggiornamento dei contenuti statici richiede la ricompilazione e il ridistribuzione dell'intera applicazione.
  • Non adatto per contenuti statici di grandi dimensioni che cambiano 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;
}

È possibile impostare una pagina predefinita da visualizzare utilizzando l'opzione default. I metodi with_fallback e fallback consentono di specificare un file di riserva da servire quando un file richiesto non viene trovato, utile per alcune applicazioni web a pagina singola.