Как определить, нахожусь ли я на сервере на клиенте в next.js?

Я использую клиентский экспресс-сервер с Next.js. Он работает в контейнере. Я делаю http-запрос с isomorphic-fetch, чтобы получить данные для моего рендера. Я бы хотел сделать localhost при работе на сервере и mysite.com при работе на клиенте. Не уверен, как лучше всего этого добиться. Я могу сделать это хакерским путем, выполнив const isServer = typeof window === 'undefined', но это кажется довольно плохим.

Обновите ответ (см. @Kenberkeley ниже)

mikemaccana 19.04.2021 18:26

@mikemaccana готово!

Dave Stein 23.04.2021 15:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
50
2
39 972
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете использовать process.browser, чтобы различать серверную среду (NodeJS) и клиентскую среду (браузер).

process.browser - это true на клиенте и undefined на сервере.

Также есть isServer, зависящий от вызова функции Next. Мне действительно нужно было использовать process.browser, откуда мне нужна логика :)

Dave Stein 22.03.2018 18:43

Ты просто идеален!

Islam Attrash 19.06.2019 11:57

Я думаю, что process.browser добавляется веб-пакетом, который затем распространяется на next.js

Divyanshu Maithani 22.06.2019 09:40

Вместо этого взгляните на ответ @ kenberkeley ниже. process.browser устарел, и использование typeof window вместо него даст вам оптимизацию внутри фреймворка.

Zack 29.01.2021 13:58

Еще одно замечание: componentDidMount() всегда вызывается в браузере. Я часто загружаю исходный набор данных (seo-контент в getInitialProps(), а затем загружаю более подробные данные в методе componentDidMount().

Есть ли способ сделать это с помощью хука useEffect ()?

jonhobbs 28.03.2019 00:51

@jonhobbs Да, useEffect напрямую заменяет componentDidMount (плюс componentDidUpdate и componentWillUnmount все в одном). Если вы просто напишете useEffect(() => { .. }, []), то это точный эквивалент. См. reactjs.org/docs/hooks-effect.html

Petr Bela 01.04.2020 23:03

Поскольку мне не нравится зависеть от странных сторонних вещей для этого поведения (хотя process.browser, похоже, исходит от Webpack), я думаю, что предпочтительный способ проверки - наличие appContext.ctx.req следующим образом:

async getInitialProps (appContext) {

    if (appContext.ctx.req) // server? 
    {
        //server stuff
    }
    else {
        // client stuff
    }
}

Источник: https://github.com/zeit/next.js/issues/2946

Предполагается, что вы находитесь в getInitialProps или имеете доступ к appContext.

monokrome 21.05.2020 11:23
Ответ принят как подходящий

Теперь (январь 2020 г.) это должен быть typeof window === 'undefined', поскольку process.browser устарел.

Обратитесь к https://github.com/zeit/next.js/issues/5354#issuecomment-520305040

Отличный ответ! Однако добавлю примечание, что если вы используете Typescript и, как и я, получаете сообщение об ошибке «не удается найти окно имени», это связано с тем, что вам нужно добавить "dom" в массив lib в tsconfig.json. По какой-то причине Next.js не включает это по умолчанию.

Zack 29.01.2021 14:00

getServerSideProps и getStaticProps добавлены в Next 9.3 (март 2020 г.), и это функции рекомендуемые.

If you're using Next.js 9.3 or newer, we recommend that you use getStaticProps or getServerSideProps instead of getInitialProps.

Так что не нужно обнаруживать, просто поместите вещи на стороне сервера в getServerSideProps.

const MyPage = () => {
  useEffect(() => {
    // client side stuff
  }, [])

  return (
    <div> ... </div>
  )
}

MyPage.getServerSideProps = async () => {
  // server side stuff
}

Другие вопросы по теме