Analog
On this page

WebSocket

Analog 还通过 Nitro 支持 WebSocketsServer-Sent Events

启用 WebSockets

目前,Nitro 中的 WebSocket 支持是实验性的,可以在 analog 插件中启用:

vite.config.ts

export default defineConfig({
  // ...
  plugins: [
    analog({
      // ...
      nitro: {
        experimental: {
          websocket: true,
        },
      },
    }),
  ],
  // ...
});

注意: 在开发过程中,Vite HMR WebSocket 服务器默认运行在与开发服务器相同的端口上。为了防止冲突,需要更改此端口。开发服务器端口通常在 project.json/angular.json 中定义,优先于 vite.config.ts。为了使 vite.config.ts 中的端口设置生效,请从 project.json/angular.json 中删除端口定义。此外,可以指定一个可选路径,以便在浏览器开发工具中轻松区分连接:

vite.config.ts

export default defineConfig({
  // ...
  server: {
    port: 3000, // 开发服务器端口
    hmr: {
      port: 3002, // hmr ws 端口
      path: 'vite-hmr', // 可选
    },
  },
  // ...
});

定义 WebSocket 处理程序

类似于 API 路由,WebSocket 处理程序定义在 src/server/routes/api 文件夹中。

// src/server/api/routes/ws/chat.ts
export default defineWebSocketHandler({
  open(peer) {
    peer.send({ user: 'server', message: `Welcome ${peer}!` });
    peer.publish('chat', { user: 'server', message: `${peer} joined!` });
    peer.subscribe('chat');
  },
  message(peer, message) {
    if (message.text().includes('ping')) {
      peer.send({ user: 'server', message: 'pong' });
    } else {
      const msg = {
        user: peer.toString(),
        message: message.toString(),
      };
      peer.send(msg); // echo
      peer.publish('chat', msg);
    }
  },
  close(peer) {
    peer.publish('chat', { user: 'server', message: `${peer} left!` });
  },
});

WebSocket 路由

WebSocket 路由与 API 路由的路径相同。例如,src/server/routes/api/ws/chat 暴露为 ws://example.com/api/ws/chat

定义 Server-sent Event 处理程序

可以使用事件处理程序中的 createEventStream 函数创建 Server-sent 事件处理程序。

// src/server/routes/api/sse.ts
export default defineEventHandler(async (event) => {
  const eventStream = createEventStream(event);

  const interval = setInterval(async () => {
    await eventStream.push(`Message @ ${new Date().toLocaleTimeString()}`);
  }, 1000);

  eventStream.onClosed(async () => {
    clearInterval(interval);
    await eventStream.close();
  });

  return eventStream.send();
});

更多信息

WebSockets 由 Nitroh3crossws 提供支持。有关更多详细信息,请参阅 Nitro、h3 和 crossws 文档。 WebSocket