Из документов:
Функция React.lazy
позволяет визуализировать динамический c импорт как обычный компонент.
React.lazy
принимает функцию, которая должна вызывать Динамо c import()
. Это должно вернуть Promise
, которое разрешается в модуль с экспортом по умолчанию, содержащим компонент React.
Затем ленивый компонент должен отображаться внутри компонента Suspense
, что позволяет нам показать некоторый запасной контент ( например, индикатор загрузки), пока мы ожидаем загрузки отложенного компонента.
Вы можете поместить компонент Suspense
в любом месте над отложенным компонентом. Вы можете даже обернуть несколько ленивых компонентов одним Suspense
компонентом.
Таким образом, если вы хотите использовать lazy()
для обертывания модуля, вы должны иметь компонент как свойство default
модуля. Поэтому он не позволит вам автоматически использовать модуль, который использует именованный экспорт в качестве компонента. Однако , вы можете легко сделать обещание, которое преобразует именованный экспорт в экспорт по умолчанию, и обернуть это ленивым:
// in comboModule.js:
export A from '../test/A'
export B from '../test/B'
// in the code that needs lazy modules
const A = lazy(() => import('./comboModule').then((module) => ({default: module.A})))
const B = lazy(() => import('./comboModule').then((module) => ({default: module.B})))
Обратите внимание, что мы должны вызвать import
внутри Функция инициализатора передана в lazy
, или импорт начнется немедленно. Преимущество lazy
в том, что он позволяет подождать, пока родительский компонент не отобразит отложенный компонент перед загрузкой. Однако import()
должен кэшировать результат первого импорта и загружать код только один раз.
В функции инициализатора мы используем then
для преобразования результата import()
из чего-то вроде Promise({A: <Component>, B: <Component>})
к тому, что ленивый ожидает от функции инициализатора: Promise({default: <Component>})
Теперь у нас есть два ленивых компонента, которые оба исходят из одного файла модуля.
Ресурсы: