Skip to content

Issue 1:字体包永远解析不到 / Issue 2:本地渲染 Worker 子进程崩溃 #211

Description

@wangyufeng336

标题: Every fonts-open family fails "X is needed by this authored font" even after hypit packages install

环境: @hypit/hypit 0.1.10(npm 最新版)· macOS 26.6 (25G72) arm64 · Node v26.5.0

复现:

  1. .svml 里用任意 fonts-open 字体(比如 family="inter")
  2. hypit check 报 @fontsource-variable/inter is needed by this authored font. Install it once with: hypit packages install @fontsource-variable/inter@5.3.0
  3. 照着跑 hypit packages install @fontsource-variable/inter@5.3.0 → 显示 ✓ Machine package is ready
  4. 再跑一次 hypit check → 一模一样的报错,像什么都没装过

根因: fonts-open/src/surface.ts 通过 resolveNodePackageResource 解析字体文件,最终落到 package-loader-node 的 declaredExternalPackageRoot——它要求从请求方文件(fonts-open/src/...)向上遍历祖先目录,找一个在 dependencies 里声明了这个字体包的 package.json。但 fonts-open/package.json 的 dependencies 只列了内部 @hypit/* workspace 包,从不声明任何字体包。而 hypit packages install 把包装进了完全不相关的另一棵目录树(机器级 packages home),fonts-open/src 向上遍历永远够不着那里。这个坑对目录里近 90 种字体都成立,不是 Inter 专属。

建议修复: 要么让 resolveFontPackageFile 直接用 externalPackageInstallRoot(machinePackagesRoot, packageName, version) 定位(它已经知道包名,需要补上锁定版本),要 fonts-open 自己够得着的祖先链上。

标题: hyperframes.local render always fails: Cannot find package '@hypit/hyperframes' (render worker subprocess missing Distribution module-resolution bootstrap)

环境: 同上

复现: 用官方 hypit runtime init 生成的默认 Profile(hypihub.default + media.local + hyperframes.local),hypit doctor 全绿的情况下,任何一次 hypit build 渲染都会在第一步视觉渲染上必现崩溃:
Error [ERR_MODULE_NOT_FOUND]: Cannot find package '@hypit/hyperframes' imported from
.../packages/provider-hyperframes-local/src/render.ts

根因: capture-process.ts 用 spawn(process.execPath, ["--import", tsxLoader, captureWorkerPath], ...) 另起一个全新 Node 子进程跑真正的渲染。但 @hypit/hyperframes 这类 @hypit/* 包名只能通过 Hypit 自定义的模块解析钩子(installDistributionPackageResolution)找到,而这个钩子只在顶层 CLI 入口 bin/hypit.mjs 里注册了一次;子进程的 spawn 参数里完全没有重新注册这个钩子,所以子进程一加载 render.ts 顶部的 import ... from "@hypit/hyperframes/project" 就崩。这是无条件必现的,跟具体 Source/Run 内容无关。

已验证的绕过方法(不改动任何已安装文件): 常驻 Worker 进程(hypit runtime status 显示的那个)才是真正执行 spawn 的地方,得让它带着补丁重启:
hypit runtime down
NODE_OPTIONS="--import=/path/to/bootstrap.mjs" hypit runtime up
bootstrap.mjs 复刻 bin/hypit.mjs 里那两行注册调用即可。只在 hypit build 那条命令上设置 NODE_OPTIONS(不重启 Worker)没用,因为 Worker 早就在跑、环境变量是启动时定的。

建议修复: capture-process.ts 的 spawn 参数里加一个额外 --import,指向一个执行同样两行注册逻辑的小模块(或者把 bin/hypit.mjs 那段注册逻辑抽成两边都能复用的入口)。

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions