1

通常 React 构建只是作为来自 nginx 等网络服务器的静态文件提供,但我想使用来自 React 构建的 Rust Rocket 提供前端静态文件,我正在努力寻找一种好的方法,这里是我的路线已经设置

#[get("/")]
 fn index() -> io::Result<NamedFile> {
NamedFile::open("build/index.html")
}

#[get("/<file..>", rank = 2)]
fn build_dir(file: PathBuf) -> Option<NamedFile> {
    NamedFile::open(Path::new("build/").join(file)).ok()
}

#[get("/static/<file..>")]
fn static_dir(file: PathBuf) -> Option<NamedFile> {
    NamedFile::open(Path::new("build/static/").join(file)).ok()
}

fn rocket() -> rocket::Rocket {
    rocket::ignite()
        .mount("/", routes![index, build_dir])
        .mount("/static", routes![static_dir])
}

这可行,但它不提供像 favicons 或 manifest.json 文件这样的东西,我宁愿不为每个文件添加特定的路由,有没有人以更好的方式解决了这个问题?

请在此处查看项目代码

4

1 回答 1

2

/<path..>模式是递归的,您不需要包含子文件夹。只需为您的整个构建服务/,它就会按预期工作。

唯一需要担心的是从不明确的页面路径(如/.

#![feature(proc_macro_hygiene, decl_macro)]

use std::{io, path::{Path, PathBuf}};

use rocket::{get, routes, response::{NamedFile, Redirect}};

#[get("/")]
fn index() -> Redirect {
    Redirect::permanent("/index.html")
}

#[get("/<file..>")]
fn build_dir(file: PathBuf) -> io::Result<NamedFile> {
    NamedFile::open(Path::new("build/").join(file))
}

fn rocket() -> rocket::Rocket {
    rocket::ignite()
        .mount("/", routes![index, build_dir])
}

fn main() {
    rocket().launch();
}
于 2020-09-16T15:38:02.080 回答