[BEL] 修复生产构建 GoAdmin 外壳启动白屏 #142

Closed
opened 2026-08-29 16:58:59 +08:00 by ila · 4 comments
Owner

状态

已完成(2026-08-29 验收,PR #143 已合入 dev)

基本信息

  • 类型:缺陷修复 / 前端生产构建
  • 主项目:Bell
  • 主 agent:Bell agent
  • 所属 Epic:#7
  • 所属 MVP:#8
  • 来源:执行 #134 的 Windows 包浏览器级验收
  • 前置:#62、#140
  • 阻塞:#134
  • 独立运行:临时 Bell/PostgreSQL,不启动 Sense/Brain

复现与根因

  1. 使用固定 Node 22.22.1、pnpm 9.15.1 执行 Bell UI build:prod 并生成 Windows 包。
  2. 包审计、静态入口 HTTP 200 和 API E2E 均通过,但浏览器打开根页面后 #app 为空。
  3. 控制台首个错误为 TypeError: Cannot read properties of undefined (reading 'theme'),位于生产 app-legacy 启动链。
  4. 当前源码把包含 Sass :export 的 element-variables.scss / variables.scss 当普通样式默认导入;固定 css-loader 不为普通 SCSS 生成默认 JS export。构建已明确警告 export 'default' ... was not found,运行时因 variables.theme 崩溃。
  5. #134 中为缺失 module runtime 选择完整 legacy bundle 的包级处理只能保证资源完整,不能修复上述源码导出语义。

目标

  • 固定工具链的开发/生产构建均能取得既有主题和侧栏变量。
  • Windows 包在真实浏览器中正常挂载 GoAdmin 登录页与应用外壳,不再白屏。
  • 不改变主题色、布局、导航、业务页面、权限或交互语义。
  • 保持 #140 的最小菜单行为及 #138 的生产验证码行为。

非目标

  • 不升级 GoAdmin、Node、pnpm、sass、sass-loader 或 css-loader。
  • 不重构样式体系,不改变 UI 设计,不新增页面或组件。
  • 不修改 Bell 后端、Sense、Brain、contracts、docs 或根级配置。
  • 不在本工单改动 #134 的 E2E/打包/运行脚本。

已确认修复方案草案

  • 对四个需要在 JavaScript 中读取 Sass :export 值的现有导入显式使用 CSS Modules resource query(?module),继续复用原变量文件与冻结 Vue CLI 构建链。
  • 不改变纯样式 @use 引用。
  • 增加专用前端启动回归:生产构建后在真实浏览器检查 #app 挂载、登录页可见、无 variables.theme 启动错误;再由 #134 的完整包浏览器 E2E 验证外壳与业务页面。
  • 若实测 ?module 不能在固定工具链稳定生成导出,停止并回写证据,不改用打包后字符串替换。

精确 write_paths

  • Bell/ui/src/store/modules/settings.js
  • Bell/ui/src/layout/index.vue
  • Bell/ui/src/layout/components/Sidebar/Logo.vue
  • Bell/ui/src/layout/components/Sidebar/index.vue
  • Bell/ui/tests/unit/shell-startup/**

禁止修改其他 UI、Bell 后端、#134 测试/交付脚本、Sense、Brain、contracts、docs 和根级配置。

设计证据

恢复 #62 与 #33 已确认的 GoAdmin 应用外壳,不改变页面结构、流程、状态、权限或异常处理;以浏览器白屏复现、控制台错误和既有外壳为等效设计证据,不要求新原型。

验收标准

  • 固定 Node/pnpm 下 pnpm lint、pnpm test:unit -- --runInBand、pnpm build:prod 通过。
  • 构建不再出现 variables.scss / element-variables.scss 缺少 default export 警告。
  • 生产构建在真实 Chromium 中挂载 #app,登录页可见,控制台无主题变量启动错误。
  • 登录后 GoAdmin 侧栏、顶部导航、标签页可见,主题与既有设计一致。
  • #140 最小菜单与后端禁用边界不回退。
  • 提交仅包含授权 Bell UI 路径。

风险与回退

  • 风险:错误启用全局 CSS Modules 会改变类名和布局。
  • 控制:只在四个 JS 值导入上使用 resource query,不修改全局 loader 规则;生产浏览器验证外壳。
  • 回退:回退本工单提交,保留 #134 阻塞,不发布白屏包。

文档影响

恢复已确认应用外壳,不改变长期配置、部署、API 或业务规则;预计无长期 Wiki 影响。

## 状态 已完成(2026-08-29 验收,PR #143 已合入 dev) ## 基本信息 - 类型:缺陷修复 / 前端生产构建 - 主项目:Bell - 主 agent:Bell agent - 所属 Epic:#7 - 所属 MVP:#8 - 来源:执行 #134 的 Windows 包浏览器级验收 - 前置:#62、#140 - 阻塞:#134 - 独立运行:临时 Bell/PostgreSQL,不启动 Sense/Brain ## 复现与根因 1. 使用固定 Node 22.22.1、pnpm 9.15.1 执行 Bell UI `build:prod` 并生成 Windows 包。 2. 包审计、静态入口 HTTP 200 和 API E2E 均通过,但浏览器打开根页面后 `#app` 为空。 3. 控制台首个错误为 `TypeError: Cannot read properties of undefined (reading 'theme')`,位于生产 `app-legacy` 启动链。 4. 当前源码把包含 Sass `:export` 的 `element-variables.scss` / `variables.scss` 当普通样式默认导入;固定 css-loader 不为普通 SCSS 生成默认 JS export。构建已明确警告 `export 'default' ... was not found`,运行时因 `variables.theme` 崩溃。 5. #134 中为缺失 module runtime 选择完整 legacy bundle 的包级处理只能保证资源完整,不能修复上述源码导出语义。 ## 目标 - 固定工具链的开发/生产构建均能取得既有主题和侧栏变量。 - Windows 包在真实浏览器中正常挂载 GoAdmin 登录页与应用外壳,不再白屏。 - 不改变主题色、布局、导航、业务页面、权限或交互语义。 - 保持 #140 的最小菜单行为及 #138 的生产验证码行为。 ## 非目标 - 不升级 GoAdmin、Node、pnpm、sass、sass-loader 或 css-loader。 - 不重构样式体系,不改变 UI 设计,不新增页面或组件。 - 不修改 Bell 后端、Sense、Brain、contracts、docs 或根级配置。 - 不在本工单改动 #134 的 E2E/打包/运行脚本。 ## 已确认修复方案草案 - 对四个需要在 JavaScript 中读取 Sass `:export` 值的现有导入显式使用 CSS Modules resource query(`?module`),继续复用原变量文件与冻结 Vue CLI 构建链。 - 不改变纯样式 `@use` 引用。 - 增加专用前端启动回归:生产构建后在真实浏览器检查 `#app` 挂载、登录页可见、无 `variables.theme` 启动错误;再由 #134 的完整包浏览器 E2E 验证外壳与业务页面。 - 若实测 `?module` 不能在固定工具链稳定生成导出,停止并回写证据,不改用打包后字符串替换。 ## 精确 write_paths - `Bell/ui/src/store/modules/settings.js` - `Bell/ui/src/layout/index.vue` - `Bell/ui/src/layout/components/Sidebar/Logo.vue` - `Bell/ui/src/layout/components/Sidebar/index.vue` - `Bell/ui/tests/unit/shell-startup/**` 禁止修改其他 UI、Bell 后端、#134 测试/交付脚本、Sense、Brain、contracts、docs 和根级配置。 ## 设计证据 恢复 #62 与 #33 已确认的 GoAdmin 应用外壳,不改变页面结构、流程、状态、权限或异常处理;以浏览器白屏复现、控制台错误和既有外壳为等效设计证据,不要求新原型。 ## 验收标准 - [ ] 固定 Node/pnpm 下 `pnpm lint`、`pnpm test:unit -- --runInBand`、`pnpm build:prod` 通过。 - [ ] 构建不再出现 `variables.scss` / `element-variables.scss` 缺少 default export 警告。 - [ ] 生产构建在真实 Chromium 中挂载 `#app`,登录页可见,控制台无主题变量启动错误。 - [ ] 登录后 GoAdmin 侧栏、顶部导航、标签页可见,主题与既有设计一致。 - [ ] #140 最小菜单与后端禁用边界不回退。 - [ ] 提交仅包含授权 Bell UI 路径。 ## 风险与回退 - 风险:错误启用全局 CSS Modules 会改变类名和布局。 - 控制:只在四个 JS 值导入上使用 resource query,不修改全局 loader 规则;生产浏览器验证外壳。 - 回退:回退本工单提交,保留 #134 阻塞,不发布白屏包。 ## 文档影响 恢复已确认应用外壳,不改变长期配置、部署、API 或业务规则;预计无长期 Wiki 影响。
ila added the kind/taskproject/bellscope/independentpriority/p0 labels 2026-08-29 16:58:59 +08:00
Author
Owner

用户于 2026-08-29 明确要求执行 #142。实施按已确认方案进行:只在四个现有 JavaScript/Vue Sass 值导入上增加 ?module,并在专用测试路径补充启动回归;不修改全局 loader、设计、其他 UI、后端或 #134 脚本。

用户于 2026-08-29 明确要求执行 #142。实施按已确认方案进行:只在四个现有 JavaScript/Vue Sass 值导入上增加 `?module`,并在专用测试路径补充启动回归;不修改全局 loader、设计、其他 UI、后端或 #134 脚本。
Author
Owner

冻结 GoAdmin 文档依据(基线 commit 424855aacf6905f3fde860c3331385cb25529a0d):

  • docs/intro/advanced/tutorial0210.md:保持 src/layout、src/store、src/styles 和 dist 的上游职责边界。
  • docs/intro/advanced/tutorial0230.md:以浏览器实际出现 GoAdmin 登录页作为前端启动成功证据。

本修复只调整现有 layout/store 对 styles 导出值的加载方式,不改变目录职责、入口组件、路由或构建基线。

冻结 GoAdmin 文档依据(基线 commit `424855aacf6905f3fde860c3331385cb25529a0d`): - `docs/intro/advanced/tutorial0210.md`:保持 `src/layout`、`src/store`、`src/styles` 和 `dist` 的上游职责边界。 - `docs/intro/advanced/tutorial0230.md`:以浏览器实际出现 GoAdmin 登录页作为前端启动成功证据。 本修复只调整现有 layout/store 对 styles 导出值的加载方式,不改变目录职责、入口组件、路由或构建基线。
Author
Owner

实现完成,状态:待验收。

最终差异

  • 四个既有 Sass 值导入显式使用 ?module,固定 css-loader 现在生成原有 :export 值。
  • 未修改全局 loader、主题变量、布局、路由、业务页面、后端或工具链。
  • 新增专用结构回归,锁定四个启动关键导入。

验证证据

  • corepack pnpm@9.15.1 install --frozen-lockfile:通过。
  • corepack pnpm@9.15.1 lint:0 error;30 条冻结上游既有 warning。
  • corepack pnpm@9.15.1 test:unit --runInBand:12 suites / 40 tests 全部通过。
  • corepack pnpm@9.15.1 build:prod:通过;variables.scss / element-variables.scss 缺少 default export 的两条警告消失。
  • 独立静态生产 legacy bundle + 真实 Chromium:#app 挂载 2 个根节点,GoAdmin 登录页可见,控制台无 variables.theme 启动错误。
  • 临时应用 #134 测试现场的集成包 + 真实 Chromium:登录成功;侧栏、顶部导航、标签页、预警中心和预警管理页面可见;开发工具/定时任务等无关菜单不可见。
  • 完整独立纵切再次通过:Event/Receipt 幂等、Rule/Alert、20 路并发 ack、越权 close、幂等重放、时间线、冷重启、包启动/停止与清理。
  • git diff --check 与授权写路径检查通过。

Git

  • 提交:1caa429cadc37a1803a3bfaf91caaa3fae659d6a
  • PR:#143(feature/142-bell-ui-shell-startup → dev)
  • #142 分支当前 clean,仅包含 5 个授权文件。

文档影响

无长期文档影响:恢复已确认的 GoAdmin 应用外壳启动行为,不改变配置、部署、API 或业务规则;未修改 Wiki/镜像。

请验收 #142;验收前不合并 PR、不关闭工单。#134 原现场仍保存在 stash,另有一份集成验证副本,均未提交或推送。

实现完成,状态:**待验收**。 ### 最终差异 - 四个既有 Sass 值导入显式使用 `?module`,固定 css-loader 现在生成原有 `:export` 值。 - 未修改全局 loader、主题变量、布局、路由、业务页面、后端或工具链。 - 新增专用结构回归,锁定四个启动关键导入。 ### 验证证据 - `corepack pnpm@9.15.1 install --frozen-lockfile`:通过。 - `corepack pnpm@9.15.1 lint`:0 error;30 条冻结上游既有 warning。 - `corepack pnpm@9.15.1 test:unit --runInBand`:12 suites / 40 tests 全部通过。 - `corepack pnpm@9.15.1 build:prod`:通过;`variables.scss` / `element-variables.scss` 缺少 default export 的两条警告消失。 - 独立静态生产 legacy bundle + 真实 Chromium:`#app` 挂载 2 个根节点,GoAdmin 登录页可见,控制台无 `variables.theme` 启动错误。 - 临时应用 #134 测试现场的集成包 + 真实 Chromium:登录成功;侧栏、顶部导航、标签页、预警中心和预警管理页面可见;开发工具/定时任务等无关菜单不可见。 - 完整独立纵切再次通过:Event/Receipt 幂等、Rule/Alert、20 路并发 ack、越权 close、幂等重放、时间线、冷重启、包启动/停止与清理。 - `git diff --check` 与授权写路径检查通过。 ### Git - 提交:`1caa429cadc37a1803a3bfaf91caaa3fae659d6a` - PR:#143(`feature/142-bell-ui-shell-startup → dev`) - #142 分支当前 clean,仅包含 5 个授权文件。 ### 文档影响 无长期文档影响:恢复已确认的 GoAdmin 应用外壳启动行为,不改变配置、部署、API 或业务规则;未修改 Wiki/镜像。 请验收 #142;验收前不合并 PR、不关闭工单。#134 原现场仍保存在 stash,另有一份集成验证副本,均未提交或推送。
ila closed this issue 2026-08-29 17:22:33 +08:00
Author
Owner

用户于 2026-08-29 明确验收通过。PR #143 已合入 dev,合并提交 6194b664ee822912c51803024453457c9b1e1c36;工单已关闭。无长期 Wiki 变化,未执行文档镜像同步。

用户于 2026-08-29 明确验收通过。PR #143 已合入 `dev`,合并提交 `6194b664ee822912c51803024453457c9b1e1c36`;工单已关闭。无长期 Wiki 变化,未执行文档镜像同步。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ila/yovision#142