13
13
请与我们分享您的反馈。
14
14
:::
15
15
16
- ## 环境和框架 {#environments-and-frameworks}
16
+ ## 开发环境通信级别
17
17
18
- 隐式的 ` ssr ` 环境和其他非客户端环境在开发过程中默认使用 ` RunnableDevEnvironment ` 。虽然这要求运行时与 Vite 服务器运行的环境相同,但这与 ` ssrLoadModule ` 类似,允许框架迁移并为其 SSR 开发方案启用模块热替换(HMR)。你可以使用 ` isRunnableDevEnvironment ` 函数来保护任何可运行的环境。
18
+ 由于环境可能在不同的运行时环境中运行,与环境的通信可能会受到运行时环境的限制。为了使框架能够轻松编写与运行时环境无关的代码,环境 API 提供了三种通信级别。
19
+
20
+ ### ` RunnableDevEnvironment `
21
+
22
+ ` RunnableDevEnvironment ` 是一种能够传递任意值的环境。隐式 ` ssr ` 环境及其他非客户端环境在开发阶段默认使用 ` RunnableDevEnvironment ` 。虽然这要求运行时与 Vite 服务器运行的环境一致,但其工作原理与 ` ssrLoadModule ` 类似,并允许框架迁移并为其 SSR 开发流程启用 HMR。您可以通过 ` isRunnableDevEnvironment ` 函数对任何可运行环境进行保护。
19
23
20
24
``` ts
21
25
export class RunnableDevEnvironment extends DevEnvironment {
@@ -43,50 +47,7 @@ if (isRunnableDevEnvironment(server.environments.ssr)) {
43
47
只有在第一次使用时,` runner ` 才会被加载。请注意,当通过调用 ` process.setSourceMapsEnabled ` 或在不支持的情况下重写 ` Error.prepareStackTrace ` 创建 ` runner ` 时,Vite 会启用源映射支持。
44
48
:::
45
49
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 ` 。错误处理已省略。
90
51
91
52
``` js
92
53
import fs from ' node:fs'
@@ -142,42 +103,62 @@ app.use('*', async (req, res, next) => {
142
103
})
143
104
` ` `
144
105
145
- ## 运行时无关的 SSR {#runtime-agnostic-ssr}
146
-
147
- 由于 ` RunnableDevEnvironment` 只能用于在与 Vite 服务器相同的运行时中运行代码,它需要一个可以运行 Vite 服务器的运行时(即与 Node.js 兼容的运行时)。这意味着您需要使用原始的 ` DevEnvironment` 来使其对运行时无关。
106
+ ### ` FetchableDevEnvironment`
148
107
149
- :::info ` FetchableDevEnvironment ` 提议
108
+ :::info
150
109
151
- 最初的提议是在 ` DevEnvironment ` 类上有一个 ` run ` 方法,该方法将允许消费者通过使用 ` transport ` 选项在运行器端调用一个导入。在我们的测试中,我们发现 API 还不够通用,以至于我们暂时不开始推荐它。目前,我们正在寻求对 [` FetchableDevEnvironment` 提议 ](https://github.com/vitejs/vite/discussions/18191) 的反馈 。
110
+ 我们正在征集对 [` FetchableDevEnvironment` 提案 ](https://github.com/vitejs/vite/discussions/18191)的反馈意见 。
152
111
153
112
:::
154
113
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 ` 。
156
115
157
- 例如,下面的例子中,使用 Vite API 的代码使用了用户模块的值 :
116
+ 该环境通过 ` handleRequest ` 方法提供了一种标准化的请求处理方式 :
158
117
159
118
` ` ` 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'
166
124
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
+ })
170
142
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
+ )
177
148
}
178
149
` ` `
179
150
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 从代码中访问值的必要性。
181
162
182
163
` ` ` ts
183
164
// 使用 Vite API 的代码
@@ -198,8 +179,6 @@ const input = {}
198
179
// 使用每个环境工厂暴露的函数来运行代码
199
180
// 检查每个环境工厂提供了什么
200
181
if (ssrEnvironment instanceof RunnableDevEnvironment) {
201
- ssrEnvironment .runner .import (' virtual:entrypoint' )
202
- } else if (ssrEnvironment instanceof CustomDevEnvironment) {
203
182
ssrEnvironment .runEntrypoint (' virtual:entrypoint' )
204
183
} else {
205
184
throw new Error (` Unsupported runtime for ${ ssrEnvironment .name } ` )
0 commit comments