Skip to content

console-starter 的 vite 别名表漏了 5 个源码实际 import 的工作区包,未先构建就 pnpm dev 得到白屏 #3528

Description

@yinlianghui

越界发现,记录于 #3520(给 examples/console-starter 写 README)期间的实测启动。未在该 PR 中顺手修改;PR #3524 的 README 已把"必须先 pnpm -w build"如实写进"How to run",所以这是打磨类发现,不是今天会挡住按文档操作的读者的缺陷 —— 标 finding,不排队。

现象

examples/console-starter/vite.config.ts24@object-ui/* specifier 别名到 packages/*/src,注释写明用意是让插件的 side-effect 注册命中同一个 ComponentRegistry 单例。但这些 src 文件自己又 import 了 5 个既不在别名表、也不在 examples/console-starter/package.json的工作区包:

未覆盖的包 import 它的文件
@object-ui/mobile packages/plugin-list/src/ListView.tsx
@object-ui/providers packages/app-shell/src/views/RecordAttachmentsPanel.tsx
@object-ui/sdui-parser packages/components/src/renderers/layout/page.tsx
@object-ui/plugin-editor packages/app-shell/src/views/metadata-admin/widgets.tsx
@object-ui/react-runtime packages/components/src/renderers/layout/react-page.tsx

这 5 个包只能退回 node 解析,落到 packages/*/dist —— 而 dist 只有构建之后才存在。

实测

origin/main 的干净 worktree 里,只 pnpm install( pnpm -w build)后 pnpm dev(自选空闲端口 5197):

VITE v8.2.0  ready in 389 ms
(!) Failed to run dependency scan. Skipping dependency pre-bundling. Error: The following dependencies are imported but could not be resolved:
  @object-ui/mobile (imported by .../packages/plugin-list/src/ListView.tsx)
  @object-ui/providers (imported by .../packages/app-shell/src/views/RecordAttachmentsPanel.tsx)
  @object-ui/sdui-parser (imported by .../packages/components/src/renderers/layout/page.tsx)
  @object-ui/plugin-editor (imported by .../packages/app-shell/src/views/metadata-admin/widgets.tsx)
  @object-ui/react-runtime (imported by .../packages/components/src/renderers/layout/react-page.tsx)

src/main.tsximport '@object-ui/plugin-list'急切的,而 plugin-list/src/index.tsx 又急切 import { ListView } from './ListView',所以这条链一定会被浏览器走到:

$ curl -s -o /dev/null -w "%{http_code}" http://localhost:5197/@fs/.../packages/plugin-list/src/ListView.tsx
500   → Failed to resolve import "@object-ui/mobile" from "../../packages/plugin-list/src/ListView.tsx". Does the file exist?

无头 Chromium 打开 http://localhost:5197/:HTTP 200,但 #root 的 innerHTML 长度为 0,document.body.innerText 为空字符串,控制台是 6 条 500 —— 纯白屏,页面上没有任何提示

补上这 5 个包(及其依赖)的构建后重启,同一页面正常渲染出品牌加载屏(ObjectOS / Initializing application... / Connecting to data source)。所以根因就是 dist 缺失,不是别的。

为什么标 finding 而不是缺陷

examples/README.md 与根 README.md 都已写明启动顺序是 pnpm installpnpm -w buildcd examples/... && pnpm dev,按文档走不会踩到。踩到的是跳过构建的人 —— 而失败现场(白屏 + 无文案)完全不指认根因,这是它值得记一笔的地方。

可选的处理方向(不预设结论)

  1. 把这 5 个包补进 vite.config.ts 的别名表 —— 与现有 24 条同构,pnpm dev 从此不依赖 dist,对 example 的"开箱即跑"最直接。
  2. 把它们补进 examples/console-starter/package.jsondependencies —— 与 vite.config.ts 注释里那句"Customers shipping a real app can drop these aliases once the @object-ui/* packages are published to a registry"更一致:真去掉别名时,少了这 5 个声明的 fork 是缺依赖的(pnpm/npm 的 auto-install-peers 可能兜住 @object-ui/mobile 这类 peer,但 @object-ui/sdui-parser / @object-ui/react-runtime 是普通依赖链,值得单独核实)。
  3. 什么都不改,只靠文档 —— PR docs(examples): 给 console-starter 补 README #3524 的 README 已经是这一档。

方向 1 与 2 不互斥;哪个是长期正确取决于这个 example 到底承诺"在 monorepo 里能跑"还是"fork 出去能跑",这是维护者的判断,故此单不预设。

备注:查重未能完成

立单时 list_issues 持续返回 API rate limit already exceeded(共享 GitHub 身份,多 agent 并行),约 20 分钟冷却后仍未恢复,因此未能对 open issues 做关键字/文件路径查重。若已有同源单,请按惯例 race-close 本单。


Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions