Nextjs - 如果在客户端运行,则注入 ContextProvider

Posted

技术标签:

【中文标题】Nextjs - 如果在客户端运行,则注入 ContextProvider【英文标题】:Nextjs - Inject ContextProvider if running in client side 【发布时间】:2021-05-05 03:48:56 【问题描述】:

如何确保我的 contextprovider 仅在客户端运行。

我在_app.tsx 中使用了两个提供程序,即 ChakraProvider(用于 chakra-ui)和 SocketProvider(用于 websocket)。

export default function MyApp( Component, pageProps : AppProps) 
  return (
    <ChakraProvider>
      <SocketProvider wsUrl='ws://localhost:4000/socket'>
        <Component ...pageProps />
      </SocketProvider>
    </ChakraProvider>
  );


当我尝试访问该页面时,它说:

Server Error

TypeError: Cannot read property 'WebSocket' of undefined

但是当我在客户端尝试它时,SocketProvider 工作正常并且没有抛出任何错误。

【问题讨论】:

【参考方案1】:

你可以使用这个checkWindow函数来检测客户端:

export default () => typeof window !== 'undefined';

资源:https://github.com/vercel/next.js/issues/5354#issuecomment-520305040

更新:

在 Next.js 中使用套接字的好例子:https://github.com/vercel/next.js/tree/442fbfaa4d4e8205cf10c7e5d27b8f51b7a4bdc6/examples/with-socket.io

【讨论】:

以上是关于Nextjs - 如果在客户端运行,则注入 ContextProvider的主要内容,如果未能解决你的问题,请参考以下文章

如何在 nx 工作区的 VSCode 中运行 NextJS 客户端调试器

如何使用后备构建 nextjs:true 启用

从 NextJS 到节点后端的套接字连接

Firebase + Nextjs - 用户会话共享

在 nextjs 中,对象类型从服务器更改为客户端

如何解决 nextjs 上未找到下一个身份验证/客户端模块的问题?