@remix-run/serve

Remix 应用程序服务器

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,以在文件更改时重新启动服务器。

在生产环境中不会发生这种情况。服务器启动后便不再运行。

文档和示例遵循 MIT