@nsmp/js-api
v3.2.2
Published
Types for jsApi
Downloads
16
Keywords
Readme
jsApi
Пакет предназначен для разработчиков встроенных приложений и предоставляет инструменты для улучшения и оптимизации процесса разработки. Пакет предоставляет:
- Функцию
initializeJsApiдля подключенияjsApiв разных режимах (development,test,production);- Данная функция содержит проксирование, которое в зависимости от окружения создает объект
jsApi.- Каждое окружение содержит объект
jsApiсо своим интерфейсом, который преобразовывается в объект с общим интерфейсом, что позволяет при разработке ВП использовать единый интерфейс вне зависимости от окружения.- На текущий момент существует 3 окружения:
smp4- ВП встраивается в страницу устаревшегоGWT-интерфейса внутрьiframe,uiFrame- ВП встраивается в страницу новогоreact-интерфейса внутрьiframe,ui- ВП встраивается в страницу новогоreact-интерфейса какmicrofrontend.
- На текущий момент существует 3 окружения:
- Функция принимает объект настроек, который содержит свойства:
mock- для определенияmockобъектаjsApiдля локальной разработки;getContext- функция возвращает контекст приложения, если оно выведено какmicrofrontend;
- Каждое окружение содержит объект
- Данная функция содержит проксирование, которое в зависимости от окружения создает объект
- Функцию
getJsApiдля получения созданного объектаjsApi, если он создан, иначе выбрасывает ошибку, что объект не создан; - Функцию
removeJsApiдля удаления созданного объектаjsApi; - Хук
useInitializeJsApiдля подключенияjsApiвmicrofrontendприложении, использующемreact. При размонтировании приложения хук вызывает функциюremoveJsApi. Это необходимо, чтобы удалилсяsingleton-объектjsApiдля экономии памяти и смены контекста. - Файлы декларации типов
.d.tsдляjsApiпри работе сTypeScript; Mock-функцииjsApiдля локальной разработки, а также инструменты для их переопределения и уточнения;- Инструменты для локальной разработки с проксированием запросов к приложению.
Содержание
- Быстрый старт
- Инициализация и использование
jsApi - Типизация
jsApi - Переопределение методов
jsApi - Конфигурации
- Настройка проксирования запросов
Быстрый старт
- Установить пакет:
npm i @nsmp/js-api - Инициализировать
jsApiв проекте - Инициализация и использование jsApi - В режиме разработки (при необходимости):
- переопределить стандартные методы
jsApi- Переопределение методов jsApi - настроить проксирование запросов - Настройка проксирования запросов
- переопределить стандартные методы
Инициализация и использование jsApi
Инициализация jsApi зависит от того, в каком окружении будет использоваться ВП.
ВП будет использоваться во всех трех окружениях
Пример для ВП с использованием контекста:
Необходимо в корневом компоненте, обычно это App, вызвать хук useInitializeJsApi и передать в него контекст приложения.
Приложение как microfrontend - это react-компонент, который принимает контекст через props компонента.
Импорт хука и функций для работы с jsApi для react приложений осуществляется по пути @nsmp/js-api/react.
import {JsApiComponentProps, useInitializeJsApi, getJsApi} from '@nsmp/js-api/react';
const EmbeddedApp = () => {
const jsApi = getJsApi();
return (
<div>{jsApi.findApplicationCode()}</div>
)
};
const App = (props: JsApiComponentProps) => {
const {context} = props;
useInitializeJsApi({
getContext: () => context
});
return (
<EmbeddedApp />
);
};Пример использования с расширением методов jsApi через моки:
import {deepMergeJsApi, getJsApi, IJsApi, JsApiComponentProps, jsApiMock, useInitializeJsApi} from '@nsmp/js-api/react';
// @nsmp/partial-js-api - используется в качестве примера, в реальности пакет не существует
import {IPartialJsApi, partialApiMock} from '@nsmp/partial-js-api';
const EmbeddedApp = () => {
const jsApi = getJsApi<IJsApi & IPartialJsApi>();
return (
<div>{jsApi.findApplicationCode()}</div>
)
};
const App = (props?: JsApiComponentProps) => {
useInitializeJsApi<IPartialJsApi>({
// В режиме разработки методы из переменной `partialApiMock` переопределят методы `jsApi`, которые есть в библиотеке
mock: process.env.NODE_ENV !== 'production' ? partialApiMock : {}
});
return (
<EmbeddedApp />
);
};Объект mock это объект с таким же интерфейсом, как и объект jsApi в режиме production, но у него своя реализация методов под нужды разработки.
ВП будет использоваться в окружениях uiFrame и smp4
Пример:
import {initializeJsApi, getJsApi} from '@nsmp/js-api';
// В режиме `development` будут использоваться методы `jsApi`, которые определены в пакете @nsmp/js-api с помощью `mock` объекта
// Контекст берется автоматически из окружения, можно не передавать
initializeJsApi();
const jsApi = getJsApi();
jsApi.findContentCode();Или
import {initializeJsApi, IJsApi} from '@nsmp/js-api';
import {IMockApi, mockJsApi} from 'mocks/mockJsApi';
// В режиме `development` методы из переменной mockJsApi переопределят методы `jsApi`, которые есть в библиотеке
initializeJsApi<IMockApi>({mock: mockJsApi});
const jsApi = getJsApi<IJsApi & IMockApi>();
jsApi.findContentCode();Типизация jsApi
Пакет предоставляет типы для методов jsApi в TypeScript:
JsApi- включает все методыjsApi. Требует указания всех методов пакета, заменяя их новымиPartialJsApi- также включает все методы, но позволяет переопределять только необходимые, оставляя остальные без изменений
Типизация собственных моков
Если нужно создать моки с частичным переопределением функций, а затем передать их в initializeJsApi, следует использовать тип PartialJsApi при создании моков.
Пример:
import {PartialJsApi} from '@nsmp/js-api';
const mock: PartialJsApi = {
extractSubjectUuid () {
return 'subjectUuid$123';
},
findContentCode () {
return 'contentCode';
},
}
initializeJsApi(mock)Переопределение методов jsApi
В пакете есть возможность переопределить стандартные методы. Для этого необходимо создать переменную в проекте, которая будет хранить новые значения методов jsApi, например:
import {PartialJsApi} from '@nsmp/js-api';
// При работе с TypeScript указан тип PartialJsApi
const mockJsApi: PartialJsApi = {
extractSubjectUuid () {
return 'subjectUuid$123';
},
findContentCode () {
return 'contentCode';
},
getCurrentUser () {
return {
uuid: 'user$123'
};
},
urls: {
objectCard: (uuid: string) => `/${uuid}`
}
};При работе с TypeScript переменной с моковыми методами jsApi можно указать тип PartialJsApi из данного пакета - Типизация jsApi
Конфигурации
typescript для работы ВП
Для корректной работы react приложений необходимо в файле tsconfig.json добавить настройку:
{
"compilerOptions": {
"moduleResolution": "bundler"
}
}Это необходимо, чтобы путь @nsmp/js-api/react воспринимался компилятором
typescript для jest
moduleResolution: "bundler" нельзя использовать с ts-jest — он не поддерживает этот режим. Для корректной работы jest необходимо создать новый файл конфигурации, например, tsconfig.test.json. В файле tsconfig.test.json добавить настройку:
{
"compilerOptions": {
"moduleResolution": "node"
}
}jest
Хук useInitializeJsApi использует подключение react. Т.к. react не устанавливается в этом пакете, то он использует пакет из внешнего приложения.
При работе с jest может возникать ошибка, что в этом пакете нет react.
Для исправления проблемы нужно добавить настройку в файл jest.confing.js:
module.exports = {
moduleNameMapper: {
'^react$': require.resolve('react')
}
}Для подключения нового файла конфигурации, например, tsconfig.test.json нужно добавить настройку в файл jest.confing.js:
module.exports = {
transform: {
'^.+\\.[t|j]sx?$': ['ts-jest', {
tsconfig: 'tsconfig.jest.json'
}]
}
}Настройка проксирования запросов
Пакет имеет возможность проксирования запросов в режиме локальной разработки приложения. Чтобы проксирование запросов работало правильно, необходимо создать файл dev.env и определить переменные окружения:
ACCESS_KEY- ключ доступа для REST запросовAPP_URL- URL стендаAPP_CODE- код ВПCONTENT_CODE- код контента, на котором выведено ВПREST_PATH- путь REST запроса (rest или earest)SUBJECT_UUID- идентификатор объекта, на котором выведено ВПUSER_LOGIN- логин пользователяUSER_UUID- идентификатор пользователя
Пример:
ACCESS_KEY=your-access-key
APP_URL=https://your-domain.ru/
APP_CODE=app_code
CONTENT_CODE=content_code
REST_PATH=earest
SUBJECT_UUID=subject$123
USER_LOGIN=your_login
USER_UUID=user$123Также необходимо изменить строку запуска dev режима приложения в файле package.json, например:
- Было -
"dev": "cross-env NODE_ENV=development webpack serve --mode=development --config ./webpack/config.js" - Стало -
"dev": "cross-env NODE_ENV=development start-webpack-server --mode=development --config ./webpack/config.js --env ./dev.env"
config и env являются опциональными аргументами командной строки. Если они не указаны по стандарту будут браться пути:
config-./webpack/config.jsenv-./dev.env
Команда start-webpack-server запускает webpack server с добавленным в него проксированием запросов и всеми переменными окружения из файла dev.env
