Skip to content

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

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-106commands/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 workspaceobjectui serve build temp app、标题含 cli 三组:命中只有 #3852(本条的来源,CSS 面)与 #3853(生成 tsconfig 的 strict,质量门面)。两者都不含模块解析面。#3827(已合,PR #3854)修的是生成清单的声明面,不涉及 vite alias。

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