Как определить, что я нахожусь на сервере против клиента в Next.js
Я использую экспресс-сервер клиента с Next.js. Он работает в контейнере. Я делаю http запрос с isomorphic-fetch
чтобы получить данные для моего рендера. Я хотел бы сделать localhost
при работе на сервере и mysite.com
при запуске на клиенте. Не уверен, что лучший способ сделать это. Я могу сделать это по счастливой случайности const isServer = typeof window === 'undefined'
но это выглядит довольно плохо.
6 ответов
Ты можешь использовать process.browser
различать серверную среду (NodeJS) и клиентскую среду (браузер).
process.browser
является true
на клиенте и undefined
на сервере.
Сейчас (2020 Янв) должно быть typeof window === 'undefined'
поскольку process.browser
не рекомендуется
Так как мне не нравится зависеть от странных сторонних вещей для этого поведения (хотя process.browser
кажется, приходит из Webpack), я думаю, что предпочтительным способом проверки является наличие appContext.ctx.req
нравится:
async getInitialProps (appContext) {
if (appContext.ctx.req) // server?
{
//server stuff
}
else {
// client stuff
}
}
Еще одно примечание заключается в том, что componentDidMount()
всегда вызывается в браузере. Я часто загружаю исходный набор данных (SEO-контент в getInitialProps()
, а затем загрузить более глубокие данные в componentDidMount()
метод.
Также, как вариант, вы можете добавить переменную в свой.env
файл безNEXT_PUBLIC_
префикс.
Вроде как:
IS_SERVER_FLAG=true
Эта переменная будет доступна только на стороне сервера.
И после этого вы можете проверить это в своем коде
const isServer = process.env.IS_SERVER_FLAG ? 'RUN ON SERVER' : 'RUN_ON_CLIENT'
и добавлены в Next 9.3(март 2020 г.), и эти функции рекомендуются .
Если вы используете Next.js 9.3 или новее, мы рекомендуем вам использовать
getStaticProps
или вместоgetInitialProps
.
Так что не нужно обнаруживать, просто поместите данные на стороне сервера в
getServerSideProps
.
const MyPage = () => {
useEffect(() => {
// client side stuff
}, [])
return (
<div> ... </div>
)
}
MyPage.getServerSideProps = async () => {
// server side stuff
}