Remix 旨在让您拥有自己的服务器,但如果您不想设置服务器,则可以使用 Remix 应用程序服务器。它是一个生产就绪的、但基本的 Node.js 服务器,使用 Express 构建。
根据设计,我们不提供自定义 Remix 应用程序服务器的选项,因为如果您需要自定义底层的 express
服务器,我们建议您完全管理服务器,而不是创建抽象来处理您可能需要的所有可能的自定义。如果您发现自己想要自定义它,您应该使用 @remix-run/express
适配器。
您可以在 packages/remix-serve/cli.ts 中看到底层的 express
服务器配置。默认情况下,它使用以下 Express 中间件(请参阅其文档以了解默认行为)
HOST
环境变量您可以通过 process.env.HOST
配置 Express 应用程序的主机名,该值将在启动服务器时传递给内部的 app.listen
方法。
HOST=127.0.0.1 npx remix-serve build/index.js
remix-serve <server-build-path>
# e.g.
remix-serve build/index.js
PORT
环境变量您可以使用环境变量更改服务器的端口。
PORT=4000 npx remix-serve build/index.js
根据 process.env.NODE_ENV
,服务器将在开发或生产模式下启动。
server-build-path
需要指向在 remix.config.js
中定义的 serverBuildPath
。
由于只有构建工件(build/
、public/build/
)需要部署到生产环境,因此不能保证生产环境中存在remix.config.js
。因此,您需要使用此选项告诉 Remix 您的服务器构建位置。
在开发过程中,remix-serve
会确保每次请求都清除require
缓存,从而运行最新代码。这会对您的代码产生一些影响,您需要意识到这些影响。
模块范围内的任何值都将“重置”。
// this will be reset for every request because the module cache was
// cleared and this will be required brand new
const cache = new Map();
export async function loader({
params,
}: LoaderFunctionArgs) {
if (cache.has(params.foo)) {
return json(cache.get(params.foo));
}
const record = await fakeDb.stuff.find(params.foo);
cache.set(params.foo, record);
return json(record);
}
如果您需要在开发中保留缓存的解决方法,您可以在服务器中设置一个单例。
任何模块副作用都将保留!这可能会导致问题,但最好还是避免。
import { json } from "@remix-run/node"; // or cloudflare/deno
// this starts running the moment the module is imported
setInterval(() => {
console.log(Date.now());
}, 1000);
export async function loader() {
// ...
}
如果您需要以具有这些类型模块副作用的方式编写代码,您应该设置自己的@remix-run/express 服务器,以及一个开发工具,例如 pm2-dev 或 nodemon,以在文件更改时重新启动服务器。
在生产环境中不会发生这种情况。服务器启动后便不再运行。