コンテンツにスキップ

@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 App Server 初始化您的应用程序,您会注意到导入并使用其中一个适配器的 server/index.js 文件。

如果您使用内置的 Remix App Server,则无需与此 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 })
);
}
});