Statischer Server

Middleware, das statische Dateien oder eingebettete Dateien bereitstellt. Detaillierte API finden Sie in der Dokumentation.

Anwendungsfälle

Statische Dateiserver haben vielfältige Anwendungen in der Webentwicklung:

  • Bereitstellung statischer Ressourcen für Websites, wie CSS, JavaScript, Bilder usw.
  • Hosting von Single-Page-Anwendungen (SPAs)
  • Verteilung von Dokumenten, Mediendateien, herunterladbaren Inhalten usw.
  • Komplette Hosting-Lösung für einfache Websites

Hauptmerkmale

  • StaticDir bietet Unterstützung für das Bereitstellen statischer Dateien aus lokalen Verzeichnissen. Es kann eine Liste mehrerer Verzeichnisse als Parameter akzeptieren. Beispiel:
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;
}

Wenn eine Datei im ersten Verzeichnis nicht gefunden wird, wird sie im zweiten Verzeichnis gesucht.

StaticDir unterstützt die Bereitstellung vorab komprimierter Dateien, sofern verfügbar. Wenn beispielsweise Dateien wie index.html, index.html.gz, index.html.zst und index.html.br existieren, werden index.html.gz, index.html.zst und index.html.br als vorab komprimierte Versionen von index.html betrachtet. Die passende komprimierte Datei wird basierend auf den Anfrageinformationen bereitgestellt.

  • Bietet Unterstützung für rust-embed. Beispiel:

Vor- und Nachteile von rust-embed

Vorteile:

  • Kompiliert statische Dateien in die Binärdatei und vereinfacht die Bereitstellung.
  • Keine separate Verwaltung statischer Dateien in Produktionsumgebungen erforderlich.
  • Potenziell bessere Leistung (Speicherzugriff vs. Festplatten-I/O).
  • Erhöhte Sicherheit, da Dateien nicht versehentlich geändert werden können.

Nachteile:

  • Erhöht die Größe der Anwendungsbinärdatei.
  • Aktualisierungen statischer Inhalte erfordern Neukompilierung und erneute Bereitstellung der gesamten Anwendung.
  • Nicht geeignet für große statische Inhalte, die sich häufig ändern.
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;
}

Mit der Option default können Sie eine Standardseite zur Anzeige festlegen. Die Methoden with_fallback und fallback ermöglichen es, eine Fallback-Datei anzugeben, die bereitgestellt wird, wenn eine angeforderte Datei nicht gefunden wird. Dies ist nützlich für bestimmte Single-Page-Website-Anwendungen.