Skip to content

在 workspace 内运行时,生成的临时 app 模块解析面是死的:dev 的 alias 表漏 4 个 workspace 包(整页 500),serve/build 连 monorepo 分支都没有 #3890

Closed

Description

@yinlianghui

越界发现,记录于 #3852(生成物 Tailwind 4 迁移)的浏览器实证期间。#3852 的文件面是生成的 CSS 管线;这一条是同一个临时 app 的模块解析面,与 Tailwind 无关,因此不在那个 PR 里做。

事实(实测于 origin/main = 56ff0916e,objectui dev 从仓根跑)

复现:仓根建一个 app.json + pages/index.json,node packages/cli/dist/cli.js dev dogfood/app.json --port 5852 --no-open。服务起得来,但页面里每一个模块请求都是 500,浏览器控制台 16 条 Failed to load resource: 500,document.body.innerText 为空。

Vite 的依赖扫描先给出名单:

(!) Failed to run dependency scan. The following dependencies are imported but could not be resolved:
  @object-ui/fields        (imported by packages/plugin-grid/src/components/bulkParamToField.ts)
  @object-ui/permissions   (imported by packages/plugin-grid/src/ObjectGrid.tsx)
  @object-ui/plugin-detail (imported by packages/plugin-kanban/src/ObjectKanban.tsx)
  @object-ui/mobile        (imported by packages/plugin-grid/src/ObjectGrid.tsx)

随后每次 transform 都报:

Pre-transform error: Failed to resolve import "@object-ui/fields" from
  "packages/plugin-form/src/MasterDetailForm.tsx". Does the file exist?

原因是两层:

  1. commands/dev.ts:178-190 的 alias 表是 11 个包的硬编码清单(react / components / core / types + 7 个 plugin)。它把这些包指向各自的 src/,于是 Vite 要连带编译那些 src/ 自身的 import —— 而 @object-ui/fields、@object-ui/permissions、@object-ui/mobile、@object-ui/plugin-detail 不在表里。
  2. 表外的包在本仓没有任何后备解析路径:仓根 package.json 不依赖任何 @object-ui/*,ls node_modules/@object-ui/ 直接 No such file or directory。临时 app 建在 cwd/.objectui-tmp 下靠 hoist 解析(create-plugin 生成产物的 build 侧 devDependencies 内部不一致且落后仓库工具链 1–2 个 major:@vitejs/plugin-react ^4.2.1 的 peer 结构性无法被 vite ^7.3.1 满足 #3742 / packages/cli 的 createTempAppWithRouting 生成的 app import 了未声明的 lucide-react,且其工具链区间落后仓内一到三个 major #3827 记过这条),但 hoist 到的仓根没有这些包。

即:alias 表是一份必须与 packages/*/src 的传递 import 图保持同步的手工清单,而没有任何门禁钉住它 —— 每新加一个跨包 import 就会静默多一条 500。

serve / build:同一处更深

commands/serve.ts:98-106 与 commands/build.ts:106-115 的 vite 配置里没有 resolve.alias,也没有 isMonorepo 分支,而它们照样把临时 app 建在 join(cwd, '.objectui-tmp'):

所以在 workspace 内 objectui serve / objectui build 从一开始就不可能解析平台包,不只是缺样式。

影响

不预判修法

至少两种读法,取舍不同,留给维护者定:

  • A. 补全清单:把 4 个漏的包加进 dev.ts 的 alias 表,并给 serve/build 复制同一分支。最小,但把"手工清单必须追传递 import 图"这个结构留在原地,下一次跨包 import 照样静默。
  • B. 从 pnpm-workspace.yaml 生成 alias:按 workspace 成员枚举 @object-ui/* → 各自 src 入口,dev/serve/build 共用一个 helper。一次修掉整类,代价是要决定入口文件的推断规则(现表里既有 src/index.ts 也有 src/index.tsx)。

已搜重

本仓开放 issue 搜过 cli alias resolve workspace、objectui serve build temp app、标题含 cli 三组:命中只有 #3852(本条的来源,CSS 面)与 #3853(生成 tsconfig 的 strict,质量门面)。两者都不含模块解析面。#3827(已合,PR #3854)修的是生成清单的声明面,不涉及 vite alias。

Activity

  1. os-zhuang commented on Aug 9, 2026

    @os-zhuang
    Contributor

    Triage: pm:queue (sister-repo card: pm-state only).

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. self-assigned this
    on Aug 17, 2026
  3. yinlianghui commented on Aug 17, 2026

    @yinlianghui
    CollaboratorAuthor

    认领(objectui 车道分片 PM,会话 session_01GTRjn8xBqp75dk7kFupVRt,批次 17):branch claude/issue-3890-workspace-alias。

    按卡面 + 分诊评论实施:workspace 内 objectui dev 的临时 app 别名表漏 4 个 workspace 包(整页 500),serve/build 缺 monorepo 分支。A(手表回填 + 复制分支)vs B(从 pnpm-workspace.yaml 派生)是工程耐久性取舍,归实施者裁量并在 PR 记录 —— 分诊备注 B 能消灭产生本卡的「手表追传递导入图」结构,非绑定倾向。文件面:packages/cli 的 dev.ts / serve.ts / build.ts(注意 #3852 落地后行号已漂移)。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions