Next.js: Q: ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œλ§Œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 방법

에 λ§Œλ“  2017λ…„ 07μ›” 05일  Β·  19μ½”λ©˜νŠΈ  Β·  좜처: vercel/next.js

URL ν•΄μ‹œ 쑰각의 인증 ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ•‘μ„ΈμŠ€ 토큰을 λ°›λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— 콜백 κ²½λ‘œκ°€ μžˆμŠ΅λ‹ˆλ‹€. νŒŒμ‹±ν•΄μ„œ redux μŠ€ν† μ–΄μ— μ €μž₯ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λ‹€μŒμœΌλ‘œ μ „ν™˜ν•˜κΈ° 전에 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 : λ™μ μœΌλ‘œ κ°€μ Έμ˜¨ 비동기 ꡬ성 μš”μ†Œκ°€ ν΄λΌμ΄μ–ΈνŠΈμ— λ‘œλ“œλ˜κ³  λͺ¨λ“  ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ 논리λ₯Ό 거기에 넣을 수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ ComponentWillReceiveProps 수λͺ… μ£ΌκΈ°λŠ” μ„œλ²„ μΈ‘μ—μ„œ propsμ—μ„œ μš”μ²­μ„ μˆ˜μ‹ ν•©λ‹ˆλ‹€.
이 λ³€μˆ˜κ°€ μžˆλŠ”μ§€ ν™•μΈν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό μ‚½μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

lib에 μ°½ λ³€μˆ˜κ°€ ν•„μš”ν•œ 경우 동적 κ°€μ Έμ˜€κΈ°λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

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

React의 componentDidMount 라이프사이클 방법을 μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ„œλ²„ 츑이라고 ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

@vanniewelt μ–Έμ œλ‚˜ process.browser λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€ ..

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

@Timer둜 νŽΈμ§‘:

@vanniewelt μ–Έμ œλ‚˜ typeof window λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€..

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

예, ν•˜μ§€λ§Œ μ΅œμ„ μ˜ 방법은 μ•„λ‹™λ‹ˆλ‹€.
μ‚¬μš©μžκ°€ μΈμ¦λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κ³  μ—¬λŸ¬ 가지 이유둜 ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œλ§Œ ν•΄λ‹Ή 확인을 μ‹€ν–‰ν•˜κ³  μ‹Άλ‹€κ³  κ°€μ •ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. κ·Έ 쀑 ν•˜λ‚˜λŠ” JWTλ₯Ό localStorage에 μ €μž₯ν•˜κ³  쿠킀에 μ €μž₯ν•˜κ³  싢지 μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
λ”°λΌμ„œ 이 경우 첫 번째 νŽ˜μ΄μ§€ λ‘œλ“œ μ‹œ λ‹€μŒμ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

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 둜 λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€

ComponentDidMount λ‚΄λΆ€μ˜ ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ 라이브러리인 mapbox-gl λͺ¨λ“ˆμ΄ ν•„μš”ν–ˆκ³  μΆ”μ•…ν•œ 였λ₯˜ ReferenceError: self is not defined

componentDidMount μ‚¬μš©ν•˜μ—¬ Mapboxλ₯Ό λ§Œλ“€ 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ ꡬ성 μš”μ†Œκ°€ μ—¬μ „νžˆ μ„œλ²„μ—μ„œ 처리λ₯Ό μ‹œλ„ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€(μ •ν™•νžˆ 무엇을 ν•˜λ €λŠ”μ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€). @elaich와 λ™μΌν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. ).

@aga5tya κ°€ μ œμ•ˆν•œ λŒ€λ‘œ Dynamic Imports λ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΈλ¦­μ„ μˆ˜ν–‰ν–ˆμŠ΅λ‹ˆλ‹€ πŸŽ‰.

@vanniewelt : λ™μ μœΌλ‘œ κ°€μ Έμ˜¨ 비동기 ꡬ성 μš”μ†Œκ°€ ν΄λΌμ΄μ–ΈνŠΈμ— λ‘œλ“œλ˜κ³  λͺ¨λ“  ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ 논리λ₯Ό 거기에 넣을 수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ ComponentWillReceiveProps 수λͺ… μ£ΌκΈ°λŠ” μ„œλ²„ μΈ‘μ—μ„œ propsμ—μ„œ μš”μ²­μ„ μˆ˜μ‹ ν•©λ‹ˆλ‹€.
이 λ³€μˆ˜κ°€ μžˆλŠ”μ§€ ν™•μΈν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό μ‚½μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

