spec.md 7.3 KB

# runtime-modes 规范

目的

定义 TvT.js 在普通项目模式、预览模式、单插件模式之间的切换方式,包括每种模式由哪些环境变量控制,以及这些变量如何影响路由和启动行为。

职责边界

本规范覆盖

  • 通过 .env、.env.predev、.env.predev.one 进行模式切换
  • FES_APP_PLUGINS 控制的行为
  • FES_APP_PREINDEX 控制的行为
  • FES_APP_PLSNAME 控制的行为
  • src/app.jsx 如何根据不同模式修改路由与启动逻辑
  • package.json 中模式脚本的职责边界
  • .fes.js、.fes.predev.js、.fes.predev.one.js 的项目约定映射
  • 预览相关远程菜单数据的加载条件

本规范不覆盖

  • 单个插件内部如何组织实现
  • 预览卡片字段设计
  • ZIP 打包格式细节
  • qiankun 或 uni-app 容器中的专属集成约束

主要代码依据

  • .env
  • .env.predev
  • .env.predev.one
  • package.json
  • src/app.jsx
  • src/common/utils.js
  • src/plugins/preview.vue
  • .fes.js
  • .fes.predev.js
  • .fes.predev.one.js

要求

Requirement: 模式预设与脚本映射

TvT.js 仓库 SHALL 通过环境变量预设与 package.json 脚本来定义运行模式,而不是通过临时修改业务代码切换模式。普通项目模式、预览模式、单插件模式 SHALL 分别由稳定的脚本入口与环境文件组合驱动。

Scenario: 普通项目模式脚本

  • GIVEN 维护者执行 yarn dev 或 yarn build
  • WHEN 未显式切换到 predev 或 predev.one
  • THEN 系统 SHALL 进入普通项目模式
  • AND 其默认行为应以 .env 与 .fes.js 为基础

Scenario: 预览模式脚本

  • GIVEN 维护者执行 yarn pre.dev 或 yarn pre.build
  • WHEN FES_ENV=predev
  • THEN 系统 SHALL 进入预览模式
  • AND 其行为应以 .env.predev 与 .fes.predev.js 为基础

Scenario: 单插件模式脚本

  • GIVEN 维护者执行 yarn pre.dev.one 或 yarn pre.build.one
  • WHEN FES_ENV=predev.one
  • THEN 系统 SHALL 进入单插件模式
  • AND 其行为应以 .env.predev.one 与 .fes.predev.one.js 为基础

Requirement: FES_ENV 与配置文件约定

TvT.js 项目 SHALL 将不同 FES_ENV 与配置文件的对应关系视为项目级运行约定:默认环境对应 .fes.js,predev 对应 .fes.predev.js,predev.one 对应 .fes.predev.one.js。维护者在调整脚本或环境配置时 SHALL 保持这组映射稳定。

Scenario: 维护脚本时保持映射稳定

  • GIVEN 维护者调整 package.json 中的运行脚本
  • WHEN 这些脚本继续代表普通、预览、单插件三种模式
  • THEN 其 FES_ENV 与配置文件的对应关系 SHALL 保持不变

Requirement: 普通项目模式行为

当 FES_APP_PLUGINS=false 时,系统 SHALL 将当前运行视为普通项目模式。在该模式下,系统 SHALL 不自动为 src/plugins/**/pages/**/*.vue 注册插件路由,并 SHALL 保持普通项目首页语义,不以预览中心替换默认首页。

Scenario: 普通项目模式不注入插件路由

  • GIVEN 当前环境中 FES_APP_PLUGINS=false
  • WHEN src/app.jsx 执行 patchRoutes
  • THEN 系统 SHALL 不自动追加 /plugins/... 路由集合

Scenario: 普通项目模式不替换为预览首页

  • GIVEN 当前环境中 FES_APP_PLUGINS=false
  • WHEN src/app.jsx 执行 modifyRoute
  • THEN 系统 SHALL 不以 src/plugins/preview.vue 替换根路由首页
  • AND 应保持普通项目模式下的默认首页语义

Requirement: 预览模式行为

当 FES_APP_PLUGINS=true 时,系统 SHALL 启用插件路由发现;当同时 FES_APP_PREINDEX=true 时,系统 SHALL 使用预览中心作为根首页。预览模式的目标是面向插件与案例展示,而不是普通业务项目首页。

