xLog/server-dev.ts

69 lines
2.1 KiB
TypeScript

/**
* The dev server serve the Remix app and use ./app/middleware.ts as a middleware (Vercel)
* In production the middleware will be bundled to .vercel folder and Vercel will handle that
*/
import "dotenv/config"
import path from "path"
import express from "express"
import { createRequestHandler } from "@remix-run/vercel"
import { createRemixRequest, sendRemixResponse } from "@remix-run/vercel/server"
import { NEXT_HEADER, REWRITE_HEADER } from "~/middleware-utils"
const app = express()
const BUILD_DIR = path.resolve("build")
// Remix fingerprints its assets so we can cache forever.
app.use("/build", express.static("public/build"))
// Everything else (like favicon.ico) is cached for an hour. You may want to be
// more aggressive with this caching.
app.use(express.static("public"))
app.use(async (req, res, next) => {
const middleware = require("~/middleware").default
const request = createRemixRequest(req as any)
let response: Response = await middleware(request)
if (response.headers.has(NEXT_HEADER)) {
return next()
}
const rewriteTo = response.headers.get(REWRITE_HEADER)
if (rewriteTo) {
response = await fetch(rewriteTo)
response.headers.delete("content-encoding")
}
sendRemixResponse(res as any, response as any)
})
app.all("*", (req, res) => {
purgeRequireCache()
const handler = createRequestHandler({
build: require("@remix-run/dev/server-build"),
mode: process.env.NODE_ENV,
})
// @ts-expect-error
return handler(req, res)
})
const PORT = process.env.PORT || "3000"
app.listen(PORT)
console.log(`Open http://localhost:${PORT}`)
function purgeRequireCache() {
// purge require cache on requests for "server side HMR" this won't let
// you have in-memory objects between requests in development,
// alternatively you can set up nodemon/pm2-dev to restart the server on
// file changes, but then you'll have to reconnect to databases/etc on each
// change. We prefer the DX of this, so we've included it for you by default
for (let key in require.cache) {
if (key.startsWith(BUILD_DIR)) {
delete require.cache[key]
}
}
}