# 实现笔记 面向要改这个插件的人。[README](../README.md) 只讲使用;这里记 bundle 格式、宿主内部契约,以及当初的验证过程。 ## 加载链路 本包同时是两样东西: - **bundle**:`package.json` 的 `dsh.bundle.patch` 指向 `cordis.patch.yml`,插件管理器把它登记为 profile 的一个 bundle 层; - **client 插件**:`package.json` 的 `dsh.client` 声明 `platform: web`、`immediately: true` 与 inject 列表,宿主把 `exports["./client"]` 编进浏览器启动图。 `index.js` 必须存在(Loader 要 import 这个包的 host 导出),但它只是空 `apply()`——余额完全来自宿主账户子系统已有的 Remote。 ## 手写 lazy-CJS bundle 格式 `client.js` 不经构建,格式与官方模板一致: ```js window.__ModuleLoader__.load({ id: '@local/dsh-wallet-hud', // 必须等于包名 factory(require) { /* … */ return { inject: [...], apply(ctx) { /* … */ } } }, }) ``` 要点: - 加载器取的是**工厂的返回值**作为 `exports`(实现里就是 `exports: registered.factory(require)`),所以模板这种"返回 exports"的写法成立; - 工厂内所有 `require()` 必须落在浏览器基线模块表里:`react`、`react/jsx-runtime`、`react-dom`、`cordis`、`dsh-client-store`、`dsh-client-ui-slots`、`dsh-client-ui-primitives`、`dsh-client-ui-dockkit`。本插件只用前两个中的 `react` 与 primitives 的 `Tooltip`; - 样式在 `apply()` 里以 `