Archivos estáticos con nyx-serve
app_static(app, "/assets/", "./public/") sirve archivos desde un directorio. El runtime detecta automáticamente los tipos MIME para CSS, JS, imágenes y otros formatos comunes.
Código
// nyx-serve static files -- serving CSS, JS, images from a directory
import "std/http"
import "std/web"
fn home(req: Request) -> Response {
let html: String = "<!DOCTYPE html><html><head><link rel=\"stylesheet\" href=\"/assets/style.css\"></head><body><h1>Home</h1></body></html>"
return response_html(200, html)
}
fn main() -> int {
let app: App = app_new()
// Register dynamic routes first
app_get(app, "/", home)
// Static file serving via app_static (from nyx-serve product):
// app_static(app, "/assets/", "./public/")
//
// When a request path starts with "/assets/", the rest is looked up
// in ./public/. For example: GET /assets/style.css serves ./public/style.css
//
// The serve_app runtime auto-detects MIME types:
// .css -> text/css
// .js -> application/javascript
// .png -> image/png
// .svg -> image/svg+xml
print("static file serving pattern:")
print(" app_static(app, \"/assets/\", \"./public/\")")
print(" GET /assets/style.css -> ./public/style.css")
print(" GET /assets/app.js -> ./public/app.js")
return 0
}
Salida
static file serving pattern: app_static(app, "/assets/", "./public/") GET /assets/style.css -> ./public/style.css GET /assets/app.js -> ./public/app.js
Explicación
app_static(app, url_prefix, fs_root) monta un directorio del sistema de archivos bajo un prefijo de URL. Al momento de la petición, nyx-serve quita url_prefix de la ruta, une el resto a fs_root, y transmite el archivo de vuelta con el Content-Type apropiado. Los intentos de path traversal (.., rutas absolutas, escapes por symlink) se rechazan antes de cualquier acceso al sistema de archivos.
La detección de MIME se basa en la extensión: .css se convierte en text/css, .js en application/javascript, .png/.jpg/.svg/.webp mapean a tipos de imagen, .html a text/html; charset=utf-8. Las extensiones desconocidas caen a application/octet-stream. Es necesario registrar las rutas dinámicas antes de llamar a app_static para que los handlers explícitos tengan prioridad sobre las búsquedas de directorio.
Para un sitio en producción, se puede apilar app_static detrás de nyx-proxy para agregar terminación TLS, gzip y una caché HTTP — el proxy maneja el camino caliente para que el backend solo regenere en caso de fallo de caché.