better-dsh 0.2.2-a → 0.2.2-c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/50_test-reports/2026-09-06-write/345/267/245/345/205/267sandbox/345/215/207/347/272/247/351/200/217/344/274/240bug/345/244/215/345/217/221/345/217/212/346/214/202/350/265/267-/344/272/213/344/273/266/346/212/245/345/221/212.md +43 -0
- package/docs/50_test-reports/v0.2.4-ios-focus-zoom-suppression/345/256/236/346/265/213/346/212/245/345/221/212.md +158 -0
- package/docs/60_exploration-and-research/01-cordis-runtime/bun-compile-cordis-runtime-bootstrap-research.md +536 -0
- package/docs/60_exploration-and-research/01-cordis-runtime/cordis-customization-and-override-mechanics.md +418 -0
- package/docs/60_exploration-and-research/01-cordis-runtime/cordis-research.md +350 -0
- package/docs/60_exploration-and-research/01-cordis-runtime/dsh-cordis-hotplug-mcp-patch-research.md +265 -0
- package/docs/60_exploration-and-research/02-dsh-webui/dsh-web-profile-package-map.md +186 -0
- package/docs/60_exploration-and-research/02-dsh-webui/dsh-web-ui-slot-system-research.md +310 -0
- package/docs/60_exploration-and-research/02-dsh-webui/dsh-webui-backend-data-inventory.md +633 -0
- package/docs/60_exploration-and-research/02-dsh-webui/dsh-webui-strip-boundary-research.md +300 -0
- package/docs/60_exploration-and-research/02-dsh-webui/dsh-webui-wire-appendix.md +3729 -0
- package/docs/60_exploration-and-research/02-dsh-webui/web-frontend-composability-research.md +191 -0
- package/docs/60_exploration-and-research/02-dsh-webui/webui-wire-data/capture-live-turn.json +1 -0
- package/docs/60_exploration-and-research/02-dsh-webui/webui-wire-data/observed-endpoints.json +224 -0
- package/docs/60_exploration-and-research/02-dsh-webui/webui-wire-data/remote-inventory.json +110954 -0
- package/docs/60_exploration-and-research/02-dsh-webui/webui-wire-data/served-index-sample.html +47 -0
- package/docs/60_exploration-and-research/02-dsh-webui/webui-wire-data/session-events.json +9411 -0
- package/docs/60_exploration-and-research/02-dsh-webui/webui-wire-data/ws-frame-examples.json +20 -0
- package/docs/60_exploration-and-research/03-mobile-ios/dsh-mobile-spa-ios-input-experience-research.md +160 -0
- package/docs/60_exploration-and-research/03-mobile-ios/ios-chat-app-bridge-research.md +324 -0
- package/docs/60_exploration-and-research/04-session-storage/alpha5-compaction-jsonl-mapping.md +1532 -0
- package/docs/60_exploration-and-research/04-session-storage/alpha5-compaction-sample/episode-failed.json +46 -0
- package/docs/60_exploration-and-research/04-session-storage/alpha5-compaction-sample/episode1.json +1124 -0
- package/docs/60_exploration-and-research/04-session-storage/alpha5-compaction-sample/episode2.json +1240 -0
- package/docs/60_exploration-and-research/05-dashr-dev/plugin-development.md +148 -0
- package/docs/60_exploration-and-research/05-dashr-dev/upstream-alignment.md +102 -0
- package/docs/60_exploration-and-research/README.md +87 -0
- package/docs/60_exploration-and-research/bun-compile-cordis-runtime-bootstrap-research.md +348 -0
- package/docs/60_exploration-and-research/dsh-mobile-spa-ios-input-experience-research.md +160 -0
- package/lib/index.d.ts +9 -1
- package/lib/index.js +258 -6
- package/package.json +1 -1
- package/docs/REPL-/345/267/245/345/205/267/350/260/203/347/224/250-/346/210/252/346/226/255/350/257/212/346/226/255.md +0 -110
- package/docs/adr/0001-bridge-tool-layer-not-service-layer.md +0 -14
- package/docs/adr/0002-masking-is-presentation-only.md +0 -15
- package/docs/plans/A2A-messaging-channel-test-archive.md +0 -256
- package/docs/plans/code-mode-vs-rlm-ipython-comparison.md +0 -137
- package/docs/plans/dashr-blueprint-review.md +0 -201
- package/docs/plans/dashr-blueprint.md +0 -561
- package/docs/plans/dashr-compaction-window-and-archive.md +0 -307
- package/docs/plans/dashr-profile-layer-feasibility.md +0 -367
- package/docs/plans/dashr-sandbox-escalation-semantics-gap.md +0 -171
- package/docs/plans/dashr-security-sandbox-analysis.md +0 -187
- package/docs/plans/dashr-surface-invariant-and-omp-imports.md +0 -97
- package/docs/plans/ipython-kernel-interactive-interface-test-report.md +0 -152
- package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft.md +0 -146
- package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft_v3.md +0 -50
- package/docs/plans/kernel-refactoring/Dash-IPython-Control-Prompt-draft_v4.md +0 -79
- package/docs/plans/kernel-refactoring/Dash-vs-PrimeAgent-systemprompt-toolcatalog-comparison.md +0 -138
- package/docs/plans/kernel-refactoring/RLM-system-prompt-injection-gap-report.md +0 -161
- package/docs/plans/kernel-refactoring/V0.1.5-development-plan.md +0 -109
- package/docs/plans/kernel-refactoring/actinoable-surface-to-llm-in-agent-runtime_dsh.md +0 -50
- package/docs/plans/kernel-refactoring/actinoable-surface-to-llm-in-agent-runtime_prime.md +0 -113
- package/docs/plans/recallable-compaction.md +0 -147
- package/docs/plans/spike-tag-repro.mjs +0 -102
- package/docs/plans/upstream-analysis.md +0 -128
- package/docs/v0.1.8-improved-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -142
- package/docs/v0.1.8-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -193
- package/docs/v0.1.8b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -96
- package/docs/v0.1.8c-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -127
- package/docs/v0.1.8d-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -150
- package/docs/v0.1.8d_artifacts/README.md +0 -138
- package/docs/v0.1.8d_artifacts/code-mode-repl-only.observation.md +0 -74
- package/docs/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.jsonl +0 -3890
- package/docs/v0.1.8d_artifacts/dsh-session-session-4a293388-9ae1-474b-87a0-9e17bb556d94.w-sample-0435.jsonl +0 -544
- package/docs/v0.1.8d_artifacts/functions.json +0 -592
- package/docs/v0.1.8d_artifacts/skills-catalog.snapshot.md +0 -30
- package/docs/v0.1.8d_artifacts/tools-sdk.output-schemas.json +0 -1236
- package/docs/v0.1.8d_artifacts/tools-sdk.python.txt +0 -592
- package/docs/v0.1.8d_artifacts/tools-sdk.typescript.txt +0 -516
- package/docs/v0.1.8d_artifacts/wire-vs-transcription.diff.md +0 -54
- package/docs/v0.1.8e-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -224
- package/docs/v0.1.9a-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -168
- package/docs/v0.2.0b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -123
- package/docs/v0.2.0b_artifacts/f2probe/Cargo.lock +0 -7
- package/docs/v0.2.0b_artifacts/f2probe/Cargo.toml +0 -6
- package/docs/v0.2.0b_artifacts/f2probe/src/bin/messy.rs +0 -8
- package/docs/v0.2.0b_artifacts/f2probe/src/main.rs +0 -4
- package/docs/v0.2.0b_artifacts/hashline-probe.md +0 -5
- package/docs/v0.2.0b_artifacts/slowprobe/Cargo.lock +0 -7
- package/docs/v0.2.0b_artifacts/slowprobe/Cargo.toml +0 -7
- package/docs/v0.2.0b_artifacts/slowprobe/build.rs +0 -4
- package/docs/v0.2.0b_artifacts/slowprobe/src/main.rs +0 -13
- package/docs/v0.2.1-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -110
- package/docs/v0.2.1b-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -86
- package/docs/v0.2.1c-/345/256/236/346/265/213/346/212/245/345/221/212.md +0 -66
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# Web 前端空间可组合性调研
|
|
2
|
+
|
|
3
|
+
> 记录:2026-08-25 · 一手核验:MDN Web Components/Custom Elements/DSD 文档、webpack
|
|
4
|
+
> Module Federation 官方 docs、module-federation.io、native-federation.com、Angular DI
|
|
5
|
+
> 官方指南、qiankun/wujie 源码级对比(掘金 deep-dive)、htmx 官方 essays、Islands
|
|
6
|
+
> Architecture(Bridgetown / islands-architecture.com)。
|
|
7
|
+
> 本文是 `../01-cordis-runtime/cordis-research.md` 的 Web 侧对照:把 Cordis 的"时空可组合性"结论拿到浏览器端,
|
|
8
|
+
> 回答"HTML 前端能不能也做到模块即插即用(先只看空间维)"。
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. 一句话结论
|
|
13
|
+
|
|
14
|
+
**能,且分三层粒度,但空间维被浏览器"半完成"了:**
|
|
15
|
+
- **时间维(可逆效应 / 即插即拔)**——浏览器**原生已实现**:Custom Element 的
|
|
16
|
+
`connectedCallback` / `disconnectedCallback` 就是一对平台级的可逆效应(插=setup,拔=teardown,
|
|
17
|
+
元素移出 DOM 即触发、重新插入再触发,甚至元素 *移动* 都会重跑一遍)。
|
|
18
|
+
- **空间维(反应式余效应 / 依赖→激活停用)**——**只完成了一半**:
|
|
19
|
+
- 「封装 + 组合」这半(Shadow DOM、`<slot>` 投影、`::part`、CSS custom properties、scoped
|
|
20
|
+
registry)**原生已实现**;
|
|
21
|
+
- 「依赖声明 → 自动拓扑 → 依赖齐/缺自动激活/停用」这半(Cordis 的 `inject` + `epoch`)——
|
|
22
|
+
**浏览器没有原生对应,也没有哪个框架做到反应式**。最接近的是 Module Federation 的
|
|
23
|
+
share scope(运行时依赖协商,但只在 bootstrap 一次性、按 semver 匹配、app 粒度、非反应式)。
|
|
24
|
+
|
|
25
|
+
**判定**:把 Cordis 的 `epoch`(依赖满足度签名 → 提供者撤走依赖者先停、回归自动恢复)搬到
|
|
26
|
+
浏览器,是当前 Web 生态的**真空区**。这也是"Web 版 Cordis"最值钱的研究方向。
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 2. 三层粒度测绘
|
|
31
|
+
|
|
32
|
+
HTML 前端的"模块"有三个正交的粒度,各有一套即插即用机制,别混为一谈:
|
|
33
|
+
|
|
34
|
+
| 粒度 | 单元 | 即插即用机制 | 代表 |
|
|
35
|
+
|---|---|---|---|
|
|
36
|
+
| **元素/组件层** | 单个自定义元素 | Custom Elements + Shadow DOM + slot + scoped registry | `<video>`、Shoelace、Lit |
|
|
37
|
+
| **应用层** | 独立构建/部署的前端应用 | Module Federation / single-spa / qiankun / wujie / iframe | 微前端 |
|
|
38
|
+
| **岛屿层** | 页面里一块独立水合的 SSR 区域 | DSD + partial hydration + `connectedCallback` | Astro、Bridgetown |
|
|
39
|
+
|
|
40
|
+
三层不是互斥,是叠加:一个微前端(应用层)内部用 Web Components(元素层)组装,页面壳用
|
|
41
|
+
Islands(岛屿层)做选择性水合。Cordis 的"space dimension"在浏览器里被摊到了这三层上。
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 3. 空间维映射(Cordis → Web 逐项对照)
|
|
46
|
+
|
|
47
|
+
Cordis 空间维 = **Reactive Coeffects**:组件声明依赖(`inject`)→ 自动拓扑编排 → 依赖齐
|
|
48
|
+
ACTIVE、缺 INACTIVE、提供者撤走依赖者先停、回归自动恢复。逐项找 Web 对应:
|
|
49
|
+
|
|
50
|
+
| Cordis 概念 | Web 对应 | 是否原生 | 缺口 |
|
|
51
|
+
|---|---|---|---|
|
|
52
|
+
| `Context`(运行时 proxy,属性走服务解析器) | 全局 registry / import map / Angular root injector | 部分 | 无"作用域 proxy 透明代理服务" |
|
|
53
|
+
| `inject`(依赖声明) | Angular 构造器注入 / React `useContext` / import specifier / MF `shared` | ✅ | 语义等价,但**绑定即终态**,不响应变化 |
|
|
54
|
+
| `ReflectService`(`provide`/`inject` 服务解析) | **Angular 分层注入器**(ElementInjector / EnvironmentInjector) | ✅ | 最接近的单体;但图是静态的 |
|
|
55
|
+
| `Service`(`super(ctx,name)` 注册 + 随 fiber 卸载自动注销) | Angular `providers:[...]` + 组件销毁→服务销毁 | ✅ | 生命周期销毁对齐;无"重新提供" |
|
|
56
|
+
| **`epoch`(依赖满足度签名 → 激活/停用)** | **无原生对应** | ❌ | **核心真空**(见 §5) |
|
|
57
|
+
| 提供者撤走→依赖者先停→回归自动恢复 | single-spa `activeWhen`(仅路由谓词);无通用版 | ❌ | 仅路由键,非依赖键 |
|
|
58
|
+
| Scoped registry(作用域内定义) | **Scoped Custom Element Registries**(`CustomElementRegistry()` 构造器) | ✅(新) | 最干净的平行项,见下 |
|
|
59
|
+
| 上层 patch 按 id 整行替换插件 | Angular `{provide: X, useClass: Y}` provider override | ✅ | 子树级覆盖,静态声明 |
|
|
60
|
+
|
|
61
|
+
**Scoped Custom Element Registries 是最新、最干净的原生平行项**:它让一个 shadow tree 有自己
|
|
62
|
+
独立的元素定义表,不同子树可定义同名元素互不冲突——这正是 Cordis `Context.extend()` /
|
|
63
|
+
`isolate()` 作用域在 DOM 侧的镜像。2019 年前只有全局 `customElements` 单例,跨库组合必撞名;
|
|
64
|
+
现在作用域注册表把"组合"变成浏览器内置能力。
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 4. 时间维映射(可逆效应)
|
|
69
|
+
|
|
70
|
+
Cordis 时间维 = **Revertible Effects**:每次上下文修改配显式逆函数,叠成撤销链,卸载时反向
|
|
71
|
+
执行(LIFO)。
|
|
72
|
+
|
|
73
|
+
| Cordis | Web 对应 | 性质 |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| `Fiber.effect(execute, label)` → 收集 disposer | `connectedCallback()`(setup) | 平台级 effect |
|
|
76
|
+
| 卸载时 disposers **逆序 LIFO**(`splice(0).reverse()`) | `disconnectedCallback()`(teardown)+ DOM 树移除天然后序 | 平台级逆函数 |
|
|
77
|
+
| 元素移动重跑 | `adoptedCallback` / 移动触发重 connected/disconnected | 比 Cordis 更激进 |
|
|
78
|
+
| single-spa `bootstrap→mount→unmount→unload` | 微前端显式可逆效应(Promise 化) | 框架级 effect/disposer |
|
|
79
|
+
|
|
80
|
+
**判定**:时间维在浏览器是**原生完成且免费**的——浏览器自己保证 `disconnectedCallback` 在元素
|
|
81
|
+
离开 DOM 时被调,不管元素是被 `innerHTML` 覆盖、被别的代码 `remove()`、还是整个子树被替换。
|
|
82
|
+
这正是 htmx 社区那句"everything in htmx has a DOM-based lifecycle"能成立的原因。**即插即拔这个
|
|
83
|
+
诉求,Web 从 2018 年起就已经交付了。**
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 5. 关键缺口:反应式依赖激活(`epoch`)为何 Web 没有
|
|
88
|
+
|
|
89
|
+
这是全文的题眼。Cordis 空间维的皇冠是 `epoch`:每个 fiber 持有一个"依赖满足度签名",遍历每个
|
|
90
|
+
`inject` 声明,任一缺失 → INACTIVE → `_unload()`;全部存在 → 激活;提供者 uid 变化 → 依赖者先
|
|
91
|
+
unload 再 reload。**这是运行时、持续、反应式的**。
|
|
92
|
+
|
|
93
|
+
Web 为什么没有:
|
|
94
|
+
|
|
95
|
+
1. **Web 的依赖单元是 ES module,静态、构建期解析**。`import` 绑定即终态,没有"服务"这个可以
|
|
96
|
+
在运行时上线/下线的概念。Cordis 有 `Service`(注册即提供、随 fiber 卸载即注销),浏览器
|
|
97
|
+
DOM 里没有等价物。
|
|
98
|
+
2. **仅有的运行时依赖协商是一次的**:Module Federation 的 share scope(`singleton`/`requiredVersion`/
|
|
99
|
+
`strictVersion`)和 Native Federation 的 import map 都是在**宿主 bootstrap 时**合并一次、
|
|
100
|
+
按 semver 匹配后固化。没有"某个 shared 依赖之后被移除 → 消费它的 remote 自动卸载"这回事。
|
|
101
|
+
3. **仅有的反应式激活是路由键的**:single-spa 的 `activeWhen` 谓词在路由变化时
|
|
102
|
+
mount/unmount,但键是 **URL**,不是**依赖**。没有框架拿"某个服务/能力是否在线"当激活键。
|
|
103
|
+
|
|
104
|
+
**推论(非事实,标记为待证)**:要在浏览器补上 `epoch`,最小改动路径是——
|
|
105
|
+
- 用一个运行时"服务注册表"(service registry)+ 自定义元素上的依赖声明属性(如
|
|
106
|
+
`<x-panel requires="ctx.llm ctx.tools">`),
|
|
107
|
+
- 服务上线/下线时触发一次拓扑重算,把依赖缺失的元素 `disconnectedCallback` 掉、依赖回归时重新
|
|
108
|
+
`connectedCallback`。
|
|
109
|
+
- 这套东西用原生 Custom Elements 生命周期 + Scoped Registry + 一个 observer 就能搭出来,不需要
|
|
110
|
+
改浏览器。**换句话说:Cordis 的空间维,浏览器已经备齐了所有原料(时间维免费的、组合原生的),
|
|
111
|
+
只差"谁把依赖图接上生命周期"这一小段胶水。** 这就是"Web 版 Cordis"的定义。
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 6. 竞品矩阵(空间可组合性维度)
|
|
116
|
+
|
|
117
|
+
按"同时具备 时间维可逆 + 空间维封装 + 空间维反应式依赖"三维打分:
|
|
118
|
+
|
|
119
|
+
| 方案 | 语言 | 时间维(可逆) | 空间维·封装组合 | 空间维·反应式依赖 | 免重启装卸 |
|
|
120
|
+
|---|---|---|---|---|---|
|
|
121
|
+
| **Custom Elements + Shadow DOM**(原生) | JS | ✅ connected/disconnected | ✅ slot/::part/scoped registry | ❌ | ✅ |
|
|
122
|
+
| **Angular 分层 DI** | TS | ✅ ngOnDestroy/scope teardown | 部分(组件树) | ❌(静态图) | 部分 |
|
|
123
|
+
| **single-spa** | JS | ✅ mount/unmount | ❌(靠 iframe/WC 补) | ⚠️ 仅路由键 activeWhen | ✅ |
|
|
124
|
+
| **Module Federation**(1.0/2.0) | JS | ❌(无卸载语义) | ❌ | ⚠️ share scope 一次性协商 | ❌ |
|
|
125
|
+
| **Native Federation**(import map + ESM) | JS | ❌ | ❌ | ⚠️ externals registry 一次性去重 | ❌ |
|
|
126
|
+
| **qiankun**(single-spa + Proxy 沙箱) | JS | ✅ 继承 single-spa | ✅ Shadow/scoped CSS | ❌ | ✅ |
|
|
127
|
+
| **wujie**(iframe + Web Components + Proxy) | JS | ✅ | ✅ 原生 iframe 隔离 | ❌ | ✅(保活) |
|
|
128
|
+
| **Astro / Bridgetown Islands** | JS/Ruby | ✅ island 独立水合 | ✅ DSD 封装 | ❌ | ✅ |
|
|
129
|
+
| **htmx + Web Components** | JS/HTML | ✅ DOM 生命周期 | ✅(可选 shadow) | ❌ | ✅ |
|
|
130
|
+
| **Cordis**(参照系) | TS | ✅ `effect` LIFO | ✅ `inject`+scoped ctx | ✅ **`epoch` 反应式** | ✅ |
|
|
131
|
+
|
|
132
|
+
**判定**:Web 生态在"时间维 + 空间维·封装"两项上完全覆盖 Cordis(且时间维还是原生免费的);
|
|
133
|
+
**全表唯一没有的,就是空间维·反应式依赖这一列**。整张表就 Cordis 一个 ✅。这就是差距,也是
|
|
134
|
+
"HTML 前端即插即用"这问题最诚实的答案:**即插即用(时间维)早就有了;依赖驱动的即插即用
|
|
135
|
+
(空间维)没有,且是所有主流前端框架共同的盲区。**
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## 7. 微前端沙箱的附带发现(与 Cordis 异构桥呼应)
|
|
140
|
+
|
|
141
|
+
`../01-cordis-runtime/cordis-research.md` §5 的结论是"跨语言 = 进程边界 + IPC 桥"。微前端沙箱是同一思想的 DOM 侧翻版:
|
|
142
|
+
|
|
143
|
+
- **qiankun 3.0**:`Proxy` + `with` + `Compartment` 三层模拟一个假 window(`Membrane` 拦截
|
|
144
|
+
get/set、`rebindTarget2Fn` 重绑 native 函数防 `Illegal invocation`、patch `addEventListener`/
|
|
145
|
+
`setInterval` 以便卸载时清理)。
|
|
146
|
+
- **wujie**:**隐藏 iframe 提供真实独立 window/document/history/location**(原生隔离),DOM 操作
|
|
147
|
+
经 Proxy 代理到 Shadow DOM。**这是"用原生沙箱(iframe)当隔离边界 + Proxy 当桥"**——与 Cordis
|
|
148
|
+
"Python 子进程 + fd3 帧协议"是同构的:**隔离靠真边界,桥接靠显式协议,消费者无感。**
|
|
149
|
+
|
|
150
|
+
对应关系:Cordis 的 `ctx.codeRuntime`(Python 子进程 + fd3)↔ 微前端的 iframe(子应用 window)
|
|
151
|
+
+ Proxy(DOM 桥)。都在说同一件事:**真隔离必须用运行时原生边界,桥是净新增的显式工作**。
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 8. 落到 dsh 的意义(为何这个调研现在做)
|
|
156
|
+
|
|
157
|
+
dsh 是 Web-first(`../01-cordis-runtime/cordis-research.md` 提过其 Web 表面像 DeepSeek 官方 chat 页,append-only
|
|
158
|
+
session log、trajectory view)。它的插件在 **Cordis 层**已实现时空可组合性,但它的**前端表面
|
|
159
|
+
**目前仍是单体页面(React/自研栈),插件对 UI 的贡献是硬编码的。
|
|
160
|
+
|
|
161
|
+
若要让 dsh 的"everything is plugin"穿透到 UI 层——即**插件自带前端面板、即插即用**——现成的三
|
|
162
|
+
条路:
|
|
163
|
+
1. **Web Components**:插件暴露 `<dsh-*>` 自定义元素,走原生 slot/::part 组合(元素层,最小侵入)。
|
|
164
|
+
2. **Islands**:SSR 壳 + 插件面板作为可选择性水合岛屿(岛屿层)。
|
|
165
|
+
3. **微前端**:重型插件独立构建,Module Federation / Native Federation 运行时装载(应用层)。
|
|
166
|
+
|
|
167
|
+
**判定**:元素层(Web Components)+ 岛屿层已能覆盖绝大多数插件 UI 诉求,且与 Cordis 的"最小
|
|
168
|
+
侵入、零特权核心"哲学一致——插件注册一个自定义元素就像注册一个 Cordis Service。真正的难点
|
|
169
|
+
仍在 §5:**若插件 UI 依赖某服务(如 `ctx.llm` 未配)而该服务下线,UI 面板要不要自动灰掉/卸载?
|
|
170
|
+
** 答案是当前 Web 生态做不到反应式,除非自建 §5 的"服务注册表 + 依赖声明 + observer"胶水。
|
|
171
|
+
这恰好是 Cordis 已有、而前端缺失的那一块。
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## 来源
|
|
176
|
+
|
|
177
|
+
- MDN:`Using custom elements`(含 Scoped Custom Element Registries、`:state()`、`::part`)、
|
|
178
|
+
`Web Components`、`Using templates and slots`、`Declarative Shadow DOM`(web.dev)
|
|
179
|
+
- webpack:`Module Federation` concepts(Container/ContainerReference、shared scope、singleton)
|
|
180
|
+
- module-federation.io(MF 2.0:Manifest / Federation Runtime / Runtime Plugin System)
|
|
181
|
+
- native-federation.com:`Runtime`(import map + externals registry 去重)、`Mental Model`、
|
|
182
|
+
`Architecture`(Core/Adapter/Runtime/Orchestrator 四层)
|
|
183
|
+
- single-spa:`bootstrap/mount/unmount/unload` 生命周期 + `activeWhen` 路由谓词
|
|
184
|
+
- qiankun(umijs/qiankun 3.0):Membrane/Compartment/Patchers 沙箱、strictStyleIsolation
|
|
185
|
+
- wujie(Tencent/wujie):iframe 原生隔离 + Web Components + Proxy 双容器架构
|
|
186
|
+
- Angular:`Hierarchical injectors`、`Defining dependency providers`(ElementInjector /
|
|
187
|
+
EnvironmentInjector / provider override / lazy-module injector / teardown)
|
|
188
|
+
- htmx:`Web Components Work Great with htmx`、`htmx.process(shadowRoot)`、shadow DOM host selector
|
|
189
|
+
- Islands:islands-architecture.com(Katie Sylor-Miller / Jason Miller)、Bridgetown DSD/Islands、
|
|
190
|
+
Codrops `Server-first Web Components with DSD, HTMX, and Islands`
|
|
191
|
+
- 掘金《Qiankun vs Wujie:微前端框架深度对比》(沙箱/隔离/插件系统源码级矩阵)
|