Serveur statique
Middleware permettant de servir des fichiers statiques ou embarqués. Pour l'API détaillée, veuillez consulter la documentation.
Cas d'utilisation
Le service de fichiers statiques a de nombreuses applications dans les applications web :
- Fournir des ressources statiques comme des fichiers CSS, JavaScript, images, etc.
- Héberger des applications monopage (SPA)
- Distribuer des documents, fichiers multimédias, contenus téléchargeables
- Solution complète d'hébergement pour des sites simples
Fonctionnalités principales
StaticDir
prend en charge les dossiers locaux statiques. Plusieurs dossiers peuvent être spécifiés en paramètre. Par exemple :
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;
}
Si le fichier n'est pas trouvé dans le premier dossier, la recherche se poursuit dans le second.
StaticDir
prend en charge l'envoi prioritaire des fichiers compressés lorsqu'ils existent. Par exemple, s'il existe index.html
, index.html.gz
, index.html.zst
, index.html.br
, alors index.html.gz
, index.html.zst
, index.html.br
sont considérés comme des versions précompressées de index.html
et seront envoyés selon les informations de la requête.
- Prise en charge de
rust-embed
, par exemple :
Avantages et inconvénients de rust-embed
Avantages :
- Compilation des fichiers statiques dans le binaire, simplifiant le déploiement
- Pas besoin de gérer séparément les fichiers statiques en production
- Meilleures performances potentielles (accès mémoire vs I/O disque)
- Plus sécurisé, les fichiers ne peuvent pas être modifiés accidentellement
Inconvénients :
- Augmente la taille du binaire
- Mise à jour du contenu statique nécessite une recompilation et redéploiement
- Non adapté pour du contenu statique volumineux et fréquemment modifié
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;
}
Il est possible de définir une page par défaut avec default
. with_fallback
et fallback
permettent de spécifier un fichier de repli lorsqu'un fichier n'est pas trouvé, ce qui est utile pour certaines applications monopages.