本文档由 g2rain-appkit 的 docs/packages/README.md 自动同步生成。
# 包设计
包 核心职责 禁止包含
@g2rain/theme 设计变量、亮暗主题、基础样式、Element Plus 变量映射 Vue、Pinia、业务 API、qiankun
@g2rain/ui 通用 Vue 组件和组合式函数 应用 Store、路由、领域接口
@g2rain/http HTTP Client、序列化、签名、错误模型和通用拦截器 环境变量、具体 Token Store、登录跳转
@g2rain/platform 共享契约、Sub 生命周期、Main 协调端口、权限、Loading、主题切换、微应用通信协议 业务页面、具体领域 API、Main Shell Store

Main Shell 的生成 / 改造规范见中央 Main Shell 契约 (opens new window);本仓提供基于 /main + @g2rain/http 的 Main Shell 接入 与 AI Coding 提示词。

# 1. @g2rain/theme

主题包是纯样式基础设施。变量分为基础尺度、用途语义、UI 框架映射和必要的组件级变量。变量名表达用途,不表达某个主题下的具体颜色。

建议结构:

packages/theme/src/
├─ styles.css
├─ tokens.css
├─ base.css
├─ element-plus.css
└─ themes/
   ├─ light.css
   └─ dark.css

styles.css 是默认入口并同时包含亮色和暗色选择器。CSS 通过明确的子路径导出,并声明 sideEffects: ["**/*.css"]。主题包不提供修改 DOM 的 JavaScript 入口。

# 2. @g2rain/ui

当前已公共化的组件:

类别 组件
基础交互 QueryForm、SortableTable、TableColumn、SortDialog、SortManagerButton
远程选择 RemoteSelect、ApiSelect
平台数据(@g2rain/ui/platform) OrganSelect、DictSelect、DictText、StatusSwitch

UserSelect 尚未实现,后续沿用 EntityDataProvider 契约;详见平台数据组件。

公共组件不得导入应用 Store、路由、国际化实例、领域 API 或目录别名。外部能力通过 Props、事件、Slots、Provider 或函数参数传入。通用入口通过 G2rainUi 注入 Translator 和 Locale。组织与字典 Provider 只由 @g2rain/ui/platform 的 G2rainPlatformUi 注入。

首批组件采用逐文件规范基准,不直接复制某一个应用的整个目录;公开 API、基准来源和分叉处理见首批组件基准与公开契约。

<RemoteSelect :fetch-data="userApi.search" />
<script setup lang="ts">
import { OrganSelect, DictText } from '@g2rain/ui/platform'
</script>

<template>
  <OrganSelect v-model="form.organId" />
  <DictText :value="row.status" usage-code="member_status" />
</template>

设计要求:

  • 样式只使用 G2rain 语义变量。
  • 支持按需导入,不在模块加载时注册全局监听。
  • 事件和异步行为具有明确类型。
  • 可取消的异步请求在卸载时释放。

# 3. @g2rain/http

HTTP 包提供 Client 工厂、参数序列化、通用签名、可组合拦截器和错误标准化。它不读取 import.meta.env,也不决定登录跳转和 UI 提示。

const { client, dispose } = createHttpClient({
  baseURL: runtimeConfig.apiBaseUrl,
  authSessionProvider: () => accessTokenStore.session,
  ensureAccessToken: options => accessTokenStore.ensure(options),
  authErrorHandler: (reason, error) => authService.handleFailure(reason, error),
  getLocale: () => localeStore.locale,
})

刷新令牌应合并并发请求,重试必须有明确上限并防止认证失败循环。包负责标准化错误,提示、跳转和上报由应用决定。应用侧的 Client 单例表、Mock 数据和环境 URL 计算留在装配层。

工厂参数、错误模型和认证行为的生成契约见 HTTP 与 Runtime 契约。

# 4. @g2rain/platform

Platform 是前端应用运行与主子协作 SDK。包根只导出 RuntimeContext、RuntimeMessage 和 PlatformError,顶层不导入 Vue。/sub 提供 createSubPlatform 和 createStandardSubPlatform。Theme、Loading、Permission、Micro App、I18n、Error 和 HTTP 都是可单独导入的 Capability;HTTP 入口不依赖 @g2rain/http。

packages/platform/src/
├─ contract/
├─ kernel/          # 不进入 exports
├─ sub/
├─ main/
├─ permission/
├─ loading/
├─ theme/
├─ micro-app/
├─ i18n/
├─ error/
├─ http/
└─ index.ts

公开子路径:.、./sub、./main、./theme、./micro-app、./permission、./permission/vue、./loading、./i18n、./i18n/vue-i18n、./error、./http。不提供 /core 或 /vue。

createSubPlatform 仍只接受 capabilities 数组。createStandardSubPlatform 强制组合 I18n 和 Error,其他能力由调用方追加。g2rain-member-app 已用标准 Preset 接入 /sub,由应用组合根继续创建 Vue、Pinia、Router、HTTP 和 qiankun 生命周期;Main Shell 尚未接入 /main。./permission 不导入 Vue;插件在 ./permission/vue。vue 与 vue-i18n 都是可选 peer。包根、/main、/sub、/permission、/i18n、/error 和 /http 不导入 Vue。

每项能力应可独立使用;所有全局监听 API 都应返回释放函数。具体 Store、消息 Processor 与 qiankun Props 读取仍由应用维护。详见 Platform 前端应用运行与主子协作方案。

# 5. 公开 API 原则

  • 消费方只从 package.json#exports 声明的入口导入。
  • 每个公开符号都有稳定类型定义。
  • 包的 JavaScript 入口不产生非预期全局副作用。
  • 新能力优先以小型、可组合的函数或接口提供。
  • 包之间不得从对方的 src 或 dist 内部路径导入。
  • 应用在组合根装配各包;http 与 platform 为并行能力,不形成包级硬依赖。