RepoDaily · 2026-08-17 · Library / Framework

Cordis 源码细读:自称“时空可组合性元框架”的 TypeScript 项目

#3 Library / Framework TypeScript +719 cordiverse/cordis 打开仓库

Cordis 本期斩获 719 颗新增星、排名第 3。我们从单仓库结构、MIT 许可与 yakumo/vitest 工具链入手,把口号与可验证的事实分开。

项目类型Library / Framework
最适合想研究上下文驱动、以可组合性为先的 TypeScript 框架的开发者,以及想借鉴可运行的 yakumo/vitest 单仓库配置的维护者
风险等级中等
评估时间半天:克隆仓库,跑 `yarn build` 与 `yarn test`,通读 packages/core/README.md

核心问题: 在根清单仍是 private 的 0.0.0 版本时,“时空可组合性”模型是否值得纳入你的 TypeScript 架构?

87/100

RepoDaily 采用评分

RepoDaily 将该项目的采用分评为 87/100(强):分数来自文章来源、安装路径、生产风险、差异化、许可证清晰度以及 AI/Agent 适配度。

基于 RepoDaily 来源和采用说明的方向性评分,不是基准测试。风险: 中
96证据质量

包含 4 个来源、覆盖 3 类来源;如有 RepoDaily 独有模块,会进一步提高证据分。

100可安装/可试用性

检测到 6 个工作流步骤、5 个下一步动作,以及 2 个命令/安装信号。

66维护可信度

趋势热度为 +719 stars;如内容中有 release、issue 或维护信号,会提高维护可信度。

88生产准备度

采纳风险标记为 medium,并包含 4 条安全说明与 3 条跳过条件。

100差异化

3 个机会视角、4 个替代方案,以及 4 个类型化模块支撑差异化判断。

82许可证清晰度

文章中包含许可证来源或许可证表述。

60Agent / AI 适配度

文章正文和元数据中检测到 2 个 AI/Agent 相关信号。

项目概览

cordiverse/cordis 在 2026-08-17 这期榜单上以 719 颗新增星排在第 3 位,而它的一句话简介——“Meta-Framework of Spatiotemporal Composability”(时空可组合性元框架)——几乎承担了全部宣传任务。这个定位说明 cordis 不是普通的应用框架,而是更底层的“用来搭建框架的框架”。“时空可组合性”暗示其基本单元同时沿结构与生命周期两个维度组合。值得注意的是,根 README 并未展开,全部内容只有一行路径 './packages/core/README.md'。

许可证毫无歧义:MIT,版权声明为 2021-present Shigma,即至少五年的持续版权记录。MIT 条款允许使用、复制、修改、合并、发布、分发、再许可与销售,唯一条件是保留版权与许可声明。对愿意直接读源码的人来说这就是通行证:可以放心地 fork、研读并做衍生。

