@remix-run/{adapter}
本页

服务器适配器

官方适配器

惯用的 Remix 应用程序通常可以部署到任何地方,因为 Remix 会将服务器的请求/响应适配到Web Fetch API。它是通过适配器实现的。我们维护了一些适配器

  • @remix-run/architect
  • @remix-run/cloudflare-pages
  • @remix-run/cloudflare-workers
  • @remix-run/express

这些适配器被导入到您的服务器的入口点,而不是在您的 Remix 应用程序本身中使用。

如果您使用 `npx create-remix@latest` 初始化您的应用程序,并且使用了除内置 Remix 应用程序服务器之外的其他服务器,您会注意到一个 `server/index.js` 文件,该文件导入并使用其中一个适配器。

如果您使用的是内置 Remix 应用程序服务器,则无需与该 API 交互。

每个适配器都具有相同的 API。将来,我们可能会为您的部署平台提供特定于平台的帮助程序。

社区适配器

创建适配器

createRequestHandler

为您的服务器创建一个请求处理程序来服务应用程序。这是 Remix 应用程序的最终入口点。

const {
  createRequestHandler,
} = require("@remix-run/{adapter}");
createRequestHandler({ build, getLoadContext });

这是一个使用 Express 的完整示例

const {
  createRequestHandler,
} = require("@remix-run/express");
const express = require("express");

const app = express();

// needs to handle all verbs (GET, POST, etc.)
app.all(
  "*",
  createRequestHandler({
    // `remix build` and `remix dev` output files to a build directory, you need
    // to pass that build to the request handler
    build: require("./build"),

    // return anything you want here to be available as `context` in your
    // loaders and actions. This is where you can bridge the gap between Remix
    // and your server
    getLoadContext(req, res) {
      return {};
    },
  })
);

这是一个使用 Architect (AWS) 的示例

const {
  createRequestHandler,
} = require("@remix-run/architect");
exports.handler = createRequestHandler({
  build: require("./build"),
});

这是一个使用简化版 Cloudflare Workers API 的示例

import { createEventHandler } from "@remix-run/cloudflare-workers";

import * as build from "../build";

addEventListener("fetch", createEventHandler({ build }));

这是一个使用低级 Cloudflare Workers API 的示例

import {
  createRequestHandler,
  handleAsset,
} from "@remix-run/cloudflare-workers";

import * as build from "../build";

const handleRequest = createRequestHandler({ build });

const handleEvent = async (event: FetchEvent) => {
  let response = await handleAsset(event, build);

  if (!response) {
    response = await handleRequest(event);
  }

  return response;
};

addEventListener("fetch", (event) => {
  try {
    event.respondWith(handleEvent(event));
  } catch (e: any) {
    if (process.env.NODE_ENV === "development") {
      event.respondWith(
        new Response(e.message || e.toString(), {
          status: 500,
        })
      );
    }

    event.respondWith(
      new Response("Internal Error", { status: 500 })
    );
  }
});
文档和示例许可证 MIT