# 設定

ランタイムの動作を設定するには、プロジェクトのルートに `react-server.config.*` または `+*.config.*` ファイルを作成する必要があります。このファイルはサーバーとビルドプロセスを設定するために使用します。ファイルタイプは `.js`、`.mjs`、`.ts`、`.mts` または `.json` です。

ランタイムの設定を拡張するには、`+*.config.*` ファイルを使用します。`+*.config.*` ファイルは `react-server.config.*` ファイルとマージされます。

`+*.config.*` ファイルはランタイムの設定を拡張したい場合に便利です。`+*.config.*`ファイルはいくつでも使うことができます。すべての設定ファイルは読み込まれた順にマージされます。

## 型付き設定

**JavaScriptおよびTypeScript**の設定ファイルでは、`defineConfig`で設定をラップすることで、すべてのオプションに対する自動補完、型チェック、インラインの説明と例を含む完全なIntelliSenseを利用できます：

```mjs filename="react-server.config.mjs"
import { defineConfig } from "@lazarv/react-server/config";

export default defineConfig({
  port: 3000,
  adapter: "vercel",
});
```

**JSON**設定ファイルでは、`$schema`プロパティを追加することで、エディタ上で直接バリデーションと自動補完を有効にできます：

```json filename="react-server.config.json"
{
  "$schema": "https://react-server.dev/schema.json",
  "port": 3000,
  "adapter": "vercel"
}
```

JSONスキーマはオフライン利用のためにパッケージ自体からも利用できます：

```json filename="react-server.config.json"
{
  "$schema": "node_modules/@lazarv/react-server/config/schema.json"
}
```

プロダクションモードでランタイムを実行するときに使用する設定のみを追加したい場合は、`.production.config.*` 拡張子を使用します。これらの設定ファイルはプロダクションモードでのみ読み込まれます。

同じように、`.development.config.*`という拡張子で設定ファイルを作ると、開発モード用に別の設定を使うことができます。

ビルドプロセスに設定を追加するには、`.build.config.*` ファイルを作成し、これらの設定ファイルはプロダクションビルド時にのみ使用されます。

拡張子が `.runtime.config.*` または `.server.config.*` の設定ファイルは、ビルドプロセスでは使用されません。

デフォルトとしてエクスポートする必要がある設定オブジェクトは、Vite configオブジェクトの拡張です。オプションの完全なリストは[こちら](http://ja.vite.dev/config/)にあります。

## Viteの設定

Viteの設定を完全に制御するために、`vite`オプションを使用してViteサーバとビルドプロセスを設定することができます。`vite`オプションはVite configオブジェクトを拡張したオブジェクト、または新しいVite configオブジェクトを返す関数です。関数として、Viteのデフォルト設定を発見したり変更したりすることができます。

また、`vite.config.*` ファイルを使用して、Vite プロジェクトで行うような Vite の設定を行うこともできます。`vite.config.*` ファイルは `react-server.config.*` ファイルとマージされます。

ベストプラクティスは、`vite.config.*`ファイルを使用してViteプロジェクトで行うようにViteを設定し、`react-server.config.*`ファイルを使用してランタイム固有のオプションを設定することです。

## 追加の設定

以下のオプションは `@lazarv/react-server` ランタイム固有のものです。

#### ランタイム

ランタイム・コンテクストに新しいエントリーを追加します。ランタイム・コンテクストはシングルトン・ストアであり、アプリケーションでstateを共有することが出来ます。

```json
{
  "runtime": {
    "myEntry": "myValue"
  }
}
```

`runtime` オプションはランタイム・コンテクストオブジェクトを返す関数を指定することも出来ます。これはランタイム・コンテクストを変更するときに便利です。

```mjs
export default {
  runtime: (runtime) => {
    return {
      ...runtime,
      myEntry: "myValue",
    };
  },
};
```

#### クッキー

クッキーの設定を提供します。利用可能なオプションは[こちら](https://www.npmjs.com/package/cookie#options-1)を参照してください。

```mjs
export default {
  cookies: {
    path: "/",
    maxAge: 60 * 60 * 24 * 30,
    secure: true,
    httpOnly: true,
    sameSite: "lax",
  },
};
```

#### ハンドラ

ミドルウェアスタックに対して `pre` ハンドラおよび `post` ハンドラを追加できます。`pre` および `post` の各オプションには、非同期ハンドラ関数を配列として定義できます。

```mjs
export default {
  handlers: {
    pre: [async () { ... }],
    post: [async () { ... }]
  }
}
```

`handlers`オプションには、ハンドラの配列を返す関数を指定することも出来ます。これは、使用するミドルウェアを変更したい場合に便利です。

```mjs
export default {
  handlers: (handlers) => {
    return [...handlers, async () { ... }];
  }
}
```

`handlers`オプションは配列を指定することも出来ます。その配列は`post`ハンドラとすることも出来ます。

#### 公開ディレクトリ

公開ディレクトリは静的アセットを提供するディレクトリです。デフォルトのディレクトリは`public`です。

#### モジュールのプリロード

クライアントコンポーネントのモジュールの自動プリロードを無効にするには、 `modulePreload` オプションを使用します。`modulePreload` オプションにはBoolean値またはBoolean値を返す関数を指定することが出来ます。関数には非同期関数を指定することも出来ます。`modulePreload` オプションの値が `false` の場合、クライアントコンポーネントのモジュールはプリロードされません。

```json
{
  "modulePreload": false
}
```

クライアント・コンポーネントのモジュールのプリロードを無効にする関数を使用する場合

```mjs
export default {
  modulePreload: () => false,
};
```

アプリケーションコンテクスト全体が関数の中で利用可能なので、クライアントコンポーネントをプリロードするかどうかを決定するために、ランタイムによって提供されるすべてのヘルパーやフックを使用することが出来ます。

```mjs
import { usePathname } from "@lazarv/react-server";

export default {
  modulePreload: () => {
    const pathname = usePathname();
    return pathname !== "/";
  },
};
```

#### 環境変数による初期設定

`REACT_SERVER_INITIAL_CONFIG` 環境変数を使用して、ランタイムで初期設定を提供できます。これはプリビルドされた設定ファイルの値の前にマージされるJSON文字列です。

これは、設定をビルドに組み込むのではなくランタイムで提供する必要があるエッジランタイムへのデプロイ時や、設定ファイルを変更せずに設定をオーバーライドする必要がある場合に便利です。

```sh
REACT_SERVER_INITIAL_CONFIG='{"scrollRestoration":true}' pnpm react-server start
```

環境変数はJSONとして解析され、設定ファイルよりも低い優先度でマージされます。設定ファイルの値が常に優先されます。

#### 設定のバリデーション

デフォルトでは、`@lazarv/react-server`は起動時（開発）およびビルド前（プロダクション）に設定ファイルをバリデーションします。設定に無効なオプションや禁止されたオプションが含まれている場合、明確なエラーメッセージが表示されます。

設定のバリデーションを無効にするには、`--no-validation` CLIフラグを使用します：

```sh
pnpm react-server ./App.jsx --no-validation
pnpm react-server build --no-validation
```

バリデーションが正しい設定を誤って拒否する場合や、禁止されたオプションを意図的にバイパスする必要がある場合のエスケープハッチとして便利です。