lib에 μ°½ λ³€μˆ˜κ°€ ν•„μš”ν•œ 경우 동적 κ°€μ Έμ˜€κΈ°λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

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

μ†”λ£¨μ…˜μ„ κ²€μƒ‰ν•˜λŠ” 이 μŠ€λ ˆλ“œλ₯Ό μ‹€ν–‰ν•œ μ‚¬λžŒλ“€μ„ μœ„ν•΄. μœ„μ— λ‚˜μ—΄λœ 동적 κ°€μ Έμ˜€κΈ° 링크가 μ†μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ—…λ°μ΄νŠΈλ˜μ—ˆμœΌλ©° Dynamic Imports μ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 항상 μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” ꡬ성 μš”μ†Œκ°€ 있고 동적 κ°€μ Έμ˜€κΈ°λ₯Ό μ‚¬μš©ν•˜κ³  싢지 μ•Šμ€ 경우(예: μ‚¬λžŒλ“€μ΄ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€λŠ” 사싀을 μžŠμ–΄λ²„λ¦΄ 수 있음) Hooks(λ˜λŠ” 이에 μƒμ‘ν•˜λŠ” 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>

λΈŒλΌμš°μ € API에 μ•‘μ„ΈμŠ€ν•˜λŠ” 라이브러리λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 SSR=falseλ₯Ό 두 번째 인수둜 μ‚¬μš©ν•˜μ—¬ λͺ¨λ“ˆμ„ λ™μ μœΌλ‘œ κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
const DynamicComponentWithNoSSR = dynamic( () => import('../components/hello3'), { ssr: false } )
https://nextjs.org/docs/advanced-features/dynamic-import

λΈŒλΌμš°μ € API에 μ•‘μ„ΈμŠ€ν•˜λŠ” 라이브러리λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 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. μš°λ¦¬λŠ” μ™œ μ‚¬μš©ν•΄μ•Ό typeof window !== 'undefined' λŒ€μ‹ μ˜ process.browser ? 더 μž₯ν™©ν•˜λ―€λ‘œ 여기에 μ΄μœ κ°€ μ—†μœΌλ©΄ process.browser λ₯Ό μ‚¬μš©ν•˜λŠ” 것을 μ„ ν˜Έν•©λ‹ˆλ‹€.
  2. λ‹€μŒμ— 기고자 λŒ“κΈ€μ„ νŽΈμ§‘ν•  λ•Œ νŽΈμ§‘ λ‚΄μš©μ„ λŒ“κΈ€μ— λͺ…ν™•ν•˜κ²Œ ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆκΉŒ? μš°μ„ , μ—¬κΈ°μ—μ„œμ™€ 같이 μŠ€λ ˆλ“œλ₯Ό ν˜Όλž€μŠ€λŸ½κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ—μ„œ λ‹€μŒ λŒ“κΈ€μ€ λ‚΄ νŠΉμ • λŒ“κΈ€μ— λŒ€ν•œ λ‹΅λ³€μž…λ‹ˆλ‹€. λ‘˜μ§Έλ‘œ, 그것은 λ‚΄κ°€ μ“΄ 것이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— μ˜€ν•΄μ˜ μ†Œμ§€κ°€ 있고 λ˜ν•œ μ‚¬λžŒλ“€μ΄ λ°˜μ‘μ„ λ³΄μ˜€μ„ λ•Œ 읽은 것이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

process.browser λŒ€μ‹  typeof window !== 'undefined'λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? 더 μž₯ν™©ν•˜λ―€λ‘œ 여기에 μ΄μœ κ°€ μ—†μœΌλ©΄ process.browserλ₯Ό μ‚¬μš©ν•˜λŠ” 것을 μ„ ν˜Έν•©λ‹ˆλ‹€.

process.browser λŠ” λΉ„ν‘œμ€€μ΄λ©° webpack ν™˜κ²½μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 즉, ν–₯ν›„ 쀑단될 κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ webpack 5λŠ” 더 이상 process 폴리필을 μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λŒ€ν•œ λŒ€μ•ˆ typeof window !== "undefined" 될 수 Object.prototype.isPrototypeOf(window) . κ·ΈλŸ¬λ‚˜ 이 κ²Œμ‹œλ¬Όμ„ 기반으둜 Next.jsμ—μ„œ μƒμ„±λœ λ²ˆλ“€μ€ 이전을 κ°μ§€ν•˜κ³  더 κ°€λ²Όμš΄ λ²ˆλ“€μ„ μƒμ„±ν•˜λŠ” λͺ¨λ“  것이 승리둜 κ°„μ£Όλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