Mini Marketplace¶
从 2643 行的
src/utils/plugins/marketplaceManager.ts提炼到 ~250 行 的 semver + 完整性 + peer 依赖。 6 测试场景:列插件 / 装 / 指定版本 / peer / 不兼容 core / hash 校验。
文件¶
mini-marketplace/
├── src/
│ ├── marketplace.ts semver + SHA256 + peer deps + mock registry(~220 行)
│ └── cli.ts 6 测试场景
└── README.md
跑¶
真实代码对照¶
| Demo | 真实文件 | 简化 |
|---|---|---|
parseSemVer / satisfiesRange |
marketplaceManager.ts:100 |
自实现简化版 |
fetchRegistry |
marketplaceManager.ts:300 (~400 行) |
mock 内存数组 |
install |
marketplaceManager.ts:800 (~800 行) |
简化无 IO |
verifyIntegrity |
marketplaceManager.ts:1500 (~200 行) |
SHA256 |
peerDeps |
marketplaceManager.ts:2000 (~300 行) |
简化 |
核心 4 件套¶
1️⃣ Semver 解析 + 比较¶
parseSemVer("1.2.3") → { major: 1, minor: 2, patch: 3, raw: "1.2.3" }
compareSemVer(a, b) → -1 / 0 / 1
>=、<=、>、<、=,不支持:~(patch range)、^(compatible)、||(or)、x.y.*(缺省)。
2️⃣ Range 匹配¶
真值:用户能装的核心是 coreRange 内的。2.0 plugin 不能装在 1.x core。3️⃣ Install = 4 步闸门¶
4 闸门 都通过才能装,任何一闸失败就 throw(详细错误信息)。4️⃣ SHA256 = 防篡改¶
const computedHash = sha256(candidate.content);
if (computedHash !== candidate.sha256) {
throw new Error(`Integrity check failed for ${name}@${candidate.version}`);
}
6 场景输出¶
📌 Test 1: list available plugins
- [email protected]
- [email protected]
- [email protected]
📌 Test 2: install greet-plugin (latest)
✅ installed [email protected] (选 core 兼容的最高,不是 2.0.0)
📌 Test 3: install [email protected] (specific)
✅ installed [email protected]
📌 Test 4: peer dependency
✅ blocked: peer greet-plugin missing
→ install greet-plugin first
✅ installed [email protected]
📌 Test 5: core version incompatibility
✅ blocked: No compatible version of ai-helper for core 1.0.0
📌 Test 6: integrity check (tampered)
✅ blocked: Integrity check failed for [email protected]
进阶练习¶
- 加 semver 完整支持:
~1.2.3/^1.0.0/1.x/|| - 加真实 fetch:从 https://registry.npmjs.org 下载
- 加签名验证:用 ed25519 公钥验 plugin 签名
- 加 lockfile:装过的不变 hash 才能重装
- 加 lazy install:装但不下载,等用时再下
- 加 dep graph:A → B → C 自动按序装
相关阅读¶
- topics/deep-dive-marketplace.md —— 2643 行完整分析
- topics/deep-dive-plugin-loader.md —— plugin 加载
- topics/cache-strategies.md —— registry 缓存
- npm semver 文档
- mini-plugin/ —— 配合本 demo:装后用 loader 加载