Servidor Estático

Middleware que sirve archivos estáticos o archivos embebidos. Para la API detallada, por favor consulta la documentación.

Casos de Uso

Los servidores de archivos estáticos tienen una amplia gama de aplicaciones en el desarrollo web:

  • Servir recursos estáticos para sitios web, como CSS, JavaScript, imágenes, etc.
  • Hospedar Aplicaciones de Página Única (SPA)
  • Distribuir documentos, archivos multimedia, contenido descargable, etc.
  • Servir como solución de hospedaje completa para sitios web simples

Características Principales

  • StaticDir proporciona soporte para servir archivos estáticos desde directorios locales. Puede aceptar una lista de múltiples directorios como parámetros. Por ejemplo:
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 archivo no se encuentra en el primer directorio, se buscará en el segundo directorio.

StaticDir admite servir archivos precomprimidos cuando están disponibles. Por ejemplo, si existen archivos como index.html, index.html.gz, index.html.zst e index.html.br, entonces index.html.gz, index.html.zst e index.html.br se consideran versiones precomprimidas de index.html. El archivo comprimido apropiado se servirá según la información de la solicitud.

  • Proporciona soporte para rust-embed. Por ejemplo:

Ventajas y Desventajas de rust-embed

Ventajas:

  • Compila archivos estáticos en el binario, simplificando el despliegue.
  • No es necesario gestionar archivos estáticos por separado en entornos de producción.
  • Potencialmente mejor rendimiento (acceso a memoria vs. I/O de disco).
  • Seguridad mejorada, ya que los archivos no pueden modificarse accidentalmente.

Desventajas:

  • Aumenta el tamaño del binario de la aplicación.
  • Actualizar contenido estático requiere recompilar y redesplegar toda la aplicación.
  • No es adecuado para contenido estático grande que cambia con frecuencia.
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;
}

Puedes establecer una página predeterminada para mostrar usando la opción default. Los métodos with_fallback y fallback te permiten especificar un archivo de respaldo para servir cuando no se encuentra un archivo solicitado, lo cual es útil para ciertas aplicaciones de sitios web de página única.