3

Frontend Micro Modules (FMM) [часть 1]

В данном посте я хочу рассказать о javascript библиотеке web-gambit, которая позволяет быстро и без проблем создавать удобные и легковесные клиентские typescript приложения. В основе этой библиотеки лежат инструменты, которые максимально лаконично позволяют реализовывать переиспользуемые клиентские микромодули, придерживаясь принципов "Clean architecture".


ВВЕДЕНИЕ


Основные отличия этого решения в том, что оно не требует сложной настройки модулей (например как  в webpack module federation), работает со всеми популярными клиентскими javascript библиотеками: React, Vue, Angular, Svelte, не требует специфических полифилов и плагинов, так и весит всего 5Кб... А с помощью встроенной CLI позволяет создавать реактивные приложения без каких либо сторонних фреймворков.

WEB-GAMBIT


В данном посте Мы рассмотрим реализацию FMM приложения исключительно силами web-gambit и web-gambit-cli с "чистого листа", но в дальнейшем обязательно добавим пост, о применении web-gambit со всеми популярными фреймворками. В примере мы будем использовать пакетный менеджер yarn.


И так, приступим:

1. Создадим и перейдем новую директорию в которой будем разворачивать наш проект:

Frontend Micro Modules (FMM) [часть 1] Javascript, Frontend, Длиннопост

2. Инициализируем файл проекта package.json и заполним все значения (в данном примере все свойства объявлены по умолчанию)

Frontend Micro Modules (FMM) [часть 1] Javascript, Frontend, Длиннопост

3. Добавим в зависимости проекта web-gambit и web-gambit-cli

Frontend Micro Modules (FMM) [часть 1] Javascript, Frontend, Длиннопост

После установки зависимостей, в терминале станет доступен инструмент web-gambit-cli. С помощью него, мы и развернем базовый шаблон FMM приложения:

Frontend Micro Modules (FMM) [часть 1] Javascript, Frontend, Длиннопост

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

Frontend Micro Modules (FMM) [часть 1] Javascript, Frontend, Длиннопост

Внутри директории src находятся уже традиционные директории для большинства фреймворков и библиотек:


components - внутри данной директории находятся общие переиспользуемые ui-компоненты нашего приложения.

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

routes - как несложно догадаться, внутри данной директории находятся файлы страниц приложения.

index.ts - Файл точка-входа приложения

routes.tsx - Файл конфигурации маршрутов приложения


Начнем изучение проекта с точки входа:

Frontend Micro Modules (FMM) [часть 1] Javascript, Frontend, Длиннопост

Как мы можем увидеть из примера, в index.ts мы импортируем метода-обертку приложения Module, и в виде  обратного вызова описываем логику монтирования нашего приложения.


Метод importModule асинхронно подключает наш микро модуль в приложение и с помощью метода executeModule выполняет его инициализацию.


Путь импорта `/assets/modules/demo/js/demo.js` указан не случайно, по умолчанию все модули из директории modules компилируются в виде bundle в данную директорию по следующей логике:  `/assets/modules/[имя модуля]/[js | css]/[имя модуля].[js | css]`

Теперь посмотрим на сам подключаемый микромодуль Demo

Frontend Micro Modules (FMM) [часть 1] Javascript, Frontend, Длиннопост

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


Стоит отметить, что все модули внутри директории modules должны быть объявлены как директория,  а файл точка модуля должен иметь название директории модуля.ts|tsx

В принципе ничего непонятного, посмотрим как же это все работает.


4. Запустим приложение в режиме разработки:

Frontend Micro Modules (FMM) [часть 1] Javascript, Frontend, Длиннопост

и перейдем в браузере на страницу приложения http://localhost:8800

Frontend Micro Modules (FMM) [часть 1] Javascript, Frontend, Длиннопост

как мы видим приложение было собрано и микромодули были подключены. Но как? ведь во вкладке 'Network' и фильтром 'js' файла module.js нет!

Frontend Micro Modules (FMM) [часть 1] Javascript, Frontend, Длиннопост

Не стоит удивляться или думать что файл собран внутри example.js! Переключаем фильтра на xhr/fetch и видим, что файл модуля был подгружен асинхронно и смонтирован в нужную ноду.

Frontend Micro Modules (FMM) [часть 1] Javascript, Frontend, Длиннопост

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


В следующем посте мы добавим примеры создания полноценного модуля, с компонентами, модулями сервисами и интеракторами. soon