サーバーアダプター
公式アダプター
Remix アプリは、一般的にどこにでもデプロイできます。これは、Remix がサーバーの request/response を 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 ファイルがあることに気づくでしょう。
各アダプターは同じ API を持っています。将来的には、デプロイ先のプラットフォームに固有のヘルパーを用意するかもしれません。
コミュニティアダプター
@fastly/remix-server-adapter— Fastly Compute 用。@mcansh/remix-fastify— Fastify 用。@mcansh/remix-raw-http— 古き良きベアボーンの Node.js サーバー用。@netlify/remix-adapter— Netlify 用。@netlify/remix-edge-adapter— Netlify Edge 用。@vercel/remix— Vercel 用。remix-google-cloud-functions— Google Cloud および Firebase 関数用。partymix— PartyKit 用。@scandinavianairlines/remix-azure-functions— Azure Functions および Azure Static Web Apps 用。
アダプターの作成
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();
// すべての動詞 (GET、POST など) を処理する必要があります
app.all(
"*",
createRequestHandler({
// `remix build` および `remix dev` はファイルを build ディレクトリに出力します。
// その build をリクエストハンドラーに渡す必要があります
build: require("./build"),
// ローダーとアクションで `context` として利用できるように、ここで任意のものを返します。
// これは、Remix とサーバー間のギャップを埋めることができる場所です
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 })
);
}
});