Next.js: рдкреНрд░рд╢реНрди: рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдХреЛрдб рдХреИрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 5 рдЬреБрд▓ре░ 2017  ┬╖  19рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: vercel/next.js

рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреЙрд▓рдмреИрдХ рд░реВрдЯ рд╣реИ рдЬреЛ рдпреВрдЖрд░рдПрд▓ рд╣реИрд╢ рдЦрдВрдб рдореЗрдВ рдСрде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рд░реЗрдбрдХреНрд╕ рд╕реНрдЯреЛрд░ рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдЗрд╕реЗ рдЕрдЧрд▓реЗ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ window.location.hash рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ рдЬрдм рдкреГрд╖реНрда рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ (рд╣реИрд╢ рдЦрдВрдб рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ )

рдХреНрдпрд╛ рдХреБрдЫ рдХреЛрдб рдХреЛ рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ? рдпрд╛ рдЗрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@vanniewelt рдЖрдк рд╣рдореЗрд╢рд╛ process.browser ..

if (process.browser) {
  // client-side-only code
}

@Timer рджреНрд╡рд╛рд░рд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

@vanniewelt рдЖрдк рд╣рдореЗрд╢рд╛ typeof window ..

if (typeof window !== 'undefined') {
  // client-side-only code
}

рд╕рднреА 19 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@vanniewelt : рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрдпрд╛рддрд┐рдд Async рдШрдЯрдХ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЖрдк рд╡рд╣рд╛рдВ рд╕рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рд▓реЙрдЬрд┐рдХ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ ComponentWillReceiveProps рдЬреАрд╡рдирдЪрдХреНрд░ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред
рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЪрд░ рдореМрдЬреВрдж рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВред

рдпрджрд┐ lib рдХреЛ рд╡рд┐рдВрдбреЛ рдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдбрд╛рдпрдирд╛рдорд┐рдХ рдЖрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

https://github.com/zeit/next.js/tree/v3-beta/examples/with-dynamic-import

рдЖрдк рд░рд┐рдПрдХреНрдЯ рдХреА componentDidMount рдЬреАрд╡рдирдЪрдХреНрд░ рдкрджреНрдзрддрд┐ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

@vanniewelt рдЖрдк рд╣рдореЗрд╢рд╛ process.browser ..

if (process.browser) {
  // client-side-only code
}

@Timer рджреНрд╡рд╛рд░рд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

@vanniewelt рдЖрдк рд╣рдореЗрд╢рд╛ typeof window ..

if (typeof window !== 'undefined') {
  // client-side-only code
}

рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдореИрдВ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгрд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдореИрдВ рдЙрд╕ рдЪреЗрдХ рдХреЛ рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рд╕реНрдЯреЛрд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдХреБрдХреА рдореЗрдВ рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд╣рд▓реЗ рдкреГрд╖реНрда рдкрд░ рд▓реЛрдб рдХреЗ рд╕рд╛рде:

if (process.browser) {
  // client-side-only code
}

рджрд╛рдпрд░реЗ рдХреЗ рднреАрддрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╕рд░реНрд╡рд░ рдкрд░ рдирд╣реАрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдирд╣реАрдВ, рдЗрд╕реЗ рдХреЗрд╡рд▓ рддрднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд░реВрдЯ рдкрд░рд┐рд╡рд░реНрддрди рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ

@sarkistlt рдЖрдк рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рд╣реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЙрд╕ рдХреЛрдб рдХреЛ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ .. рд▓реЗрдХрд┐рди ..

рдпрджрд┐ рдЙрд╕ рдХреЛрдб рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рд╖реНрдкрд╛рджрди // client-side-only code рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗрдЧрд╛ред рдпрджрд┐ рдЙрд╕ рдХреЛрдб рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рд╖реНрдкрд╛рджрди // client-side-only code рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдЧрд╛ ред

рдпрд╣ рдкреНрд░рд╢реНрди рдХреЗ рд╡реИрдз рдЙрддреНрддрд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ:

рдХреНрдпрд╛ рдХреБрдЫ рдХреЛрдб рдХреЛ рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

@sarkistlt componentDidMount рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, componentWillMount рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рджреЛрдиреЛрдВ рддрд░рдл рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

@sarkistlt https://reactjs.org/docs/react-component.html#componentwillmount

рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдЬреАрд╡рдирдЪрдХреНрд░ рд╣реБрдХ рд╣реИ рдЬрд┐рд╕реЗ рд╕рд░реНрд╡рд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрд╣реБрдд рдмрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ, рдЖрдк componentWillMount рдХреЛ componentDidMount рд╕рд╛рде рднреНрд░рдорд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@sergiodxa рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдк рд╕рд╣реА рд╣реИрдВ, рдЕрднреА рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдпрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

@sergiodxa componentWillMount рдХреЗ рд▓рд┐рдВрдХ рдХреЛ https://reactjs.org/docs/react-component.html#unsafe_componentwillmount рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдореБрдЭреЗ mapbox-gl рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЬреЛ ComponentDidMount рдЕрдВрджрд░ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдФрд░ рдПрдХ рдмрджрд╕реВрд░рдд рддреНрд░реБрдЯрд┐ ReferenceError: self is not defined рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдпрд╛

рдореИрдВ componentDidMount рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдкрдмреЙрдХреНрд╕ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдШрдЯрдХ рдЕрднреА рднреА рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ (рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ) (рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХрд┐ @elaich )

@ aga5tya рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдбрд╛рдпрдирд╛рдорд┐рдХ рдЖрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд╛рд▓ рдЪрд▓реА ред

