55 lines
1.4 KiB
JavaScript
55 lines
1.4 KiB
JavaScript
|
import { createRequestHandler } from "@remix-run/express";
|
||
|
import { installGlobals } from "@remix-run/node";
|
||
|
import compression from "compression";
|
||
|
import express from "express";
|
||
|
import morgan from "morgan";
|
||
|
|
||
|
installGlobals();
|
||
|
|
||
|
const viteDevServer =
|
||
|
process.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" })
|
||
|
);
|
||
|
}
|
||
|
|
||
|
// 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: "1h" }));
|
||
|
|
||
|
app.use(morgan("tiny"));
|
||
|
|
||
|
// handle SSR requests
|
||
|
app.all("*", remixHandler);
|
||
|
|
||
|
const port = process.env.PORT || 3000;
|
||
|
app.listen(port, () =>
|
||
|
console.log(`Express server listening at http://localhost:${port}`)
|
||
|
);
|