Serveur Statique

Middleware qui sert des fichiers statiques ou des fichiers intégrés. Pour l'API détaillée, veuillez consulter la documentation.

Cas d'utilisation

Les serveurs de fichiers statiques ont un large éventail d'applications dans le développement web :

  • Servir des ressources statiques pour les sites web, telles que CSS, JavaScript, images, etc.
  • Héberger des applications monopages (SPA)
  • Distribuer des documents, des fichiers multimédias, des contenus téléchargeables, etc.
  • Servir de solution d'hébergement complète pour des sites web simples

Fonctionnalités principales

  • StaticDir fournit un support pour servir des fichiers statiques à partir de répertoires locaux. Il peut accepter une liste de plusieurs répertoires comme paramètres. Par exemple :
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;
}

Si un fichier n'est pas trouvé dans le premier répertoire, il sera recherché dans le second répertoire.

StaticDir prend en charge le service de fichiers pré-compressés lorsqu'ils sont disponibles. Par exemple, si des fichiers comme index.html, index.html.gz, index.html.zst et index.html.br existent, alors index.html.gz, index.html.zst et index.html.br sont considérés comme des versions pré-compressées de index.html. Le fichier compressé approprié sera servi en fonction des informations de la requête.

  • Fournit un support pour rust-embed. Par exemple :

Avantages et inconvénients de rust-embed

Avantages :

  • Compile les fichiers statiques dans le binaire, simplifiant le déploiement.
  • Pas besoin de gérer séparément les fichiers statiques dans les environnements de production.
  • Performance potentiellement meilleure (accès mémoire vs I/O disque).
  • Sécurité renforcée, car les fichiers ne peuvent pas être modifiés accidentellement.

Inconvénients :

  • Augmente la taille du binaire de l'application.
  • Mettre à jour le contenu statique nécessite de recompiler et redéployer toute l'application.
  • Ne convient pas aux contenus statiques volumineux qui changent fréquemment.
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;
}

Vous pouvez définir une page par défaut à afficher en utilisant l'option default. Les méthodes with_fallback et fallback vous permettent de spécifier un fichier de secours à servir lorsqu'un fichier demandé n'est pas trouvé, ce qui est utile pour certaines applications de sites web monopages.