在本地运行 npm run dev 时一切正常,但将项目打包成 Docker 镜像运行时,调用 WebSocket 却始终报错 TypeError: t.mask is not a function。起初,我怀疑是 Docker 运行环境的问题,于是尝试在 Docker 中使用 npm run dev 运行,结果依然正常。这表明问题出在构建(build)阶段。经过排查,发现是构建时对 ws(WebSocket 库)的打包处理导致的。解决方法是在 next.config.ts 中添加配置,将 ws 标记为外部依赖,避免其被打包工具错误处理。配置如下:

const config = {
  experimental: {
    serverComponentsExternalPackages: ['ws'],
    turbo: {},
  },
};

我使用的是 Next.js 自带的 Turbopack 打包工具。如果你是用其他打包工具(如 Webpack ),解决思路相同,只需根据具体工具调整配置方式。如果你遇到类似问题,且确认代码本身无误,不妨尝试这种方法,或许能快速解决问题。