跳转到内容

@remix-run/serve

Remix 应用服务器

Remix 旨在让您拥有自己的服务器,但如果您不想设置服务器,则可以使用 Remix 应用服务器。它是使用 Express 构建的生产就绪但基本的 Node.js 服务器。

根据设计,我们不提供自定义 Remix 应用服务器的选项,因为如果您需要自定义底层express服务器,我们宁愿您完全管理服务器,而不是创建一个抽象来处理您可能需要的所有可能的自定义。如果您发现想要自定义它,则应该使用@remix-run/express适配器。

您可以在 packages/remix-serve/cli.ts 中看到底层的 express 服务器配置。默认情况下,它使用以下 Express 中间件(请参阅其文档了解默认行为):

HOST 环境变量

您可以通过 process.env.HOST 为您的 Express 应用配置主机名,并且该值将在启动服务器时传递给内部 app.listen 方法。

Terminal window
HOST=127.0.0.1 npx remix-serve build/index.js
Terminal window
remix-serve <server-build-path>
# e.g.
remix-serve build/index.js

PORT 环境变量

您可以使用环境变量更改服务器的端口。

Terminal window
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缓存来确保运行最新代码。这会对您的代码产生一些影响,您可能需要注意:

  • 模块范围内的任何值都将被重置
// 这将针对每个请求重置,因为模块缓存已被
// 清除,因此需要全新的
const cache = new Map();
导出异步函数加载器({
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);
}

如果您需要一种在开发中保留缓存的解决方法,您可以在服务器中设置一个singleton

  • 任何模块副作用都将保留!这可能会造成问题,但无论如何都应该避免。
`@remix-run/node`导入 { json };// 或 cloudflare/deno
// 这在模块导入时开始运行
setInterval(() => {
console.log(Date.now());
}, 1000);
导出异步函数加载器(){
// ...
}

如果您需要以具有这些类型的模块副作用的方式编写代码,则应该设置自己的 @remix-run/express 服务器和开发中的工具(如 pm2-dev 或 nodemon),以便在文件更改时重新启动服务器。

在生产中不会发生这种情况。服务器启动后一切就结束了。