JavaScript

Отложенная загрузка компонентов во Vue 3

Spread the love

Перевод: Justin BrooksLazy loading components in Vue 3

При создании любого веб-приложения очень важна быстрая скорость загрузки страниц. Несколько дополнительных секунд могут иметь огромное влияние на количество пользователей, посещающих ваш сайт. Это означает, что наличие быстрой загрузки сайта важно не только для хорошего рейтинга в поисковой системе Google, но и для взаимодействия пользователей с вашей веб-страницей.

Vue 3 представил несколько новых функций, которые помогут вам легко достичь этого за счет улучшений API асинхронного компонента и нового компонента Suspense. В этой статье мы рассмотрим использование компонентов отложенной загрузки в Vue 3, чтобы ускорить загрузку ваших страниц.


Посмотрите видео на YouTube, для которого была создана эта статья (English):


В этом примере приложения у нас есть компонент SecretImage, который отображает интерактивную графику логотипа Vue только тогда, когда пользователь аутентифицирован. Чтобы злоумышленники не увидели наш самый ценный актив, мы добавили кнопку, которая переключает видимость этого компонента.

<template>
  <!-- ... -->
  <!-- Large component that uses many libraries -->
  <SecretImage v-if="isLoggedIn" />
  <!-- ... -->
</template>

<script>
import SecretImage from './components/SecretImage.vue'

export default {
  components: { SecretImage }
  // ...
}
</script>

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

Асинхронные компоненты

Мы можем использовать новую функцию defineAsynComponent, которая поставляется с Vue 3. Все, что нам нужно сделать, это передать функцию, которая загружает наши компоненты. Поскольку Vue поставляется с предварительно настроенным webpack, мы можем использовать функцию динамического импорта.

<template>
  <!-- ... -->
  <SecretImage v-if="isLoggedIn" />
  <!-- ... -->
</template>

<script>
import { defineAsyncComponent } from 'vue'
const SecretImage = defineAsyncComponent(() =>
  import('./components/SecretImage.vue')
)

export default {
  components: { SecretImage }
  // ...
}
</script>

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

Вернувшись в систему, мы также видим, что создается новый запрос на загрузку нашего компонента SecertImage.

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

import { defineAsyncComponent } from 'vue'
import Loading from './components/Loading.vue'

const SecretImage = defineAsyncComponent({
  loader: () => import('./components/SecretImage.vue'),
  loadingComponent: Loading
})

Однако использование этого подхода может быть ограниченым, так как сложно передать props или slots в загружаемый компонент.

Suspense

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

<template>
  <!-- ... -->
  <Suspense v-if="isLoggedIn">
    <template #default>
       <SecretImage />
    </template>
    <template #fallback>
       <Loading />
    </template> 
  </Suspense>
  <SecretImage v-if="isLoggedIn" />
  <!-- ... -->
</template>

<script>
import { defineAsyncComponent } from 'vue'
import Loading from './components/Loading.vue'

const SecretImage = defineAsyncComponent(() =>
  import('./components/SecretImage.vue')
)

export default {
  components: { SecretImage, Loading  }
  // ...
}
</script>

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


Спасибо за прочтение!

Была ли вам полезна эта статья?
[8 / 2.8]

Spread the love
Editorial Team

View Comments

  • Скажите, а если я хочу загрузить компонент из файла с расширением js, а не vue, то я не смогу это сделать? Или есть возможность использовать динамическую загрузку js файлов с компонентами?

Recent Posts

Vue 3.4 Новая механика v-model компонента

Краткий перевод: https://vuejs.org/guide/components/v-model.html Основное использование​ v-model используется для реализации двусторонней привязки в компоненте. Начиная с Vue…

4 месяца ago

Анонс Vue 3.4

Сегодня мы рады объявить о выпуске Vue 3.4 «🏀 Slam Dunk»! Этот выпуск включает в…

4 месяца ago

Как принудительно пере-отобразить (re-render) компонент Vue

Vue.js — это универсальный и адаптируемый фреймворк. Благодаря своей отличительной архитектуре и системе реактивности Vue…

1 год ago

Проблемы с установкой сертификата на nginix

Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с…

1 год ago

Введение в JavaScript Temporal API

Каким бы ни было ваше мнение о JavaScript, но всем известно, что работа с датами…

1 год ago

Когда и как выбирать между медиа запросами и контейнерными запросами

Все, кто следит за последними событиями в мире адаптивного дизайна, согласятся, что введение контейнерных запросов…

1 год ago