@vanniewelt : рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрдпрд╛рддрд┐рдд Async рдШрдЯрдХ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЖрдк рд╡рд╣рд╛рдВ рд╕рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рд▓реЙрдЬрд┐рдХ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ ComponentWillReceiveProps рдЬреАрд╡рдирдЪрдХреНрд░ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред
рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЪрд░ рдореМрдЬреВрдж рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВред

рдпрджрд┐ lib рдХреЛ рд╡рд┐рдВрдбреЛ рдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдбрд╛рдпрдирд╛рдорд┐рдХ рдЖрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

https://github.com/zeit/next.js/tree/v3-beta/examples/with-dynamic-import

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЪрд▓реЗ рдЧрдП рд╣реИрдВред рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рдбрд╛рдпрдирд╛рдорд┐рдХ рдЖрдпрд╛рдд рд▓рд┐рдВрдХ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИред рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдбрд╛рдпрдирд╛рдорд┐рдХ рдЗрдореНрдкреЛрд░реНрдЯреНрд╕ рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдШрдЯрдХ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрд╢рд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдЖрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг: рд▓реЛрдЧ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ), рддреЛ рдЖрдк рд╣реБрдХ (рдпрд╛ рд╕рдордХрдХреНрд╖ componentDidMount ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

import React, { useEffect, useState } from 'react'

function CreateInteraction ({ input }) {
  const [isComponentMounted, setIsComponentMounted] = useState(false)

  useEffect(() => setIsComponentMounted(true), [])

  if(!isComponentMounted) {
    return null
  }

  return <h1>I'm only executed on the client!</h1>
}

рдмрд╕ рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЪреНрдЫреЗ рдЙрддреНрддрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП: рдореЗрд░реА рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд╢рд░реНрдд рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

import React, { useEffect, useState } from "react";

export interface ConditionallyRenderProps {
    client?: boolean;
    server?: boolean;
}

const ConditionallyRender: React.FC<ConditionallyRenderProps> = (props) => {
    const [isMounted, setIsMounted] = useState(false);

    useEffect(() => setIsMounted(true), []);

    if(!isMounted && props.client) {
        return null;
    }

    if(isMounted && props.server) {
        return null;
    }

    return props.children as React.ReactElement;
};

export default ConditionallyRender;

рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

<Layout>
    <ConditionallyRender server>
        <p>This is rendered only on server.</p>
    </ConditionallyRender>
    <ConditionallyRender client>
        <p>This is rendered only on client.</p>
    </ConditionallyRender>
</Layout>

рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддреЛ рдЖрдк рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ SSR=false рдХреЗ рд╕рд╛рде рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
const DynamicComponentWithNoSSR = dynamic( () => import('../components/hello3'), { ssr: false } )
https://nextjs.org/docs/advanced-features/dynamic-import

рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддреЛ рдЖрдк рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ SSR=false рдХреЗ рд╕рд╛рде рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
const DynamicComponentWithNoSSR = dynamic( () => import('../components/hello3'), { ssr: false } )
https://nextjs.org/docs/advanced-features/dynamic-import

рдпрджрд┐ рдЖрдк @yashwant-dangi рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП "рдбрд╛рдпрдирд╛рдорд┐рдХ" рдЖрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рдЖрдпрд╛рдд рднреА рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛!

import dynamic from 'next/dynamic'

@Timer рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЖрдкрдиреЗ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА https://github.com/vercel/next.js/issues/2473#issuecomment -362119102 рд╕рдВрдкрд╛рджрд┐рдд рдХреА, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА рдФрд░ рдЖрдкрдХреЗ рд╕рдВрдкрд╛рджрди рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ред

  1. рд╣рдореЗрдВ рдХреЗрд╡рд▓ process.browser рдмрдЬрд╛рдп typeof window !== 'undefined' рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╣ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдпрд╣рд╛рдВ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рддреЛ рдореИрдВ process.browser рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред
  2. рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╕рдВрдкрд╛рджрди рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдзрд╛рдЧреЗ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдЙрд╕рдиреЗ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛, рдЬрд╣рд╛рдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯрд┐рдкреНрдкрдгреА рдореЗрд░реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рдЙрддреНрддрд░ рд╣реИред рджреВрд╕рд░рд╛, рдпрд╣ рднреНрд░рд╛рдордХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЬреЛ рд▓рд┐рдЦрд╛ рд╣реИ рд╡рд╣ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рднреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬрдм рд▓реЛрдЧ рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддреЗ рд╣реИрдВ рддреЛ рд▓реЛрдЧ рдкрдврд╝рддреЗ рд╣реИрдВред

рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛.рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдмрдЬрд╛рдп рдЯрд╛рдЗрдкрдСрдлрд╝ рд╡рд┐рдВрдбреЛ !== 'рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╣ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдпрд╣рд╛рдВ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рддреЛ рдореИрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛.рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред

process.browser рдЧреИрд░-рдорд╛рдирдХ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рд╡реЗрдмрдкреИрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рдХреЗ рдЯреВрдЯрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ 5 рдЕрдм process рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ typeof window !== "undefined" рд╣реЛ рд╕рдХрддрд╛ рд╣реИ Object.prototype.isPrototypeOf(window) ред рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рд╛рд▓рд╛рдВрдХрд┐, Next.js рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдмрдВрдбрд▓ рдкреВрд░реНрд╡ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬреЛ рднреА рд╣рд▓реНрдХрд╛ рдмрдВрдбрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдЙрд╕реЗ рдЬреАрдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

lixiaoyan picture lixiaoyan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

timneutkens picture timneutkens  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

formula349 picture formula349  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rauchg picture rauchg  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

irrigator picture irrigator  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