自动发现与生成脚本
如何用脚本自动生成区块注册信息
为了减少手工维护,当前区块系统使用两类自动生成文件。
1. 生成目标
1) Definition 列表(客户端安全)
文件:
apps/web/src/blocks/core/generated/block-definitions.ts
来源脚本:
apps/web/scripts/generate-block-definition-catalog.ts
用途:
- 供
core/catalog.ts统一读取区块 definition。 - 被前台与编辑器共享。
- 不触碰任何
server-only依赖。
2) Business Fetcher 映射(仅服务端)
文件:
apps/web/src/blocks/core/generated/business-fetcher-catalog.ts
来源脚本:
apps/web/scripts/generate-block-business-catalog.ts
用途:
- 供
pipeline.ts在服务端加载业务 fetcher。 - 隔离客户端链路,避免
server-only报错。
2. build:pre 集成
apps/web/scripts/prebuild.ts 已接入:
generateBlockBusinessCatalog()generateBlockDefinitionCatalog()
因此执行:
pnpm --filter web build:pre会自动刷新两份生成文件。
或者,你可以单独运行:
pnpm --filter web generate:blocks3. 自动发现规则
Definition 发现规则
扫描 collection/*/definition.ts:
- 必须有且只有一个
createBlockDefinition主导出。 - 必须能解析
type: "..."。
Fetcher 发现规则
扫描 collection/*/fetcher.ts:
- 必须有且只有一个
*Fetcher主导出。 - 导出名必须以
Fetcher结尾。
4. 失败时会发生什么
脚本会直接报错并中断(prebuild 失败),常见场景:
fetcher.ts没有*Fetcher导出。fetcher.ts有多个*Fetcher导出。definition.ts没有createBlockDefinition主导出。definition.ts缺失type。
5. 新增区块后的最低操作
你新增完区块目录后,至少执行一次:
pnpm --filter web build:pre建议再执行:
pnpm check-types
pnpm lint6. 为什么仍然建议保持固定文件命名
自动发现依赖约定,不建议自由命名:
definition.tsfetcher.tsindex.tsxschema.tstypes.ts
命名稳定,脚本才能稳定,团队协作成本最低。