サーバーアダプター

公式アダプター

イディオム的な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();
 
// すべての動詞(GET、POSTなど)を処理する必要があります
app.all(
  "*",
  createRequestHandler({
    // `remix build`と`remix dev`はビルドディレクトリに出力ファイルを生成するため、
    // そのビルドをリクエストハンドラーに渡す必要があります
    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 })
    );
  }
});