본문 바로가기

Next.js

Next.js 9-4 Script Optimization

  • Layout Scripts

  여러 경로에 대한 서드파티 스크립트를 로드하려면 next/script를 가져와 레이아웃 컴포넌트에 직접 스크립트를 포함한다.

// app/dashboard/layout.tsx

import Script from 'next/script';

export default function DashboardLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <>
      <section>{children}</section>
      <Script src="https://example.com/script.js" />
    </>
  )
}

  사용자가 폴더 경로(예: dashbaord/page.js) 또는 중첩된 경로(예: dashbaord/settings/page.js)에 액세스 하여 서드파티 스크립트를 가져온다. Next.js는 사용자가 동일한 레이아웃에서 여러 경로 사이를 탐색하더라도 스크립트가 한 번만 로드되도록 한다.

 

  • Application Scripts

  모든 경로에 대해 서드파티 스크립트를 로드하려면 next/script를 가져와 루트 레이아웃에 직접 스크립트를 포함한다.

// app/layout.tsx

import Script from 'next/script';

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en">
      <body>{children}</body>
      <Script src="https://example.com/script.js" />
    </html>
  )
}

  이 스크립트는 애플리케이션의 경로에 액세스 할 때 로드되고 실행된다. Next.js는 사용자가 여러 페이지를 탐색하더라도 스크립트가 한 번만 로드되도록 한다. 그리고 성능에 대한 불필요한 영향을 최소화하기 위해 특정 페이지나 레이아웃에만 타사 스크립트를 포함하는 것이 좋다.

 

  • Strategy

  next/script의 기본 동작을 통해 모든 페이지 또는 레이아웃에서 타사 스크립트를 로드할 수 있지만 전략 속성을 사용하여 로드 동작을 미세 조정할 수 있다.

beforeInteractive Next.js 코드 이전과 페이지 하이드레이션이 발생하기 전에 스크립트를 로드한다.
afterInteractive (default) 초기에 스크립트를 로드하지만 페이지에 일부 하이드레이션(Hydration: 정적 호스팅 혹은 서버사이드 렌더링을 통해 받은 HTML 웹 페이지를 동적인 웹페이지로 만드는 과정, 보통 이벤트 핸들러 같은 것들을 붙여서 동적인 웹페이지로 만듦) 이후에 로드한다.
lazyOnload 나중에 브라우저 유휴 시간 동안 스크립트를 로드한다.
worker (실험적) 웹 작업자에 스크립트를 로드한다.

 

  • Inline Scripts

  인라인 스크립트 또는 외부 파일에서 로드되지 않는 스크립트도 스크립트 컴포넌트에서 지원된다. 중괄호 안에 JavaScript를 배치하여 작성할 수 있다.

<Script id="show-banner">
  {`document.getElementById('banner').classList.remove('hidden')`}
</Script>

  또는 dangerlySetInnerHTML 속성을 사용하면 이렇다.

<Script
  id="show-banner"
  dangerouslySetInnerHTML-{{
    __html: `document.getElementById('banner').classList.remove('hidden')`,
  }}
/>

  Next.js가 스크립트를 추적하고 최적화하려면 인라인 스크립트에 id 속성을 할당하면 된다.

 

  • Executing Additional Code

  특정 이벤트가 발생한 후 추가 코드를 실행하기 위해 스크립트 컴포넌트와 함께 이벤트 핸들러를 사용할 수 있다.

onLoad 스크립트 로드가 완료된 후 코드를 실행한다.
onReady 스크립트 로드가 완료된 후 컴포넌트가 마운트될 때마다 코드를 실행한다.
onError 스크립트 로드되지 않은면 코드를 실행한다.

  이러한 핸들러는 next/script를 가져오고 "use client"가 코드의 첫 번째 줄로 정의된 클라이언트 컴포넌트 내부에서 사용하는 경우에만 작동한다.

// app/page.tsx

'use client'

import Script from 'next/script';

export default function Page() {
  return (
    <>
      <Script
        src="https://example.com/script.js"
        onLoad={() => {
          console.log('Script has loaded');
        }}
      />
    </>
  )
}

 

  • Additional Attributes

  nonce 또는 사용자 지정 데이터 속성과 같이 Script 컴포넌트에서 사용하지 않은 <script> 요소에 할당할 수 있는 많은 DOM 속성이 있다. 추가 속성을 포함하면 HTML에 포함된 최적화된 최종 <script> 요소에 자동으로 전달된다.

// app/page.tsx

import Script from 'next/script';

export default function Page() {
  return (
    <>
      <Script
        src="https://example.com/script.js"
        id="example-script"
        nonce="XUENAJFW"
        data-test="script"
      />
    </>
  )
}

'Next.js' 카테고리의 다른 글

Next.js 9-6 Static Assets  (0) 2023.06.14
Next.js 9-5 Metadata  (1) 2023.06.13
Next.js 9-3 Font Optimization  (0) 2023.06.08
Next.js 11-13 Routing Internationalization  (1) 2023.06.08
Next.js 11-12 Routing Project Organization File Colocation  (0) 2023.06.02