Skip to content

Commit 9d84134

Browse files
authored
docs: organize "Environment API for Frameworks" page based on communi… (#2058)
1 parent fab98cd commit 9d84134

File tree

2 files changed

+51
-70
lines changed

2 files changed

+51
-70
lines changed

guide/api-environment-frameworks.md

Lines changed: 49 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,13 @@ Environment API は一般的にリリース候補段階にあります。エコ
1313
ぜひフィードバックをお寄せください。
1414
:::
1515

16-
## 環境とフレームワーク {#environments-and-frameworks}
16+
## DevEnvironment の通信レベル {#devenvironment-communication-levels}
1717

18-
暗黙的な `ssr` 環境とその他の非クライアント環境では、開発中にデフォルトで `RunnableDevEnvironment` が使用されます。これには、Vite サーバーが実行しているのと同じランタイムが必要ですが、`ssrLoadModule` と同様に動作し、フレームワークが SSR 開発ストーリーの HMR を移行して有効にできるようにします。`isRunnableDevEnvironment` 関数を使用して、実行可能な環境をすべて保護できます。
18+
環境は異なるランタイムで実行される可能性があるため、環境との通信にはランタイムに応じて制約がある場合があります。フレームワークがランタイムに依存しないコードを簡単に記述できるように、Environment API は 3 種類の通信レベルを提供します。
19+
20+
### `RunnableDevEnvironment`
21+
22+
`RunnableDevEnvironment` は、任意の値を通信できる環境です。暗黙的な `ssr` 環境とその他の非クライアント環境では、開発中にデフォルトで `RunnableDevEnvironment` が使用されます。これには、Vite サーバーが実行しているのと同じランタイムが必要ですが、`ssrLoadModule` と同様に動作し、フレームワークが SSR 開発ストーリーの HMR を移行して有効にできるようにします。`isRunnableDevEnvironment` 関数を使用して、実行可能な環境をすべて保護できます。
1923

2024
```ts
2125
export class RunnableDevEnvironment extends DevEnvironment {
@@ -43,49 +47,6 @@ if (isRunnableDevEnvironment(server.environments.ssr)) {
4347
`runner` は、初めてアクセスされたときにのみ遅延評価されます。Vite は、`process.setSourceMapsEnabled` を呼び出して `runner` が作成されたとき、またはそれが利用できない場合は `Error.prepareStackTrace` をオーバーライドすることによって、ソースマップのサポートを有効にすることに注意してください。
4448
:::
4549

46-
`Fetch API`[Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Window/fetch))を介してランタイムと通信するフレームワークは、`handleRequest` メソッドを通じてリクエストを標準化された方法で処理する `FetchableDevEnvironment` を利用できます:
47-
48-
```ts
49-
import {
50-
createServer,
51-
createFetchableDevEnvironment,
52-
isFetchableDevEnvironment,
53-
} from 'vite'
54-
55-
const server = await createServer({
56-
server: { middlewareMode: true },
57-
appType: 'custom',
58-
environments: {
59-
custom: {
60-
dev: {
61-
createEnvironment(name, config) {
62-
return createFetchableDevEnvironment(name, config, {
63-
handleRequest(request: Request): Promise<Response> | Response {
64-
// リクエストを処理し、レスポンスを返します
65-
},
66-
})
67-
},
68-
},
69-
},
70-
},
71-
})
72-
73-
// Environment API のどの利用者からも `dispatchFetch` を呼び出せるようになりました
74-
if (isFetchableDevEnvironment(server.environments.custom)) {
75-
const response: Response = await server.environments.custom.dispatchFetch(
76-
new Request('/request-to-handle'),
77-
)
78-
}
79-
```
80-
81-
:::warning
82-
Vite は、`dispatchFetch` メソッドの入力と出力を検証します。リクエストはグローバル `Request` クラスのインスタンスである必要があり、レスポンスはグローバル `Response` クラスのインスタンスである必要があります。そうでない場合、Vite は `TypeError` をスローします。
83-
84-
`FetchableDevEnvironment` はクラスとして実装されていますが、Vite チームからは実装の詳細と見なされており、いつでも変更される可能性があることに注意してください。
85-
:::
86-
87-
## Default `RunnableDevEnvironment`
88-
8950
[SSR セットアップガイド](/guide/ssr#setting-up-the-dev-server)で説明されているように、ミドルウェアモードに設定された Vite サーバーがあるとして、Environment API を使って SSR ミドルウェアを実装してみましょう。これは `ssr` と呼ばれる必要はないので、この例では `server` と名付けます。エラー処理は省略します。
9051

9152
```js
@@ -142,41 +103,61 @@ app.use('*', async (req, res, next) => {
142103
})
143104
```
144105
145-
## ランタイムに依存しない SSR {#runtime-agnostic-ssr}
146-
147-
`RunnableDevEnvironment` は Vite サーバーと同じランタイムでコードを実行する目的のみで使用できるため、Vite サーバーを実行できるランタイム(Node.js と互換性のあるランタイム)が必要です。つまり、ランタイムに依存しないようにするには、生の `DevEnvironment` を使用する必要があります。
106+
### `FetchableDevEnvironment`
148107
149-
:::info `FetchableDevEnvironment` プロポーザル
108+
:::info
150109
151-
当初の提案では、`DevEnvironment` クラスに `run` メソッドがあり、利用者は `transport` オプションを使用してランナー側でインポートを呼び出すことができました。テスト中に、この API は推奨するには汎用性が足りないことがわかりました。現在、[`FetchableDevEnvironment` プロポーザル](https://github.com/vitejs/vite/discussions/18191)に関するフィードバックを募集しています。
110+
[`FetchableDevEnvironment` プロポーザル](https://github.com/vitejs/vite/discussions/18191)に関するフィードバックを募集しています。
152111
153112
:::
154113
155-
`RunnableDevEnvironment` には、モジュールの値を返す `runner.import` 関数があります。ただし、この関数は生の `DevEnvironment` では使用できず、Vite の API を使用するコードとユーザーモジュールを分離する必要があります
114+
`FetchableDevEnvironment` は、[Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Window/fetch) インターフェースを介してランタイムと通信できる環境です。`RunnableDevEnvironment` は限られたランタイムでしか実装できないため、`RunnableDevEnvironment` の代わりに `FetchableDevEnvironment` を使用することをお勧めします
156115
157-
たとえば、次の例では、Vite の API を使用するコードからユーザーモジュールの値を使用しています:
116+
この環境は、`handleRequest` メソッドを介してリクエストを処理する標準化された方法を提供します。
158117
159118
```ts
160-
// Vite の API を使用するコード
161-
import { createServer } from 'vite'
162-
163-
const server = createServer()
164-
const ssrEnvironment = server.environment.ssr
165-
const input = {}
119+
import {
120+
createServer,
121+
createFetchableDevEnvironment,
122+
isFetchableDevEnvironment,
123+
} from 'vite'
166124

167-
const { createHandler } = await ssrEnvironment.runner.import('./entrypoint.js')
168-
const handler = createHandler(input)
169-
const response = handler(new Request('/'))
125+
const server = await createServer({
126+
server: { middlewareMode: true },
127+
appType: 'custom',
128+
environments: {
129+
custom: {
130+
dev: {
131+
createEnvironment(name, config) {
132+
return createFetchableDevEnvironment(name, config, {
133+
handleRequest(request: Request): Promise<Response> | Response {
134+
// リクエストを処理し、レスポンスを返します
135+
},
136+
})
137+
},
138+
},
139+
},
140+
},
141+
})
170142

171-
// -------------------------------------
172-
// ./entrypoint.js
173-
export function createHandler(input) {
174-
return function handler(req) {
175-
return new Response('hello')
176-
}
143+
// Environment API のどの利用者からも `dispatchFetch` を呼び出せるようになりました
144+
if (isFetchableDevEnvironment(server.environments.custom)) {
145+
const response: Response = await server.environments.custom.dispatchFetch(
146+
new Request('/request-to-handle'),
147+
)
177148
}
178149
```
179150
151+
:::warning
152+
Vite は、`dispatchFetch` メソッドの入力と出力を検証します。リクエストはグローバル `Request` クラスのインスタンスである必要があり、レスポンスはグローバル `Response` クラスのインスタンスである必要があります。そうでない場合、Vite は `TypeError` をスローします。
153+
154+
`FetchableDevEnvironment` はクラスとして実装されていますが、Vite チームからは実装の詳細と見なされており、いつでも変更される可能性があることに注意してください。
155+
:::
156+
157+
### 未加工の `DevEnvironment`
158+
159+
環境が `RunnableDevEnvironment` または `FetchableDevEnvironment` インターフェースを実装していない場合は、手動で通信を設定する必要があります。
160+
180161
ユーザーモジュールと同じランタイムでコードを実行できる場合(つまり、Node.js 固有の API に依存しない場合)、仮想モジュールを使用できます。このアプローチにより、Vite の API を使用してコードから値にアクセスする必要がなくなります。
181162
182163
```ts
@@ -197,9 +178,7 @@ const input = {}
197178

198179
// コードを実行する各環境ファクトリーによって公開されている関数を使用します
199180
// 各環境ファクトリーについて、それらが提供するものをチェックします
200-
if (ssrEnvironment instanceof RunnableDevEnvironment) {
201-
ssrEnvironment.runner.import('virtual:entrypoint')
202-
} else if (ssrEnvironment instanceof CustomDevEnvironment) {
181+
if (ssrEnvironment instanceof CustomDevEnvironment) {
203182
ssrEnvironment.runEntrypoint('virtual:entrypoint')
204183
} else {
205184
throw new Error(`Unsupported runtime for ${ssrEnvironment.name}`)

guide/api-environment-runtimes.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ function createWorkerdDevEnvironment(
110110
}
111111
```
112112

113+
`DevEnvironment` には [複数の通信レベル](/guide/api-environment-frameworks#devenvironment-communication-levels) があります。フレームワークがランタイムに依存しないコードを簡単に記述できるように、可能な限り柔軟な通信レベルを実装することをお勧めします。
114+
113115
## `ModuleRunner`
114116

115117
モジュールランナーはターゲットランタイムでインスタンス化されます。次のセクションの全ての API は、特に断りのない限り `vite/module-runner` からインポートされます。このエクスポート・エントリーポイントは可能な限り軽量に保たれており、モジュールランナーを作成するために必要な最小限のものだけがエクスポートされます。

0 commit comments

Comments
 (0)