Skip to content

Host-модули (external packages)

Frontend target extension собирается как ES library. Зависимости хоста не попадают в bundle — вместо этого используются host shims: виртуальные модули, которые в runtime читают singleton из registerExtensionHostModules.

Whitelist (register-host-modules.ts)

Хост регистрирует модули в apps/frontend/src/shared/extensions/register-host-modules.ts:

SpecifierНазначение
vueVue 3 runtime
vue-routerRouter
vue-i18ni18n
primevuePrimeVue barrel
@primevue/coreCore API
@primevue/core/apiPrimeVue API helpers
@primevue/formsForms
@primevue/forms/resolvers/zodZod resolver
@primeuix/themesThemes
primeiconsIcons (stub)
axiosHTTP client
lodash-esUtilities
@artiroute/extension-sdkSDK barrel
@artiroute/extension-sdk/extensionExtension API
@artiroute/extension-sdk/hostHost API
@artiroute/host/apiREST/GraphQL/uploads с BASE_URL
@artiroute/host/authAuth providers
@artiroute/host/settingsExtension settings
@artiroute/host/ai-providersAI provider registry

@artiroute/host/api

Используйте для любых browser-side вызовов backend (кроме auth routes — см. @artiroute/host/auth):

МетодНазначение
withAppBase(path)Путь приложения с учётом BASE_URL
getGraphqlUrl()URL GraphQL endpoint
getExtensionApiUrl(extensionId, path)REST prefix /api/ext/{id}/...
resolvePublicFileUrl(pathOrUrl)URL файла/аватара с /uploads/ и base
fetchGraphql(query, variables?)POST GraphQL с cookie и Bearer token

Subpath imports (catch-all)

Импорты вида primevue/tag, @primevue/core/api резолвятся через catch-all plugin @artiroute/extension-build:

ts
// HOST_SUBPATH_PREFIXES
'primevue';
'@primevue/core';
'@primevue/forms';
'@artiroute/extension-sdk';

При сборке extension Vite генерирует shim, который в runtime вызывает resolveHostSubpathModule и достаёт export из namespace хоста.

Не нужно регистрировать каждый subpath вручную, если prefix уже в списке.

Что бандлится

Любой npm-пакет вне whitelist попадает в bundle extension:

ts
import { format } from 'date-fns'; // OK — будет в bundle
import { z } from 'zod'; // OK — будет в bundle (если используется в extension code)

Следите за размером bundle. Утилиты — да; UI-фреймворки — нет.

Как добавить новый host shim

Если extension нужен пакет, который уже есть в frontend host (например @vue-flow/core):

  1. Добавить import и запись в registerAnalystHelperExtensionHostModules() в register-host-modules.ts
  2. Если нужны subpath imports — добавить prefix в HOST_SUBPATH_PREFIXES (packages/extension-build/src/host-subpath-shim-plugin.ts)
  3. Пересобрать: pnpm extension-build:build
  4. Добавить peerDependencies в extension

Это изменение хоста — через PR, не только в extension.

Симптомы неправильных imports

СимптомПричина
Bundle > 100 KB для простого UIVue/PrimeVue попали в bundle
Failed to resolve import "primevue/..."Prefix не в HOST_SUBPATH_PREFIXES
Компоненты без стилейCSS PrimeVue не из хоста — см. Стили
Duplicate Vue instanceVue забандлен вместо shim
Cannot POST /api/... на демоХардкод /api/ без @artiroute/host/api — см. Troubleshooting

extension-build internals

  • ahExtensionHostSubpathShimPlugin — catch-all subpaths
  • ahRollupMergeExternalPlugin — external для host specifiers
  • hostShimAliases() — alias на packages/extension-build/shims/

Подробнее в packages/extension-build/README.md.

AI workspace для командных материалов и знаний