Skip to content

Commit 4a46727

Browse files
committed
Update guide/api-environment-plugins.md and guide/api-environment-runtimes.md
Closes #175 Closes #177
1 parent 02107ac commit 4a46727

File tree

2 files changed

+65
-8
lines changed

2 files changed

+65
-8
lines changed

docs/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>`. Обратите внимание, что для обратной совместимости хуки `buildStart` и `buildEnd` вызываются только для клиентского окружения, если не установлен флаг `perEnvironmentStartEndDuringDev: true`.
149+
Поскольку один и тот же экземпляр плагина используется для разных окружений, состояние плагина должно быть привязано к `this.environment`. Это соответствует подходу, уже используемому в экосистеме для хранения состояния модулей с использованием булева значения `ssr` в качестве ключа, чтобы избежать смешивания состояния клиентских и SSR-модулей. Для разделения состояния по окружениям можно использовать `Map<Environment, State>`. Обратите внимание, что для обратной совместимости хуки `buildStart` и `buildEnd` вызываются только для клиентского окружения, если не установлен флаг `perEnvironmentStartEndDuringDev: true`. То же самое для `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
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', `Привет от сервера! Вы сказали: ${data}`)
258+
})
259+
260+
// рассылаем сообщение всем экземплярам приложения
261+
server.environments.ssr.hot.send('my:foo', 'Привет от сервера!')
262+
}
263+
```
264+
265+
Сторона приложения аналогична связи «клиент-сервер». Вы можете использовать объект `import.meta.hot` для отправки сообщений плагину.
266+
230267
## Окружение в хуках сборки {#environment-in-build-hooks}
231268
232269
Так же, как и во время разработки, хуки плагинов также получают экземпляр окружения во время сборки, заменяя булевый параметр `ssr`. Это также работает для `renderChunk`, `generateBundle` и других хуков, которые используются только во время сборки.

docs/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+
// клиент уже подключен
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+
Убедитесь, что вы реализуете события `vite:client:connect` / `vite:client:disconnect` в методах `on` / `off`, когда эти методы существуют. Событие `vite:client:connect` должно эмитироваться при установке соединения, а событие `vite:client:disconnect` — при закрытии соединения. Объект `HotChannelClient`, передаваемый обработчику события, должен иметь одну и ту же ссылку для одного и того же соединения.
385+
366386
Другой пример, использующий HTTP-запрос для взаимодействия между раннером и сервером:
367387

368388
```ts

0 commit comments

Comments
 (0)