Scenario: 预览模式发现插件页面

  • GIVEN 当前环境中 FES_APP_PLUGINS=true
  • WHEN src/app.jsx 扫描 ./plugins/**/pages/**/*.vue
  • THEN 系统 SHALL 根据受支持的页面层级注册 /plugins/<plugin>/... 路由

Scenario: 预览模式替换根首页

  • GIVEN 当前环境中 FES_APP_PREINDEX=true
  • WHEN src/app.jsx 执行 modifyRoute
  • THEN 根路径 / 的首页组件 SHALL 被替换为 src/plugins/preview.vue
  • AND 该首页的路由元信息 SHALL 标识为预览中心语义

Requirement: 单插件模式过滤

当设置 FES_APP_PLSNAME 时,系统 SHALL 将当前运行限定为指定插件的单插件模式。该模式下,插件页面发现、插件配置发现以及单插件构建输出 SHALL 共同围绕目标插件及其显式声明依赖进行过滤。

Scenario: 单插件模式过滤页面路由

  • GIVEN 当前环境中 FES_APP_PLSNAME='qiankunTvt'
  • WHEN src/app.jsx 进行页面扫描
  • THEN 系统 SHALL 仅保留 ./plugins/qiankunTvt/pages/ 下的页面参与路由注册

Scenario: 单插件模式过滤插件配置

  • GIVEN 当前环境中 FES_APP_PLSNAME='qiankunTvt'
  • WHEN src/common/utils.js 读取 PLS/*/config.js
  • THEN 系统 SHALL 仅保留 qiankunTvt 的插件配置进入当前配置集合

Scenario: 单插件模式过滤公共资源

  • GIVEN 当前环境中 FES_APP_PLSNAME='qiankunTvt'
  • AND qiankunTvt 在 config.require 中声明了依赖插件
  • WHEN 执行 yarn pre.build.one
  • THEN 构建流程 SHALL 仅复制目标插件及其声明依赖所需的公共资源目录

Requirement: 预览标签菜单设置加载条件

预览标签与徽标相关的 menuSetup 远程数据 SHALL 由 src/app.jsx 的启动前逻辑控制:当 FES_APP_PLUGINS=true 且处于开发环境时,或显式开启 FES_APP_ONLINE_API 时,系统 SHALL 调用 getMenu() 加载这类数据。该条件独立于是否处于单插件模式。

Scenario: 本地预览模式加载 menuSetup

  • GIVEN 当前处于开发环境
  • AND FES_APP_PLUGINS=true
  • WHEN 应用执行启动前初始化
  • THEN 系统 SHALL 调用 getMenu() 加载预览标签与徽标设置

Scenario: 普通项目模式不主动加载 menuSetup

  • GIVEN 当前环境中 FES_APP_PLUGINS=false
  • AND 未开启 FES_APP_ONLINE_API
  • WHEN 应用执行启动前初始化
  • THEN 系统 SHALL 不因预览机制而主动加载 menuSetup 远程数据

Requirement: 线上插件菜单补充加载条件

预览中心中的 getOnlinePluginConfig() 线上插件菜单补充 SHALL 由 src/plugins/preview.vue 单独控制:仅当 NODE_ENV='development' 且未设置 FES_APP_PLSNAME 时,或显式开启 FES_APP_ONLINE_API 时,系统才 SHALL 拉取线上发布菜单并与本地配置合并。

Scenario: 本地多插件预览模式补充线上菜单

  • GIVEN 当前处于开发环境
  • AND 未设置 FES_APP_PLSNAME
  • WHEN 预览中心初始化插件配置
  • THEN 系统 SHALL 允许拉取线上发布菜单作为本地配置补充

Scenario: 单插件模式默认不做线上插件菜单补充

  • GIVEN 当前处于本地单插件模式
  • AND FES_APP_PLSNAME 已设置
  • AND 未开启 FES_APP_ONLINE_API
  • WHEN 预览中心决定是否拉取线上插件菜单补充
  • THEN 系统 SHALL 默认跳过该线上补充逻辑

Scenario: 线上 API 开关覆盖默认条件

  • GIVEN 当前已显式开启 FES_APP_ONLINE_API
  • WHEN 应用进行预览初始化
  • THEN menuSetup 加载与线上插件菜单补充 SHALL 都允许执行
  • AND 不再受本地是否单插件模式的默认限制