Что такое разделение кода?

Разделение кода  —  это разбиение кода на различные пакеты или компоненты, которые впоследствии могут быть загружены по требованию или параллельно.

По мере развития приложения увеличивается объем кода его пакетов. В какой-то момент этот объем вырастет настолько, что приложение начинает загружаться слишком долго. Это приводит к ухудшению пользовательского опыта в целом и показателей 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;

CodeSandbox

Заключение

Динамический импорт модулей уменьшает размер начального пакета. Это позволяет снизить начальную нагрузку, поскольку клиенту не нужно загружать и выполнять сразу несколько модулей, экономя пропускную способность.

Если вы лениво загружаете компонент, который необходим для первоначального рендеринга, это может привести к неоправданному увеличению времени загрузки. Старайтесь загружать только те компоненты, которые не видны при первоначальном рендеринге.

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Jayesh bhade: Code Splitting in Next Js

Предыдущая статьяКак создать Chrome-расширение для приложения с прогнозом погоды
Следующая статьяПревращаем субъективные понятия в объективные метрики: простая методика