@@ -316,27 +316,45 @@ import { createServer, RemoteEnvironmentTransport, DevEnvironment } from 'vite'
316316function 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
0 commit comments