Выпуск собственных библиотечных проектов
Введение
Подключение UI сторонних проектов в прикладной web-проект
Любой web-проект на платформе Q.Palette может быть собран в виде npm-пакета (opens in a new tab). Такие npm-пакеты могут быть подключены в другой проект в виде зависимости и упакованы в собранном виде в каталог assets прикладного UI-микросервиса. При подключении библиотек сторонних проектов необходимо гарантировать, что все взаимодействия, которые происходят с UI подключаемой библиотеки, будут работать при её использовании в различных прикладных web-проектах, вне зависимости от фреймворка этого проекта.
Типы взаимодействий:
- Взаимодействие с бэкендом - в качестве бэкенда может выступать микросервис с именем, отличным от основного, но с теми же контрактами АПИ, поэтому необходимо предусмотреть параметризацию адреса вызовов АПИ с которыми происходит взаимодействие из данной UI-библиотеки
- Дополнительные параметры определяющие специфику работы данной библиотеки при подключении к произвольному прикладному проекту - контракты методов и событий, которые предоставляет UI-библиотека.
- Для использования библиотеки в прикладных проектах все контракты взаимодействия должны быть задокументированы. Рекомендуется использовать документацию в виде README.MD-файла в составе библиотеки.
Подключение UI-библиотеки в прикладной продукт
Подключаемая библиотека должна быть опубликована в доступный репозиторий в виде NPM-пакета.
При подключении библиотеки в прикладной продукт нужно:
- Добавить библиотеку нужной версии в зависимости web-проекта
- В контроллере инициализировать библиотеку необходимыми параметрами контекста прикладного проекта (если требуется)
- Доступные параметры контекста использования библиотеки определяются функционалом самой библиотеки и документируются в файле README.MD
- Взаимодействие с функционалом библиотеки осуществляется посредством передачи событий, как при взаимодействии с q-web-component. Функционал определяется самой библиотекой и документируется в README.MD
- В случае если функционал библиотеки взаимодействует с backend-сервисами необходимо предусмотреть возможность параметризации вызовов которые происходят из библиотеки.
Рекомендуется создавать дополнительный проект для библиотечного проекта и использовать его в основном проекте так же как npm-пакет. Это позволит вам выпускать более качественные пакеты, сразу же тестируя их на себе. Для того чтобы тестировать пакет локально, не выпуская beta-версии в nexus, используйте npm link (opens in a new tab).
Создание проекта библиотечного UI
Обновитесь до Q.Palette 5.3.12 и выше для работы этого функционала.
Имя нужно указывать в нижнем регистре в соответствии с сокращённым названием вашего проекта из QArcher! Примеры: qvrn, qbpm, qpuid...
Перейдите в корневую директорию вашего основного приложения (там, где angular.json) и выполните команду:
ng g app --style="scss" --routing=true --name="qname"
В корне появившегося проекта создайте файлpackage.json
:
{
"name": "@diasoft/qnameui-lib",
"version": "0.0.1",
"peerDependencies": {
"@angular/common": "^12.2.0",
"@angular/core": "^12.2.0",
"@diasoft/qpalette-visual": "^5.3.11"
}
}
Скопируйте зависимости вашего основного проекта в этотpackage.json
. В будущем здесь должны будут оказаться все зависимости этого библиотечного проекта. Старайтесь класть зависимости в peerDependencies и реже использовать dependencies.
Там же создайте файлREADME.MD
. В нём вы будете хранить инструкцию для использования вашего библиотечного проекта.
Превратите получившийся проект в Q.Palette-совместимый веб-компонент:
ng g @diasoft/qpalette-updater:qpalettize --name="qname"
В случае успешного завершения операции, в директории вашего проекта появится директория projects, внутри которой будет находиться ваш новый проект, который осталось превратить в npm-пакет.
Перейдите в angular.json
и установите префикс для компонентов вашего библиотечного проекта:
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"projects": {
"qname": {
"prefix": "qname"
}
}
}
Пометьте текущий проект как публичный
Для этого в поле lib-pbc
файла package.json
нужно указать название публикуемого проекта, команду для сборки и имя, под которым пакет будет опубликован:
"lib-pbc": [
{
"name": "qpalette-dev-portal",
"buildCommand": "npm run prod",
"publishedName": "@diasoft/qpalette-dev-portal-ui-lib"
},
...
]
name
- Название проекта, полученное на предыдущем этапе.buildCommand
- Команда для сборки проекта. В данном случае будет выполнена команда prod из разделаscripts
файлаpackage.json
.publishedName
- Имя пакета, под которым проект будет опубликован в npm. Должно удовлетворять шаблону: @diasoft/q*-ui-lib, где * - любой непустой набор символов.
Публикация
Перейдите в главныйpackage.json
, находящийся в корне (рядом сangular.json
) и добавьте в секцию scripts следующую запись:
{
"scripts": {
"lib-pbc": [
"qname"
]
}
}
Использование библиотечного проекта
Для использования библиотечного проекта в своём проекте, необходимо установить его как обычный npm-пакет:
npm i @diasoft/qnameui-lib
Откройтеangular.json
проекта, в который хотели бы встроить библиотечный проект, найдите блок assets и добавьте в него копирование всей файлов пакета@diasoft/ name.value ui-lib
в директорию assets вашего приложения:
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"projects": {
"YOUR_PROJECT_NAME": {
"architect": {
"build": {
"options": {
"assets": [
{
"glob": "**/*",
"input": "node_modules/@diasoft/qnameui-lib",
"output": "assets/qname"
}
]
}
}
}
}
}
}
В нужном месте вашего приложения, подключите модульQWebComponentModule
и следующий код:
<q-web-component
[endpoint]="endpoint"
bundleUrl="/api/SERVICE/COMPONENT/assets/qname/main.js"
></q-web-component>
Где SERVICE — ваш сервис, а COMPONENT — ваш компонент, куда встраивается библиотечный проект. Эту информацию можно найти в menu.json
endpoint = {
service: 'qname',
component: 'qname',
route: '',
caption: '',
properties: {
// Здесь можно передать какие-то параметры, необходимые для инициализации библиотечного проекта
}
};
В секцию properties можно передать какие-то данные. Для получения этих данных в библиотечном проекте, можно использовать
private initialProperties: {[k: string]: any} = QWebComponentModule.endpoint?.properties
Частный случай передачи properties — конфигурирование базового адреса API бэкенда. Разберём на примере:
{
"properties": {
"baseUrl": "/api/myService/myEndpoint"
}
}
Здесь мы задаём базовый адрес в properties. Получим его внутри библиотечного проекта и тут же конфигурируем QUrlService:
import { DoBootstrap, NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { QUrlService } from '@diasoft/qpalette-urls';
import { QWebComponentModule } from '@diasoft/qpalette-visual';
...
export class ApiUrlService extends QUrlService {
}
@NgModule({
declarations: [AppComponent],
imports: [
BrowserModule,
...
],
providers: [
{
provide: ApiUrlService,
useFactory: () => new QUrlService(
{
baseUrl: QWebComponentModule.endpoint?.properties?.baseUrl, // Базовый адрес api из properties
serviceName: 'myService' ,
}
)
}
],
bootstrap: []
})
export class AppModule implements DoBootstrap {
constructor(...) {
}
public ngDoBootstrap(): void {
...
}
}
Таким образом библиотечный проект будет обращаться к своему API в зависимости от его окружения.
Для передачи событий в библиотечный проект, используйте атрибут[data]
, а для получения —(events)
. Подробнее здесь