Есть несколько преимуществ преобразования вашего приложения Vue.js в микрофронтенды. С помощью микрофронтендов вы можете безболезненно поэтапно заменить устаревший код, мигрировать технический стек, повторно использовать код с низкой связанностью, а также самое главное: дать возможность нескольким командам работать над одним и тем же продуктом, но в разных кодовых базах ( прощай сливай ад!).

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

Создание проекта Vue.js

Очевидно, я делаю это просто для того, чтобы использовать проект в качестве примера. Вам не нужно этого делать, если у вас уже есть проект Vue.js.

$ yarn global add @vue/cli
$ vue create ragu-vue-test-app

Все установлено по умолчанию…

🎉  Successfully created project ragu-vue-test-app.
👉  Get started with the following commands:
$ cd ragu-vue-test-app
$ yarn serve

У нас есть приложение Vue.js, работающее на порту 8080.

Настройка сервера Ragu

Чтобы представить ваши компоненты Vue.js как микроинтерфейсы, вам нужен экземпляр Ragu Server. Ragu Server отвечает за создание и раскрытие ваших микроинтерфейсов с помощью рендеринга на стороне сервера (SSR).

$ yarn add ragu-server ragu-vue-server-adapter webpack-merge

Также нам нужно добавить несколько скриптов для запуска Ragu Server в package.json.

  • ragu:build для создания производственной сборки.
  • ragu:start для запуска рабочего сервера с использованием результата сборки.
  • ragu:dev для запуска сервера разработки. Нет необходимости собирать проект перед запуском сервера разработки.
"scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint",
    "ragu:build": "ragu-server build ragu-config.js",
    "ragu:start": "ragu-server run ragu-config.js",
    "ragu:dev": "ragu-server dev ragu-config.js"
  },

Нам также нужен файл с именем ragu-config.js для объявления конфигурации Ragu Server.

Предоставление компонента как микроинтерфейса

Вы помните красивый экран приветствия Vue.js, который мы видели выше? Это будет компонент, который мы будем выставлять. Нам понадобится каталог с именем ragu-components, как определено в config.components.sourceRoot. Давайте назовем наш компонент hello-world, поэтому давайте создадим файл с именем ragu-components/hello-world/index.js.

Это все? Это работает? Давайте проверим это!

yarn ragu:dev

Для предварительного просмотра микро-интерфейса вы можете получить доступ к URL-адресу http://localhost:3101/preview/имя-каталога-ваших-компонентов. В нашем случае hello-world.

🌎 http://localhost:3101/preview/hello-world/

Использование микроинтерфейса Ragu

Хорошо, мы видим тот же экран приветствия Vue.js, но как мы можем использовать его в качестве микроинтерфейса?

Как видите, для использования микроинтерфейса все, что вам нужно, это добавить CDN RaguDOM на вашу HTML-страницу и добавить <ragu-component /> изменение URL-адреса компонента с /preview/ на /components/ . Если вы откроете приведенный выше HTML-код в своем браузере, вы увидите свой микроинтерфейс.

Получение свойств

Практически каждый компонент получает какие-то аргументы, микрофронтенды не исключение. Ваш микроинтерфейс должен иметь возможность получать свойства.

Во-первых, давайте изменим компонент App.vue, чтобы получить заголовок в качестве свойства.

Теперь нам нужно изменить наш ragu-components/hello-world/index.js, чтобы он получал и предоставлял реквизиты компоненту App.vue.

🌎 http://localhost:3101/preview/hello-world/?title=My%20Title

Рендеринг динамического состояния

Как я уже говорил ранее, Ragu Server предоставляет микроинтерфейсы с SSR. Итак, что, если вам нужно какое-то динамическое состояние для рендеринга ваших компонентов? Например, ответ на запрос?

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

Функция propsToState получает свойства микроинтерфейса и сопоставляет их с состоянием. Поскольку эта функция должна возвращать Promise, можно выполнить запрос или любой другой асинхронный процесс.

Теперь наш микро-интерфейс должен использовать состояние вместо свойств для рендеринга компонента Vue.js.

Использование CDN Vue.js

Я предполагаю, что вы хотите выставить кучу компонентов как микроинтерфейсы. Если вы сделаете это так, каждый микро-интерфейс Vue.js будет иметь Vue.js в своем комплекте. Я знаю, что вы не хотите, чтобы ваши пользователи загружали одну и ту же библиотеку много раз. Чтобы решить эту проблему, вы можете настроить сервер Ragu для использования CDN Vue.js, не добавляя его в пакет микро-интерфейса.

Можно определить defaultDependencies ваши микро-фронтенды.

  • nodeRequire представляет оператор require/importimport Vue from 'vue'.
  • dependency Зависимость для загрузки.
  • globalVariable Глобальная переменная, которую библиотека выставляет в браузере. Если вы загрузите страницу с CDN Vue.js и наберете Vue в консоли браузера, вы должны увидеть что-то вроде ниже. Все импорты будут заменены этой переменной.

До и после настройки Vue CDN

ЖДАТЬ! ДО ИЗМЕНЕНИЯ БЫЛО ЗАГРУЖЕНО 81,6 КБ JAVASCRIPT, А НЕ 103 КБ. КАКАЯ ОПТИМИЗАЦИЯ! 😡😡

Webpack удаляет неиспользуемый код из пакета, ожидается, что CDN Vue.Js будет тяжелее. Немного математики: если вы загрузите два микрофронтенда одинакового размера, вы получите 90,5+12,5 + 12,5 = 115,5 КБ. Если вы не установили зависимости по умолчанию: 81,3 * 2 = 162,6 КБ. 😀

Пример репозитория



Другие ссылки