스크립트 최적화
레이아웃 스크립트
여러 경로에 서드파티 스크립트를 로드하려면 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 DashboardLayout({ children }) {
return (
<>
<section>{children}</section>
<Script src="https://example.com/script.js" />
</>
);
}
서드파티 스크립트는 사용자가 폴더 경로(예: dashboard/page.js
) 또는 중첩된 경로(예: dashboard/settings/page.js
)에 접근할 때 가져옵니다. Next.js는 사용자가 동일한 레이아웃 내에서 여러 경로 사이를 이동하더라도 스크립트가 한 번만 로드되도록 보장합니다.
애플리케이션 스크립트
모든 경로에 서드파티 스크립트를 로드하려면 next/script
를 가져와서 루트 레이아웃에 직접 스크립트를 포함시키세요:
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>
);
}
import Script from "next/script";
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>{children}</body>
<Script src="https://example.com/script.js" />
</html>
);
}
이 스크립트는 애플리케이션의 어떤 경로에 접근해도 로드되고 실행됩니다. Next.js는 사용자가 여러 페이지 사이를 이동하더라도 스크립트가 한 번만 로드되도록 보장합니다.
권장사항: 불필요한 성능 영향을 최소화하기 위해 서드파티 스크립트를 특정 페이지나 레이아웃에만 포함하는 것을 권장합니다.
전략
next/script
의 기본 동작은 모든 페이지나 레이아웃에서 서드파티 스크립트를 로드할 수 있게 해주지만, strategy
속성을 사용하여 로딩 동작을 세부 조정할 수 있습니다:
beforeInteractive
: Next.js 코드와 페이지 하이드레이션이 발생하기 전에 스크립트를 로드합니다.afterInteractive
: (기본값) 페이지에서 일부 하이드레이션이 발생한 후 일찍 스크립트를 로드합니다.lazyOnload
: 브라우저 유휴 시간 동안 나중에 스크립트를 로드합니다.worker
: (실험적) 웹 워커에서 스크립트를 로드합니다.
각 전략과 그 사용 사례에 대해 자세히 알아보려면 next/script
API 참조 문서를 참조하세요.
웹 워커로 스크립트 오프로딩 (실험적)
경고:
worker
전략은 아직 안정화되지 않았으며app
디렉토리에서는 아직 작동하지 않습니다. 주의해서 사용하세요.
worker
전략을 사용하는 스크립트는 Partytown을 사용하여 웹 워커로 오프로드되고 실행됩니다. 이는 메인 스레드를 애플리케이션 코드의 나머지 부분에 전념할 수 있게 하여 사이트의 성능을 향상시킬 수 있습니다.
이 전략은 아직 실험적이며 next.config.js
에서 nextScriptWorkers
플래그가 활성화된 경우에만 사용할 수 있습니다:
module.exports = {
experimental: {
nextScriptWorkers: true,
},
};
그런 다음 next
를 실행하면(일반적으로 npm run dev
또는 yarn dev
) Next.js가 설치를 완료하는 데 필요한 패키지 설치를 안내합니다:
npm run dev
다음과 같은 지침이 표시됩니다: npm install @builder.io/partytown
을 실행하여 Partytown을 설치하세요.
설치가 완료되면 strategy="worker"
를 정의하면 애플리케이션에서 자동으로 Partytown을 인스턴스화하고 스크립트를 웹 워커로 오프로드합니다.
import Script from "next/script";
export default function Home() {
return (
<>
<Script src="https://example.com/script.js" strategy="worker" />
</>
);
}
import Script from "next/script";
export default function Home() {
return (
<>
<Script src="https://example.com/script.js" strategy="worker" />
</>
);
}
웹 워커에서 서드파티 스크립트를 로드할 때 고려해야 할 여러 가지 트레이드오프가 있습니다. 자세한 정보는 Partytown의 트레이드오프 문서를 참조하세요.
인라인 스크립트
외부 파일에서 로드되지 않은 인라인 스크립트도 Script 컴포넌트에서 지원됩니다. 중괄호 안에 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')`,
}}
/>
경고: Next.js가 스크립트를 추적하고 최적화할 수 있도록 인라인 스크립트에
id
속성을 할당해야 합니다.
추가 코드 실행
특정 이벤트가 발생한 후 추가 코드를 실행하기 위해 Script 컴포넌트와 함께 이벤트 핸들러를 사용할 수 있습니다:
onLoad
: 스크립트 로딩이 완료된 후 코드를 실행합니다.onReady
: 스크립트 로딩이 완료된 후와 컴포넌트가 마운트될 때마다 코드를 실행합니다.onError
: 스크립트 로딩에 실패한 경우 코드를 실행합니다.
이러한 핸들러는 next/script
가 가져와져서 "use client"
가 코드의 첫 번째 줄로 정의된 클라이언트 컴포넌트 내에서 사용될 때만 작동합니다:
"use client";
import Script from "next/script";
export default function Page() {
return (
<>
<Script
src="https://example.com/script.js"
onLoad={() => {
console.log("스크립트가 로드되었습니다");
}}
/>
</>
);
}
"use client";
import Script from "next/script";
export default function Page() {
return (
<>
<Script
src="https://example.com/script.js"
onLoad={() => {
console.log("스크립트가 로드되었습니다");
}}
/>
</>
);
}
각 이벤트 핸들러에 대해 자세히 알아보고 예제를 보려면 next/script
API 참조를 참조하세요.
추가 속성
Script 컴포넌트에서 사용되지 않는 nonce
나 사용자 정의 데이터 속성과 같은 많은 DOM 속성이 <script>
요소에 할당될 수 있습니다. 추가 속성을 포함하면 HTML에 포함된 최종 최적화된 <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"
/>
</>
);
}
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"
/>
</>
);
}