공부공부/Next.js 공식문서

[next.js 공식문서] 18. Script Optimization

고생쨩 2024. 3. 3. 21:51
728x90

next.js 13버전 때 학습내용 정리 문서로 현재와 다름 주의

Script Optimization

레이아웃 스크립트

// next/script 를 가져오고 구성요소에 직접 포함
import Script from 'next/script';
 
export default function DashboardLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <>
      <section>{children}</section>
      <Script src="https://example.com/script.js" />
    </>
  );
}

동일 레이아웃 내에선 한번만 로드됨.

애플리케이션 스크립트

모든 경로에 포함될려면 루트레이아웃에 포함함.
권장 : 성능에 불필요한 영향을 줄이기 위해 필요한 곳에서만 사용할 것

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>
  );
}

전략(strategy)

  • beforeInteractive: Next.js 코드 이전과 페이지 하이드레이션이 발생하기 전에 스크립트를 로드합니다.
  • afterInteractive: (기본값) 스크립트를 일찍 로드하지만 페이지에 일부 하이드레이션이 발생한 후에 로드합니다.
  • lazyOnload: 브라우저 유휴 시간 동안 스크립트를 나중에 로드합니다.
  • worker: (실험적) 웹 워커에서 스크립트를 로드합니다.
<Script
    src="https://example.com/script.js"
    strategy="beforeInteractive"
/>

웹 워커에 스크립트 오프로드 (실험적)

  • 아직 app 디렉토리에서 동작하지 않고 아직 안정적이지 않음
  • next.config.js에서 nextScriptWorkers 플래그가 활성화된 경우에만 사용할 수 있습니다:

웹 워커 추가 설명 : https://developer.mozilla.org/ko/docs/Web/API/Web_Workers_API
실제로 피그마 플러그인 제작 시 사용됨.

인라인 스크립트

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

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

또는 dangerouslySetInnerHTML 속성 사용

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

Script에 id 속성이 있어야 nextjs가 추적할 수 있음

추가 코드 실행

  • onLoad: 스크립트 로딩이 완료된 후 코드를 실행
  • onReady: 스크립트 로딩이 완료된 후 컴포넌트가 마운트될 때마다 코드를 실행
  • onError: 스크립트 로딩에 실패하면 코드를 실행
    "use client"를 선언하고 next/script를 import 하여 사용
'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');
        }}
      />
    </>
  );
}

추가 속성

nonce 또는 사용자 정의 데이터 속성 등 <script> 요소에 할당할 수 있는 추가 속성이 있음.

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"
      />
    </>
  );
}
  • nonce : CSP(컨텐츠 보안 정책)에서 XSS(Cross-site Scripting)을 방지하기 위해 사용 (잘 안 씀)

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.