Автоимпорт всего 🚀

Раньше мы импортировали все эти компоненты в каждый .vue файл - импорт и регистрация их снова и снова становились утомительной задачей.

Затем замечательная команда Nuxt.js выпустила @nuxt/components для автоматического импорта компонентов проекта и сторонних библиотек 🚀 Больше импорта не потребовалось. Больше никакой регистрации компонентов.

Вот и все! Чистые проекты, чистые компоненты, чистые куски веб-пакетов.

Так я думал по крайней мере.

А как насчет Headless CMS?

В нашем диджитал-агентстве у нас есть куча проектов, использующих безголовые CMS - Storyblok в качестве одного из них. Storyblok дает разработчику и заказчику свободу вложения компонентов всеми возможными способами - динамически.

Поэтому мы хотели загружать компоненты динамически.

Неа.

На момент написания этой статьи это было невозможно - по крайней мере, с @nuxt/components из коробки (проблема № 43).

Поэтому я решил покопаться в коде - давайте посмотрим, как работает этот модуль Nuxt.js.

Похоже, что модуль получает компоненты на основе того, что передано в ловушку components:dirs.

Он подготавливает массив компонентов с их именами (PascalCase и kebab-case) и их относительными путями к файлам.

На втором этапе все .vue файлы будут просканированы для загрузки компонентов, используемых в данном шаблоне (и для импорта этих компонентов). Вот почему автоматический импорт динамического компонента вообще не работает.

Вернуться к корням - импортировать все эти компоненты вручную? Все из 14328 возможностей?

Ни за что!

Что ж, давайте попробуем выяснить, как мы можем решить эту проблему.

Основная магия

Хорошо: динамический компонент может быть отрисован, если мы передадим имя импортированного компонента vue или если мы передадим сам компонент. Помните: @nuxt/components знает все относительные пути для механизма автоматического импорта. Итак, если мы можем сделать динамический импорт веб-пакетов с этими путями доступным внутри компонента, мы сможем загрузить его дочерние элементы.

Плагин спешит на помощь

Мы можем подключиться к ловушке components:extend и получить все имена компонентов при построении модуля.

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

Это переводится примерно так:

Это было легко, амирит?

Увлажняйте все

Теперь можно выполнить внедренный асинхронный импорт для загрузки определенного компонента - для этого мы будем использовать vue-lazy-hydration (большое спасибо Маркусу Оберленеру).

После выполнения отложенного импорта загруженный компонент можно передать в: is prop. NuxtDynamic теперь можно использовать для автоматического импорта каждого динамического компонента.

Вот и все, у нас получилось! Nuxt.js автоматически импортирует динамические компоненты 🚀

Чистую и доработанную версию изложенной идеи можно найти на github и установить как пакет npm.

Официальную документацию для @blokwise/dynamic можно найти на сайте dynamic.blokwise.io.