Skip to content

Commit 35fff52

Browse files
authored
Merge pull request #1405 from vitejs/dev
d2m
2 parents 93c42fa + 550b870 commit 35fff52

File tree

6 files changed

+167
-182
lines changed

6 files changed

+167
-182
lines changed

.vitepress/config.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,11 @@ export default defineConfig({
529529
languages: ['ts', 'js', 'json'],
530530
codeTransformers: [transformerTwoslash()],
531531
config(md) {
532-
md.use(groupIconMdPlugin)
532+
md.use(groupIconMdPlugin, {
533+
titleBar: {
534+
includeSnippet: true,
535+
},
536+
})
533537
md.use(markdownItImageSize, {
534538
publicDir: path.resolve(import.meta.dirname, '../public'),
535539
})

guide/api-environment-plugins.md

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ interface HotUpdateOptions {
146146
147147
## 插件中的基于环境的状态 {#per-environment-state-in-plugins}
148148
149-
鉴于相同的插件实例会被用于不同的环境,插件的状态需要以 `this.environment` 作为键来存储。这与生态系统中已使用的模式相同,即使用 `ssr` 布尔值作为键来避免混合客户端和 SSR 模块状态的方式。可以使用 `Map<Environment, State>` 来分别为每个环境保存其对应的状态。注意:为了保持向后兼容性,在未设置 `perEnvironmentStartEndDuringDev: true` 标志时,`buildStart``buildEnd` 仅会针对客户端环境被调用。
149+
鉴于相同的插件实例会被用于不同的环境,插件的状态需要以 `this.environment` 作为键来存储。这与生态系统中已使用的模式相同,即使用 `ssr` 布尔值作为键来避免混合客户端和 SSR 模块状态的方式。可以使用 `Map<Environment, State>` 来分别为每个环境保存其对应的状态。注意:为了保持向后兼容性,在未设置 `perEnvironmentStartEndDuringDev: true` 标志时,`buildStart``buildEnd` 仅会针对客户端环境被调用。同样的规则也适用于 `watchChange``perEnvironmentWatchChangeDuringDev: true` 标志。
150150
151151
```js
152152
function PerEnvironmentCountTransformedModulesPlugin() {
@@ -227,6 +227,43 @@ export default defineConfig({
227227
228228
`applyToEnvironment` 钩子在配置时调用,目前在 `configResolved` 之后调用,因为生态系统中的项目正在修改其中的插件。未来,环境插件解析可能会移至 `configResolved` 之前。
229229
230+
## 应用程序-插件通信 {#application-plugin-communication}
231+
232+
`environment.hot` 允许插件与给定环境的应用程序端代码进行通信。这相当于[客户端-服务器通信功能](/guide/api-plugin#client-server-communication),但支持除客户端环境以外的其他环境。
233+
234+
:::warning Note
235+
236+
请注意,此功能仅适用于支持 HMR 的环境。
237+
238+
:::
239+
240+
### 管理应用程序实例 {#managing-the-application-instances}
241+
242+
需要注意的是,在同一环境中可能有多个应用程序实例在运行。例如,如果你在浏览器中打开了多个标签页,每个标签页都是一个独立的应用程序实例,并且与服务器有独立的连接。
243+
244+
当建立新连接时,会在环境的 `hot` 实例上触发 `vite:client:connect` 事件。当连接关闭时,会触发 `vite:client:disconnect` 事件。
245+
246+
每个事件处理程序都会接收到 `NormalizedHotChannelClient` 作为第二个参数。客户端是一个具有 `send` 方法的对象,可用于向该特定应用程序实例发送消息。对于同一连接,客户端引用始终相同,因此你可以保留它来跟踪连接。
247+
248+
### 使用示例 {#example-usage}
249+
250+
插件端:
251+
252+
```js
253+
configureServer(server) {
254+
server.environments.ssr.hot.on('my:greetings', (data, client) => {
255+
// 处理数据,
256+
// 并可选择向该应用程序实例发送响应
257+
client.send('my:foo:reply', `Hello from server! You said: ${data}`)
258+
})
259+
260+
// 向所有应用程序实例广播消息
261+
server.environments.ssr.hot.send('my:foo', 'Hello from server!')
262+
}
263+
```
264+
265+
应用程序端与客户端-服务器通信功能相同。您可以使用 `import.meta.hot` 对象向插件发送消息。
266+
230267
## 构建钩子中的环境 {#environment-in-build-hooks}
231268
232269
与开发期间一样,插件钩子在构建期间也接收环境实例,取代了 `ssr` 布尔值。

guide/api-environment-runtimes.md

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -316,27 +316,45 @@ import { createServer, RemoteEnvironmentTransport, DevEnvironment } from 'vite'
316316
function createWorkerEnvironment(name, config, context) {
317317
const worker = new Worker('./worker.js')
318318
const handlerToWorkerListener = new WeakMap()
319+
const client = {
320+
send(payload: HotPayload) {
321+
worker.postMessage(payload)
322+
},
323+
}
319324

320325
const workerHotChannel = {
321326
send: (data) => worker.postMessage(data),
322327
on: (event, handler) => {
323-
if (event === 'connection') return
328+
// client is already connected
329+
if (event === 'vite:client:connect') return
330+
if (event === 'vite:client:disconnect') {
331+
const listener = () => {
332+
handler(undefined, client)
333+
}
334+
handlerToWorkerListener.set(handler, listener)
335+
worker.on('exit', listener)
336+
return
337+
}
324338

325339
const listener = (value) => {
326340
if (value.type === 'custom' && value.event === event) {
327-
const client = {
328-
send(payload) {
329-
worker.postMessage(payload)
330-
},
331-
}
332341
handler(value.data, client)
333342
}
334343
}
335344
handlerToWorkerListener.set(handler, listener)
336345
worker.on('message', listener)
337346
},
338347
off: (event, handler) => {
339-
if (event === 'connection') return
348+
if (event === 'vite:client:connect') return
349+
if (event === 'vite:client:disconnect') {
350+
const listener = handlerToWorkerListener.get(handler)
351+
if (listener) {
352+
worker.off('exit', listener)
353+
handlerToWorkerListener.delete(handler)
354+
}
355+
return
356+
}
357+
340358
const listener = handlerToWorkerListener.get(handler)
341359
if (listener) {
342360
worker.off('message', listener)
@@ -363,6 +381,8 @@ await createServer({
363381

364382
:::
365383

384+
请确保在 `on` / `off` 方法存在时实现 `vite:client:connect` / `vite:client:disconnect` 事件。当连接建立时应触发 `vite:client:connect` 事件,当连接关闭时应触发 `vite:client:disconnect` 事件。传递给事件处理程序的 `HotChannelClient` 对象对于同一连接必须具有相同的引用。
385+
366386
使用 HTTP 请求在运行程序和服务器之间进行通信的另一个示例:
367387

368388
```ts

guide/static-deploy.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ $ npm run preview
6363

6464
2. 进入仓库 settings 页面的 GitHub Pages 配置,选择部署来源为“GitHub Actions”,这将引导你创建一个构建和部署项目的工作流程,我们提供了一个安装依赖项和使用 npm 构建的工作流程样本:
6565

66-
<<< ./static-deploy-github-pages.yaml#content
66+
<<< ./static-deploy-github-pages.yaml#content [.github/workflows/deploy.yml]
6767

6868
## GitLab Pages 配合 GitLab CI {#gitlab-pages-and-gitlab-ci}
6969

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
"private": true,
99
"license": "CC BY-NC-SA 4.0",
1010
"devDependencies": {
11-
"@shikijs/vitepress-twoslash": "^3.13.0",
11+
"@shikijs/vitepress-twoslash": "^3.14.0",
1212
"@type-challenges/utils": "^0.1.1",
13-
"@types/express": "^5.0.3",
13+
"@types/express": "^5.0.4",
1414
"@types/node": "^20.9.2",
1515
"chalk": "^4.1.2",
1616
"feed": "^5.1.0",
@@ -20,10 +20,10 @@
2020
"markdown-it-image-size": "^15.0.1",
2121
"vite": "^7.0.4",
2222
"vitepress": "^2.0.0-alpha.7",
23-
"vitepress-plugin-group-icons": "^1.6.4",
24-
"vitepress-plugin-llms": "^1.8.0",
23+
"vitepress-plugin-group-icons": "^1.6.5",
24+
"vitepress-plugin-llms": "^1.8.1",
2525
"vue": "^3.5.22",
26-
"vue-tsc": "^3.1.1",
26+
"vue-tsc": "^3.1.2",
2727
"yorkie": "^2.0.0"
2828
},
2929
"packageManager": "[email protected]",

0 commit comments

Comments
 (0)