Оптимизация скриптов
Скрипты для всего приложения
Для загрузки стороннего скрипта на всех маршрутах импортируйте next/script и включите скрипт непосредственно в ваш кастомный _app:
import Script from 'next/script'
export default function MyApp({ Component, pageProps }) {
return (
<>
<Component {...pageProps} />
<Script src="https://example.com/script.js" />
</>
)
}Этот скрипт будет загружаться и выполняться при обращении к любому маршруту вашего приложения. Next.js гарантирует, что скрипт загрузится только один раз, даже если пользователь переходит между несколькими страницами.
Рекомендация: Мы рекомендуем включать сторонние скрипты только на конкретных страницах или в макетах, чтобы минимизировать влияние на производительность.
Стратегии загрузки
Хотя поведение next/script по умолчанию позволяет загружать сторонние скрипты на любой странице или в макете, вы можете точно настроить его поведение с помощью свойства strategy:
beforeInteractive: Загружает скрипт до любого кода Next.js и до гидратации страницы.afterInteractive: (по умолчанию) Загружает скрипт рано, но после частичной гидратации страницы.lazyOnload: Загружает скрипт позже, во время простоя браузера.worker: (экспериментально) Загружает скрипт в веб-воркере.
Обратитесь к документации next/script для получения подробной информации о каждой стратегии и случаях их использования.
Выгрузка скриптов в веб-воркер (Экспериментально)
Предупреждение: Стратегия
workerпока нестабильна и не работает сappдиректорией. Используйте с осторожностью.
Скрипты, использующие стратегию worker, выгружаются и выполняются в веб-воркере с помощью Partytown. Это может улучшить производительность вашего сайта, освободив основной поток для остального кода приложения.
Эта стратегия всё ещё экспериментальная и может использоваться только при включении флага nextScriptWorkers в next.config.js:
module.exports = {
experimental: {
nextScriptWorkers: true,
},
}Затем запустите next (обычно npm run dev или yarn dev), и Next.js проведёт вас через установку необходимых пакетов для завершения настройки:
npm run devВы увидите инструкции типа: Установите Partytown, выполнив npm install @builder.io/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')`,
}}
/>Важно: Для встроенных скриптов необходимо указать свойство
id, чтобы Next.js мог отслеживать и оптимизировать скрипт.
Выполнение дополнительного кода
С компонентом Script можно использовать обработчики событий для выполнения дополнительного кода после определённых событий:
onLoad: Выполняет код после завершения загрузки скрипта.onReady: Выполняет код после загрузки скрипта и при каждом монтировании компонента.onError: Выполняет код при ошибке загрузки скрипта.
Эти обработчики будут работать только при импорте next/script и использовании внутри Клиентского компонента, где первой строкой кода указано "use client":
import Script from 'next/script'
export default function Page() {
return (
<>
<Script
src="https://example.com/script.js"
onLoad={() => {
console.log('Скрипт загружен')
}}
/>
</>
)
}import Script from 'next/script'
export default function Page() {
return (
<>
<Script
src="https://example.com/script.js"
onLoad={() => {
console.log('Скрипт загружен')
}}
/>
</>
)
}Обратитесь к документации next/script для получения подробной информации о каждом обработчике событий и примеров.
Дополнительные атрибуты
Многие DOM-атрибуты, которые можно назначить элементу <script>, не используются компонентом Script, например nonce или пользовательские data-атрибуты. Любые дополнительные атрибуты автоматически передаются в итоговый оптимизированный элемент <script>, включённый в HTML.
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"
/>
</>
)
}