Skip to content

Commit 636640a

Browse files
authored
Merge pull request #1311 from vitejs/dev
sync into main
2 parents 5c55987 + a70ec7a commit 636640a

File tree

3 files changed

+53
-72
lines changed

3 files changed

+53
-72
lines changed

guide/api-environment-frameworks.md

Lines changed: 50 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,13 @@
1313
请与我们分享您的反馈。
1414
:::
1515

16-
## 环境和框架 {#environments-and-frameworks}
16+
## 开发环境通信级别
1717

18-
隐式的 `ssr` 环境和其他非客户端环境在开发过程中默认使用 `RunnableDevEnvironment`。虽然这要求运行时与 Vite 服务器运行的环境相同,但这与 `ssrLoadModule` 类似,允许框架迁移并为其 SSR 开发方案启用模块热替换(HMR)。你可以使用 `isRunnableDevEnvironment` 函数来保护任何可运行的环境。
18+
由于环境可能在不同的运行时环境中运行,与环境的通信可能会受到运行时环境的限制。为了使框架能够轻松编写与运行时环境无关的代码,环境 API 提供了三种通信级别。
19+
20+
### `RunnableDevEnvironment`
21+
22+
`RunnableDevEnvironment` 是一种能够传递任意值的环境。隐式 `ssr` 环境及其他非客户端环境在开发阶段默认使用 `RunnableDevEnvironment`。虽然这要求运行时与 Vite 服务器运行的环境一致,但其工作原理与 `ssrLoadModule` 类似,并允许框架迁移并为其 SSR 开发流程启用 HMR。您可以通过 `isRunnableDevEnvironment` 函数对任何可运行环境进行保护。
1923

2024
```ts
2125
export class RunnableDevEnvironment extends DevEnvironment {
@@ -43,50 +47,7 @@ if (isRunnableDevEnvironment(server.environments.ssr)) {
4347
只有在第一次使用时,`runner` 才会被加载。请注意,当通过调用 `process.setSourceMapsEnabled` 或在不支持的情况下重写 `Error.prepareStackTrace` 创建 `runner` 时,Vite 会启用源映射支持。
4448
:::
4549

46-
那些通过 [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Window/fetch) 与它们的运行环境进行交互的框架可以使用 `FetchableDevEnvironment`,它提供了一种标准化的方式来通过 `handleRequest` 方法处理请求:
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-
// 现在,任何使用环境 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-
## 默认 `RunnableDevEnvironment` {#default-runnabledevenvironment}
88-
89-
假设我们有一个配置为中间件模式的 Vite 服务器,如 [SSR 设置指南](/guide/ssr#setting-up-the-dev-server) 所述,我们可以使用环境 API 来实现 SSR 中间件。请记住,它不必命名为 `ssr`,因此在本例中我们将其命名为 `server`。错误处理部分已省略。
50+
假设已按照[SSR 设置指南](/guide/ssr#setting-up-the-dev-server)中描述的方式配置了 Vite 服务器的中间件模式,现在我们使用环境 API 实现 SSR 中间件。请注意,它不必命名为 `ssr`,因此在本示例中我们将它命名为 `server`。错误处理已省略。
9051

9152
```js
9253
import fs from 'node:fs'
@@ -142,42 +103,62 @@ 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` 仅能在有限的运行时环境中实现,我们建议使用 `FetchableDevEnvironment` 替代 `RunnableDevEnvironment`
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+
// handle Request and return a Response
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+
// Any consumer of the environment API can now call `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
180-
如果你的代码可以在与用户模块相同的运行时中运行(即,它不依赖于 Node.js 特定的 API),你可以使用虚拟模块。这种方法避免了从使用 Vite API 的代码中获取值的需求。
151+
:::warning
152+
Vite 验证 `dispatchFetch` 方法的输入和输出:请求必须是全局 `Request` 类的实例,响应必须是全局 `Response` 类的实例。如果不符合此条件,Vite 将抛出 `TypeError` 异常。
153+
154+
请注意,尽管 `FetchableDevEnvironment` 作为类实现,但 Vite 团队将其视为实现细节,可能随时发生变化。
155+
:::
156+
157+
### raw `DevEnvironment`
158+
159+
如果环境未实现 `RunnableDevEnvironment``FetchableDevEnvironment` 接口,您需要手动设置通信。
160+
161+
如果您的代码可以在与用户模块相同的运行时环境中运行(即不依赖于 Node.js 特定的 API),您可以使用虚拟模块。这种方法消除了通过 Vite 的 API 从代码中访问值的必要性。
181162
182163
```ts
183164
// 使用 Vite API 的代码
@@ -198,8 +179,6 @@ const input = {}
198179
// 使用每个环境工厂暴露的函数来运行代码
199180
// 检查每个环境工厂提供了什么
200181
if (ssrEnvironment instanceof RunnableDevEnvironment) {
201-
ssrEnvironment.runner.import('virtual:entrypoint')
202-
} else 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` 导入,除非另有说明。这个导出入口文件尽可能保持轻量,仅导出创建模块运行器所需的最小部分。

guide/rolldown.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ export default {
127127
rollupOptions: {
128128
output: {
129129
advancedChunks: {
130-
groups: [{ name: 'vendor', test: /\/react(?:-dom)?// }]
130+
groups: [{ name: 'vendor', test: /\/react(?:-dom)?/ }]
131131
}
132132
}
133133
}

0 commit comments

Comments
 (0)