inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Bắt đầu với Next.js (feat. phát triển dịch vụ bản đồ)

Tải Bản đồ Naver với next/script

궁금한 점이 있어요!

Đã giải quyết

537

qwer1234

6 câu hỏi đã được viết

1

const mapOptions = {
            ...,
            logoControlOptions: {
                position: naver.maps.Position.BOTTOM_LEFT,
            },
        };

제 생각에는 전역 컨텍스트에 naver 객체가 생성되어 접근이 가능 한 것 같은데,

전역 컨텍스트에 naver라는 객체가 생성되는 시점이 궁금합니다.. !

seo ssr ssg Next.js vercel csr

Câu trả lời 2

2

vroomfan

안녕하세요! 좋은 질문 감사합니다 :)

정확한 이해를 위해서 next.js 오픈 소스의 Script 컴포넌트에 대한 소스 코드를 해석하는 것이 좋습니다.
https://github.com/vercel/next.js/blob/canary/packages/next/src/client/script.tsx
위 링크는 next/script에 대한 소스 코드입니다.

1. 전역 변수 'naver' 객체가 생성되는 시점
Map.tsx 파일의 <Script> 에서 선언한 js 파일인

`https://openapi.map.naver.com/openapi/v3/maps.js?ncpClientId=${process.env.NEXT_PUBLIC_NCP_CLIENT_ID}`

가 load(다운로드 + 실행까지)된 이후부터 naver 객체가 생성됩니다.
next/script 소스 코드에서 'loadScript' 함수를 호출함으로써 네이버 map.js script를 불러오게 되는데, 소스코드 line 74와 line 129 등을 확인해보면 document.body.appendChild를 통해 script를 불러오는 로직을 실행한다는 것을 알 수 있습니다.

추가로, 'loadScript' 함수는 line 226의 useEffect 안에서 실행됩니다.

useEffect(() => { // script.tsx, line 226
    if (!hasLoadScriptEffectCalled.current) {
      if (strategy === 'afterInteractive') {
        loadScript(props)
      } else if (strategy === 'lazyOnload') {
        loadLazyScript(props)
      }

      hasLoadScriptEffectCalled.current = true
    }
  }, [props, strategy])

따라서 공식 문서(https://nextjs.org/docs/basic-features/script#strategy)에 적혀있듯 react hydration이 진행된 후 script를 불러온다는 것도 이해할 수 있습니다.

2. onReady 함수 실행 시점
이 역시 소스코드를 통해 확인할 수 있습니다.(강의와 공식 문서에 나온 설명만 이해하고 넘어가셔도 개발하는데 지장은 없습니다..! https://nextjs.org/docs/basic-features/script#executing-additional-code )
line 68과 line 217에서 각각 onReady()를 실행한다는 것을 확인할 수 있습니다.
line 68에 있는 onReady는 script가 최초로 'load'된 후 실행되며,(line 77 el.addEventListener('load', ...) 를 통해 'afterLoad' -> 'onReady' 함수가 호출됨)
line 217에 있는 onReady는 <Script>를 가진 컴포넌트가 mount될 때마다 실행됩니다.(useEffect 안에 있기 때문)
참고로, line 184를 보시면 긴 주석으로 더욱 자세한 설명이 되어있습니다.

답변과 소스 코드 살펴보시고 답변이 부족했다면 추가로 질문 부탁드립니다. 감사합니다!😇

1

qwer1234

감사합니다.

강의 내용이 너무 좋아서 회사 사람들에게 전파하고 있답니다 :)

앞으로도 좋은 강의 부탁드릴게요~!

1

qwer1234

next/script 컴포넌트에서 DOM에 스크립트를 추가하고 사용할 준비가 되면 onReady 함수가 실행이 되는 걸까요 ..?

API 라우터를 사용해야 하는 경우에 대해

1

148

1

키보드 어떤 거 사용하시나요

1

351

1

next.js 멀티플 런타임 관련해서 질문 올립니다..

1

358

2

아주 기초적인 질문입니다.

1

321

1

서버사이드 렌더링을 할 때, 서버는 어디에 있는 건가요?

1

1169

2

수업을 듣다가 SSR에 관하여..

1

551

2

interface 와 type

1

375

1

엘리맨트들의 자식관계가 어떻게 이렇게 되나 궁금합니다.

1

383

1

onLoad함수 (script태그의 onLoad X)

1

425

1

dynamic에 대한 질문

1

447

1

SSR vs SSG

1

476

2

NoSSR 관련한 질문입니다:)

1

375

1

a tag 질문 !

1

327

2

8분 20초 배포 관련

1

324

2

안녕하세요! 구글 서치 콘솔에 등록하는 도중 다음 오류가 뜹니다

0

2676

2

emotion styles 파일이 빌드시 경고로 뜹니다.

1

438

1

naver map 이 출력되지 않습니다.

1

481

1

페이지에 site맵 존재시 next Link는 csr 처럼 싹가져오게 되나요?

1

263

2

Failed to load resource: the server responded with a status of 404 ()

1

1033

2

VSCode 익스텐션 궁금합니다.

1

354

1

상태관리 질문 있습니다!

1

447

1

swr에 대한 질문입니다. (용어 관련)

1

372

1

swr 질문입니다!

1

336

1

안녕하세요. span 태그의 부모에 display: flex 를 적용하는데 왜 적용되는지 아무리 생각해도 이해가 되지 않아 질문드립니다.

1

678

2