Что такое разделение кода?
Разделение кода — это разбиение кода на различные пакеты или компоненты, которые впоследствии могут быть загружены по требованию или параллельно.
По мере развития приложения увеличивается объем кода его пакетов. В какой-то момент этот объем вырастет настолько, что приложение начинает загружаться слишком долго. Это приводит к ухудшению пользовательского опыта в целом и показателей SEO в частности.
Разделение кода дает много преимуществ:
- Ускорение загрузки и рендеринга контента сайта.
- Сокращение временного промежутка между запросом пользователя и получением результата, т.е. времени интерактивности.
- Снижение скорости, с которой пользователи покидают веб-страницу, не взаимодействуя с сайтом.
- Повышение конверсии сайта.
Как импортировать компонент?
// для экспорта по умолчанию
import AppComponent from ‘./AppComponent’;
// для именованного экспорта
import { OtherComponent } from './AppComponent';
Как выполнить динамический импорт в React?
import React from 'react';
// для экспорта по умолчанию
const DynamicComponent = React.lazy(() => import('./AppComponent'));
React.lazy пока поддерживает только экспорт по умолчанию. Если модуль, который нужно импортировать, использует именованные экспорты, создайте промежуточный модуль, и он проведет реэкспорт по умолчанию.
Как выполнить динамический импорт в Next js?
import dynamic from 'next/dynamic';
// для экспорта по умолчанию
const DynamicComponent = dynamic(() => import('../AppComponent'));
// для именованного экспорта
const DynamicComponent = dynamic(() => import('../AppComponent').then((AppComponent) => AppComponent.OtherComponent));
Модуль next/dynamic реализует ленивую загрузку импорта компонентов React и является расширением React.lazy .
Что показывать пользователю между импортом компонента и его отображением?
Если вы работаете с последней версией React.js, то можно использовать suspense:
import { Suspense } from 'react';
import dynamic from 'next/dynamic';
import Loader from './Loader';
const DynamicComponent = dynamic(() => import('../AppComponent'), { suspense: true });
export default function App() {
return (
<Suspense fallback={<Loader />}>
<DynamicComponent />
</Suspense>
)
}
Просто установите значение атрибута suspense как true. Страница сначала отобразит fallback Suspense, а затем, когда граница Suspense будет разрешена, — DynamicComponent.
При работе на более старой версии React.js можно использовать атрибут
loading.
const AppComponent = dynamic(() => import('../AppComponent'),{
loading: () => <Loader />,
})
Для рендеринга компонентов на стороне клиента можно отключить рендеринг на стороне сервера (SSR) для компонентов, которые не требуют усиленного взаимодействия с пользователем или имеют внешние зависимости. Для рендеринга на стороне клиента значение атрибута ssr можно установить как false.
const AppComponent = dynamic(() => import('../AppComponent'),{
ssr: false,
})
Внешние зависимости иногда бывают очень большими. Помимо импорта локальных компонентов, можно добавить динамический импорт для внешних зависимостей. Например, здесь я импортировал dayjs динамически в функцию onClick.
const dayjs = (await import("dayjs")).default;
Заключение
Динамический импорт модулей уменьшает размер начального пакета. Это позволяет снизить начальную нагрузку, поскольку клиенту не нужно загружать и выполнять сразу несколько модулей, экономя пропускную способность.
Если вы лениво загружаете компонент, который необходим для первоначального рендеринга, это может привести к неоправданному увеличению времени загрузки. Старайтесь загружать только те компоненты, которые не видны при первоначальном рендеринге.
Читайте также:
- Nexus — новый визуализатор дерева компонентов для Next.js
- Как создать NFT-маркетплейс с полным стеком
- Обзор текущего состояния Next.js Router
Читайте нас в Telegram, VK и Дзен
Перевод статьи Jayesh bhade: Code Splitting in Next Js





