import { env } from "node:process"; import { createRequestHandler } from "@remix-run/express"; import compression from "compression"; import express from "express"; import morgan from "morgan"; const viteDevServer = env.NODE_ENV === "production" ? undefined : await import("vite").then((vite) => vite.createServer({ server: { middlewareMode: true }, }), ); const remixHandler = createRequestHandler({ build: viteDevServer ? () => viteDevServer.ssrLoadModule("virtual:remix/server-build") : await import("./build/server/index.js"), }); const app = express(); app.use(compression()); // http://expressjs.com/en/advanced/best-practice-security.html#at-a-minimum-disable-x-powered-by-header app.disable("x-powered-by"); // handle asset requests if (viteDevServer) { app.use(viteDevServer.middlewares); } else { // Vite fingerprints its assets so we can cache forever. app.use("/assets", express.static("build/client/assets", { immutable: true, maxAge: "1y" })); } // Only cache locales for a minute, as they can change without the filename changing // TODO: figure out how to change the filenames on update? app.use(express.static("build/client/locales", { maxAge: "1m" })); // Everything else (like favicon.ico) is cached for an hour. You may want to be // more aggressive with this caching. app.use(express.static("build/client", { maxAge: "1d" })); app.use(morgan("tiny")); // handle SSR requests app.all("*", remixHandler); const port = env.PORT || 3000; app.listen(port, () => console.log(`Express server listening at http://localhost:${port}`));