如何检测我在Next.js中的服务器与客户端

Dav*_*ein 16 express nextjs

我正在使用Next.js的客户快递服务器.它在容器内运行.我正在做一个http请求,isomorphic-fetch以获取我的渲染数据.我想localhost在服务器mysite.com上运行和在客户端上运行时做.不确定实现这一目标的最佳方法.我可以做到这一点,const isServer = typeof window === 'undefined'但这似乎很糟糕.

ken*_*ley 122

现在(2020 年 1 月)应该是typeof window === 'undefined'因为process.browser已弃用

参考https://github.com/zeit/next.js/issues/5354#issuecomment-520305040

  • 很好的答案!不过,请注意,如果您使用 Typescript,并且像我一样,您会收到错误“找不到名称窗口”,这是因为您需要将“dom”添加到 tsconfig 中的“lib”数组中。 json。由于某种原因,Next.js 默认不包含此内容。 (4认同)

sai*_*unt 30

您可以process.browser用来区分服务器环境(NodeJS)和客户端环境(浏览器).

process.browsertrue在客户端和undefined服务器上.

  • 请查看下面@kenberkeley 的答案,而不是使用它。“process.browser”已被弃用,使用“typeof window”可以让您获得框架内优化。 (3认同)
  • 我认为 `process.browser` 是由 webpack 添加的,然后传播到 next.js (2认同)

Gez*_*zim 9

由于我不喜欢这种行为依赖于奇怪的第三方事物(即使process.browser似乎来自Webpack),我认为检查的首选方法是是否存在appContext.ctx.req这样的:

async getInitialProps (appContext) {

    if (appContext.ctx.req) // server? 
    {
        //server stuff
    }
    else {
        // client stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

来源:https : //github.com/zeit/next.js/issues/2946

  • 这假设您位于“getInitialProps”或有权访问“appContext” (4认同)
  • 我不会对基本概念使用晦涩的语法 - `isClient(appContext)` 帮助器会读得更好。 (2认同)

For*_*man 5

另一项注意事项是componentDidMount()始终在浏览器上调用。我经常加载初始数据集(seo 内容)getInitialProps(),然后在方法中加载更深入的数据 componentDidMount()

  • 有没有办法使用 useEffect() 钩子来做到这一点? (3认同)

meg*_*ter 5

另外,作为变体,您可以将变量添加到.env文件中而不带NEXT_PUBLIC_前缀。

就像: IS_SERVER_FLAG=true

该变量仅在服务器端可用

之后,您可以在代码中检查它

const isServer = process.env.IS_SERVER_FLAG ? 'RUN ON SERVER' : 'RUN_ON_CLIENT'