结构上这是一个 Yarn 单仓库。根 package.json 名为 @root/cordis,标记 private: true,版本钉在 0.0.0,并声明了 packages/* 与 external/* 两个 workspace 目录。根目录本身没有可安装的产物,真正可消费的部分定义在各子包里,README 点名的是 core。packageManager 字段锁定 [email protected],同时清单把 “type” 设为 “module”,整棵源码树以 ESM 为先。

工具链相当新:TypeScript ^5.9.3、vitest ^4.1.5 配 @vitest/coverage-v8 做覆盖率、esbuild ^0.28.0 与 vite ^7.3.2、eslint ^8.57.1 配共享的 @cordisjs/eslint-config ^1.1.1,再由 yakumo ^3.2.1 统一编排各子包任务。一个细节值得注意:tsx 并非 npm 原版,而是钉死的 Cordiverse fork——npm:@cordiverse/[email protected],任何跑测试的人都会继承这个依赖。

解决什么问题

  • 一次构建多个互相依赖的包:`yarn build` 经 yakumo 分发,先跑 esbuild 产出打包结果,再跑 tsc 生成类型声明。
  • 免预编译直接跑 TypeScript 重型 CLI:`yarn yakumo` 通过 `node --expose-internals --import tsx --import @cordisjs/unyaml` 启动。
  • 按消费者需要的形态输出覆盖率:`test:text`、`test:json`、`test:html` 各自先用 shx 清空 coverage 目录,再以指定 reporter 重跑。
  • 让 lint 在所有子仓库保持一致:`yarn lint` 执行 `eslint --cache`,规则来自共享的 @cordisjs/eslint-config ^1.1.1。
  • 让每个贡献者的安装可复现:`packageManager: [email protected]` 把 Yarn 版本直接钉在清单里。

工作原理

  1. 根 package.json 声明两个 workspace 通配——`external/*` 与 `packages/*`——Yarn 4.14.1 会把这两个目录下的每个文件夹都当作同一依赖图里的包。
  2. 文档被下放:根 README.md 只含 './packages/core/README.md' 一行,packages/core 因此成为框架的文档入口。
  3. `yarn build` 依次执行 `yakumo esbuild` 与 `yakumo tsc`,为每个子包产出打包结果与 TypeScript 声明。
  4. `yarn test` 执行 `yakumo vitest --import tsx`;三个包装脚本(`test:text`、`test:json`、`test:html`)借助 @vitest/coverage-v8 ^4.1.5 重建文本、JSON 或 HTML 覆盖率。
  5. `yarn yakumo` 直接用 `node --expose-internals` 启动 yakumo ^3.2.1 的 CLI,加载 tsx 处理 TypeScript、@cordisjs/unyaml ^2.0.3 处理 YAML 配置。
  6. 整棵树是 ESM:根清单把 “type” 设为 “module”,tsx 依赖则钉在 Cordiverse fork(`npm:@cordiverse/[email protected]`)上。

架构细读:文件树说明了什么

  • 根清单:名称 `@root/cordis`、`private: true`、`version 0.0.0`、“type” 为 “module”——根目录只是构建枢纽,不是发布产物。
  • 两个 workspace 通配按角色分代码:`packages/*` 放仓内包(按 README 指引,core 在这里),`external/*` 放刻意保持距离的外部代码。
  • yakumo ^3.2.1 负责单仓库任务编排;yakumo-esbuild ^3.0.2 与 yakumo-tsc ^3.0.1 分别承担两个构建阶段,yakumo-vitest ^1.3.3 接管测试。
  • 根级直接运行时依赖:零。15 个根级条目全部是 devDependencies,框架真实的依赖面定义在各子包的清单里,而不在这里。

命令面:根清单里的每一条脚本

  • `yarn lint` → `eslint --cache`,全仓库统一检查
  • `yarn yakumo` → `node --expose-internals --import tsx --import @cordisjs/unyaml node_modules/yakumo/lib/cli.js`,直接拉起 yakumo CLI
  • `yarn build` → `yarn yakumo esbuild && yarn yakumo tsc`,两阶段构建
  • `yarn test` → `yarn yakumo vitest --import tsx`,经 tsx 加载运行
  • `yarn test:text` / `test:json` / `test:html` → 各自先 `shx rm -rf coverage`,再 `yarn test --coverage --coverage.reporter <格式>`,输出三种报告形态

维护风险:0.0.0 的问题

  • 根清单是 `private: true` 且 `version 0.0.0`——从这份文件看,根目录本身不按版本发布;使用者依赖的是单独发布的子包。
  • 根 README 只有一行('./packages/core/README.md'),任何进入仓库的人都得再下潜一层才能找到解释。
  • 源包里的裸链分支不一致:README 来自 `master`,LICENSE 与 package.json 来自 `main`——固定任何提交前先确认默认分支。
  • tsx 钉在 Cordiverse fork `npm:@cordiverse/[email protected]` 上,每次测试运行都依赖这个 fork 跟上上游变化。
  • eslint 停在 ^8.57.1 这条线,而 TypeScript 已是 ^5.9.3;确认共享的 @cordisjs/eslint-config ^1.1.1 是否仍解析新语法。

采用前的核对清单

  • 确认你实际消费的是哪个 `packages/*` 子包,并查看它自己的清单与版本号。
  • 跑一遍 `yarn test:html` 并打开覆盖率报告,看测试套件真正覆盖了哪些模块。
  • 从头到尾读 packages/core/README.md——它是根 README 唯一点名的文档。
  • 把 MIT 条款(版权 2021-present Shigma)记入第三方许可清单。

谁适合关注

适合关注

  • 想在设计自己的框架前,先研究 ESM 优先、重度使用 workspace 的仓库布局的 TypeScript 项目。
  • 想要一份可运行的 yakumo 多包构建参考(esbuild 与 tsc 两阶段分开跑)的维护者。
  • 许可必须落在 MIT、且偏好读源码而非宣传页的选型者。
  • 正在研究 TypeScript 上下文与可组合性模型、愿意直接读 packages/core 的工程师。

可以先跳过

  • 现在就需要可安装、有版本号包的项目——根清单是 private 的 0.0.0。
  • 期待顶层 README 提供快速上手的读者——根 README 只有一行。
  • 非 TypeScript 代码库——工具链(tsx、tsc、vitest)从头到尾假设 TypeScript。

风险与注意事项

中

MIT 许可、可从干净克隆完成构建与测试,但可安装面定义在根清单之外的子包里,测试加载器是 fork,根 README 没有任何说明。

  • 根 `version 0.0.0` 加 `private: true`,仓库根本身不发布任何东西。
  • 文档在下一层的 packages/core/README.md,不在仓库入口。
  • `tsx` 解析到 `npm:@cordiverse/[email protected]`,跑测试套件就会继承这个 fork。
  • README 由 `master` 提供,而 LICENSE 与 package.json 来自 `main`——依赖任一分支前先核实默认分支。
  • 许可证为 MIT,版权 (c) 2021-present Shigma:保留声明即可商用、修改与再分发。
  • 许可证带标准 “AS IS” 条款——不做任何担保,安全审查责任在使用方。
  • 根级 15 个依赖全部是 devDependencies(构建与测试工具);各子包的运行时依赖需另行审计。
  • 源包中没有出现安全策略、审计输出或 CI 徽章,安全姿态应视为未验证。

替代方案比较

方案适用场景代价
Vue core(@vue/runtime-core 响应式)
需要久经考验、文档完善的可组合性与响应式模型。要接受 Vue 的组件渲染模型,而非独立元框架。
NestJS
需要结构化、自带模块体系与依赖注入的服务端 TypeScript 框架。运行时更重、约定更强,围绕装饰器与固定模块体系构建。
InversifyJS
只需要一个 IoC/DI 容器来组合 TypeScript 服务。需配置装饰器元数据(experimentalDecorators、emitDecoratorMetadata)。
tsyringe
想要微软出品、配置极简的轻量依赖注入解析器。功能面远小于完整框架。

这个趋势说明了什么

门面上的文档缺口

根 README 只有一行 './packages/core/README.md'。谁写一个真正的落地页——安装片段加一张 packages/* 与 external/* 划分示意——就能消掉 719 颗新星面对的最大摩擦。

打开根 README 数行数(一行),再计时:新人从 packages/core/README.md 出发要走多久才能碰到第一条可执行指令。

可照抄的单仓库蓝图

yakumo 流水线(`yakumo esbuild && yakumo tsc`、三种覆盖率报告、`eslint --cache`、钉死的 [email protected])是一套完整可用的 TypeScript 单仓库参考。

fork 仓库后运行 `yarn build && yarn test:html`,打开 coverage/index.html;能通过,蓝图即可迁移。

给 tsx fork 降险

测试以 npm:@cordiverse/[email protected] 导入 tsx。把修复推上游、或写清 fork 存在的原因,能替所有跑测试的人移除一个隐性依赖。

把 fork 与上游 tsx 4.19.3 的包做 diff,再换成上游包跑 `yarn test`,看是否仍然通过。

下一步建议

先读 core 子包,再对 cordis 下结论

仓库顶层给出的只是一个指针。花半天时间复现构建、通读被指到的那份文档,这是用一手材料判断“时空可组合性”的唯一方式。

  1. 克隆 https://github.com/cordiverse/cordis,按 `packageManager` 字段启用 Yarn 4.14.1(corepack enable)。
  2. 运行 `yarn install`,随后 `yarn build`,确认 `yakumo esbuild && yakumo tsc` 能无错走完。
  3. 先跑 `yarn test:text` 快速过一遍,再跑 `yarn test:html` 并打开生成的覆盖率报告。
  4. 通读 `packages/core/README.md`——根 README 唯一点名的文件。
  5. 对照 LICENSE(MIT,2021-present Shigma)更新你的许可清单,并记下 `master` 与 `main` 的分支疑问。

RepoDaily 判断

Cordis 是一个 MIT 许可、ESM 优先的 TypeScript 单仓库,根目录只是围绕 packages/core 的构建枢纽;口号足够勾人,工具链可验证地新,尽调路径也短——构建它、测试它、读 packages/core。

信息来源