Project Icon

next-ws

Next.js应用目录WebSocket集成插件

Next WS是一个为Next.js应用目录集成WebSocket功能的插件。它允许在路由中直接实现WebSocket服务器,无需额外设置。该插件提供自定义服务器选项、客户端工具,并简化WebSocket服务器管理。Next WS适用于服务器环境,要求Next.js 13.1.1以上版本,不支持无服务器平台。

Next WS

在Next.js应用目录中添加WebSocket支持
npm install next-ws ws
包版本 总下载量
next-ws仓库星标 apteryxxyz关注者 discord徽章

🤔 关于

Next WS (next-ws) 是一个高级的Next.js插件,可以将WebSocket服务器功能无缝集成到应用目录中的路由中。使用Next WS,你不再需要为WebSocket功能设置单独的服务器。

[!重要]
Next WS 专为基于服务器的环境设计。它不适用于不支持WebSocket服务器的无服务器平台,如Vercel。此外,该插件是为应用目录构建的,不支持较旧的页面目录。

该模块的灵感来自于现已过时的 next-plugin-websocket,如果你使用的是较旧版本的Next.js,那个模块可能适合你。

🏓 目录

📦 安装

使用Next WS设置WebSocket服务器涉及修补本地Next.js安装。Next WS通过CLI命令简化了这个过程,自动检测并修补你的Next.js版本,确保兼容性。请注意,需要Next.js 13.1.1或更高版本。

npx next-ws-cli@latest patch

[!注意]
如果你的本地Next.js安装发生变更或更新,你需要重新运行修补命令。

成功修补Next.js后,将Next WS包及其对等依赖ws安装到你的项目中:

npm install next-ws ws

🚀 使用方法

使用Next WS在Next.js应用中实现WebSocket功能非常简单,无需额外配置。只需从任何路由文件中导出一个SOCKET函数即可。当客户端与该特定路由建立WebSocket连接时,将调用此函数。

SOCKET函数接收三个参数:WebSocket客户端实例、传入的HTTP请求(你可以用它获取URL路径、查询参数和头部信息)以及WebSocket服务器实例。

export function SOCKET(
  client: import('ws').WebSocket,
  request: import('http').IncomingMessage,
  server: import('ws').WebSocketServer,
) {
  // ...
}

使用自定义服务器

在生产环境中,Next.js为路由使用工作进程,这可能使得从SOCKET处理程序外部访问WebSocket服务器变得困难,尤其是当WebSocket服务器存在于主进程时。对于需要克服这一挑战或偏好自定义服务器设置的用户,Next WS提供了解决方案。

next-ws/server模块提供了设置HTTP和WebSocket服务器的函数。你可以使用这些函数告诉Next WS使用你的服务器实例,而不是创建自己的实例。这允许你从应用的任何地方访问你自己创建的实例。请参考下面的示例

🌀 示例

有关更详细的示例,请参考examples目录

创建Socket

只需在应用目录中的任何位置创建API路由并从中导出SOCKET函数即可。以下是一个简单的回声服务器示例,它会将收到的任何消息发送回去。

// app/api/ws/route.ts(可以是应用目录中的任何路由文件)
export function SOCKET(
  client: import('ws').WebSocket,
  request: import('http').IncomingMessage,
  server: import('ws').WebSocketServer,
) {
  console.log('客户端已连接');

  client.on('message', (message) => {
    console.log('收到消息:', message);
    client.send(message);
  });

  client.on('close', () => {
    console.log('客户端已断开连接');
  });
}

使用自定义服务器

要使用自定义服务器,你只需要告诉Next WS使用你的服务器而不是创建自己的服务器。这可以通过调用next-ws/server中的setHttpServersetWebSocketServer函数并传递你的服务器实例来实现。

// server.js

const { setHttpServer, setWebSocketServer } = require('next-ws/server');
const { Server } = require('node:http');
const { parse } = require('node:url');
const next = require('next');
const { WebSocketServer } = require('ws');

const dev = process.env.NODE_ENV !== 'production';
const hostname = 'localhost';
const port = 3000;

const httpServer = new Server();
const webSocketServer = new WebSocketServer({ noServer: true });
// 在启动自定义服务器之前告诉Next WS关于HTTP和WebSocket服务器的信息
setHttpServer(httpServer);
setWebSocketServer(webSocketServer);

const app = next({ dev, hostname, port, customServer: httpServer });
const handle = app.getRequestHandler();

app.prepare().then(() => {
  httpServer
    .on('request', async (req, res) => {
      const parsedUrl = parse(req.url, true);
      await handle(req, res, parsedUrl);
    })
    .listen(port, () => {
      console.log(` ▲ 准备就绪,访问 http://${hostname}:${port}`);
    });
});

访问WebSocket服务器

除了设置器外,Next WS还为HTTP和WebSocket服务器提供了获取器。这些函数可以在你的应用程序的任何地方用来访问服务器。

[!重要]
为了使用getWebSocketServergetHttpServer函数,你必须使用自定义服务器,这是由于Next.js的限制。请参考使用自定义服务器

// app/api/stats/route.ts

import { getWebSocketServer } from 'next-ws/server';
// 还有一个`getHttpServer`函数可用

export function GET() {
  const wsServer = getWebSocketServer();
  // 响应已连接客户端的数量
  return Response.json({ count: wsServer.clients.size });
}

客户端工具

为了更容易地连接到你的新WebSocket服务器,Next WS还提供了一些客户端工具。这些是完全可选的,你可以使用自己的实现如果你愿意。

// layout.tsx
'use client';

import { WebSocketProvider } from 'next-ws/client';

export default function Layout({ children }: React.PropsWithChildren) {
  return <html>
    <body>
      <WebSocketProvider
        url="ws://localhost:3000/api/ws"
      >
        {children}
      </WebSocketProvider>
    </body>
  </html>;
}

以下是WebSocketProvider组件的属性接口,包含所有可用选项。

interface WebSocketProviderProps {
  children: React.ReactNode;

  /** WebSocket连接的URL。 */
  url: string;
  /** 使用的子协议。 */
  protocols?: string[] | string;
  /** 使用的二进制类型。 */
  binaryType?: BinaryType;
}

现在你可以使用useWebSocket钩子来获取WebSocket实例,并发送和接收消息。

// page.tsx
'use client';

import { useCallback, useEffect, useRef, useState } from 'react';
import { useWebSocket } from 'next-ws/client';

export default function Page() {
  const ws = useWebSocket();
  //    ^? 客户端上是WebSocket,服务器上是null

  const inputRef = useRef<HTMLInputElement>(null);
  const [message, setMessage] = useState<string | null>(null);

  useEffect(() => {
    async function onMessage(event: MessageEvent) {
      const payload =
        typeof event.data === 'string' ? event.data : await event.data.text();
      const message = JSON.parse(payload) as Message;
      setMessages((p) => [...p, message]);
    }

    ws?.addEventListener('message', onMessage);
    return () => ws?.removeEventListener('message', onMessage);
  }, [ws]);

  return <>
    <input
      ref={inputRef}
      type="text"
    />

    <button
      onClick={() => ws?.send(inputRef.current?.value ?? '')}
    >
      向服务器发送消息
    </button>

    <p>
      {message === null
        ? '等待接收消息...'
        : `收到消息: ${message}`}
    </p>
  </>;
}
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号