@anov/cic-standard-sdk 0.0.20 → 0.0.21
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/dist/cic-sdk.cjs.js +8 -7
- package/dist/cic-sdk.es.js +2731 -2461
- package/dist/cic-sdk.umd.js +8 -7
- package/dist/sdk/CICSDK.d.ts +5 -0
- package/dist/sdk/manifestLoader/index.d.ts +87 -0
- package/dist/sdk/render/index.d.ts +68 -6
- package/dist/types/components.d.ts +2 -4
- package/dist/types/index.d.ts +3 -3
- package/dist/types/manifest/adapter.d.ts +235 -0
- package/dist/types/manifest/cic.manifest.d.ts +476 -0
- package/dist/types/manifest/runtime.manifest.d.ts +549 -0
- package/package.json +1 -1
- package/dist/types/adapter.d.ts +0 -385
- package/dist/types/cic.manifest.d.ts +0 -367
- package/dist/types/runtime.manifest.d.ts +0 -265
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file runtime.manifest.ts
|
|
3
|
+
* @description Runtime 供给表(RuntimeManifest)+ 合并结果(ResolvedManifest)+ 报告(ResolutionReport)类型定义
|
|
4
|
+
*
|
|
5
|
+
* ┌─────────────────────────────────────────────────────────────────────┐
|
|
6
|
+
* │ 职责定位 │
|
|
7
|
+
* │ 本文件是"宿主侧视角"的完整声明,描述运行时环境能提供什么、 │
|
|
8
|
+
* │ 以何种物理形态提供、以及供需匹配后的最终结果。 │
|
|
9
|
+
* │ │
|
|
10
|
+
* │ 依赖关系: │
|
|
11
|
+
* │ 从 cic.manifest 导入基础枚举与原始类型(单一来源,避免重复定义) │
|
|
12
|
+
* │ CICManifest 的类型在 ResolvedManifest 中被引用 │
|
|
13
|
+
* └─────────────────────────────────────────────────────────────────────┘
|
|
14
|
+
*
|
|
15
|
+
* 导出内容分三组:
|
|
16
|
+
* 1. 供给表:GlobalBinding / EsmBinding / ProvideEntry / RuntimeManifest
|
|
17
|
+
* 2. 合并结果:ResolvedManifest / ResolutionReport / ResolutionEntry
|
|
18
|
+
* 3. 工具类型:LoaderOptions / window 全局扩展
|
|
19
|
+
*/
|
|
20
|
+
import type { CICManifest, EngineMode, EnginePlatform, EngineRuntime, EnvRecord, ImportMap, SemverRange, SemverString, Specifier, UrlPath, WindowPath } from './cic.manifest';
|
|
21
|
+
/**
|
|
22
|
+
* GlobalBinding 的文件格式声明(描述文件的物理格式)
|
|
23
|
+
*
|
|
24
|
+
* 'umd' —— UMD bundle,可直接用 <script src> 加载,
|
|
25
|
+
* 执行后自动挂载到 window(或 CommonJS exports)
|
|
26
|
+
* 'iife' —— IIFE bundle,立即执行函数,行为同 umd
|
|
27
|
+
* 'esm-global' —— ESM 语法的文件,但副作用是挂 window(特殊场景)
|
|
28
|
+
* 不能用 <script src>(浏览器拒绝非模块上下文加载 ESM)
|
|
29
|
+
* Loader 自动升级为 blob-script 加载方式
|
|
30
|
+
*
|
|
31
|
+
* format → 默认 loadMode 推导规则(resolveLoadMode 函数):
|
|
32
|
+
* 'umd' / 'iife' → 'script' → <script src>
|
|
33
|
+
* 'esm-global' → 'blob-script' → fetch → Blob URL → <script type="module">
|
|
34
|
+
*
|
|
35
|
+
* ⚠️ EsmBinding.format 固定为 'esm',不在此类型中。
|
|
36
|
+
* ⚠️ 推荐总是显式声明 format,避免 Loader 从文件名猜测(guessFormat 可能误判)。
|
|
37
|
+
*/
|
|
38
|
+
export type GlobalBindingFormat = 'umd' | 'iife' | 'esm-global';
|
|
39
|
+
/**
|
|
40
|
+
* 加载模式(单依赖级别),可覆盖 format 字段推导的默认值
|
|
41
|
+
*
|
|
42
|
+
* 'script' —— <script src>
|
|
43
|
+
* 适用:umd / iife 格式,同步执行,挂 window
|
|
44
|
+
* 'blob-script' —— fetch 源码 → Blob URL → <script type="module">
|
|
45
|
+
* 适用:esm-global 格式,或 shimB 阶段(importMap 未就绪时加载 ESM)
|
|
46
|
+
* ⚠️ 需要 CSP 允许 blob: 来源(script-src 'self' blob:)
|
|
47
|
+
* ⚠️ shimB 阶段此模式失败 → 直接报错,无 import() 回退
|
|
48
|
+
* 'import' —— 动态 import(url),可获取模块导出对象
|
|
49
|
+
* 适用:shimA 阶段(globalTask,importMap 已就绪后执行)
|
|
50
|
+
* shimA 阶段 blob-script 失败时可自动回退到 import()
|
|
51
|
+
*
|
|
52
|
+
* 优先级:loadMode 显式声明 > format 默认推导 > guessFormat 文件名猜测
|
|
53
|
+
*/
|
|
54
|
+
export type LoadMode = 'script' | 'blob-script' | 'import';
|
|
55
|
+
/**
|
|
56
|
+
* 全局依赖绑定:依赖以脚本形式加载,执行后挂载到 window
|
|
57
|
+
*
|
|
58
|
+
* 使用场景:
|
|
59
|
+
* - 宿主平台通过 CDN / 本地 vendor chunk 提供的 UMD 库
|
|
60
|
+
* - 需要向 window 挂全局变量供旧版代码(非 ESM)访问
|
|
61
|
+
* - 供 shimB 生成 data: URL shim(将 window.X 重新导出为 ESM)
|
|
62
|
+
*
|
|
63
|
+
* 典型配置示例(Vue global 形态):
|
|
64
|
+
* {
|
|
65
|
+
* window: 'Vue', // 挂到 window.Vue
|
|
66
|
+
* src: '/anov-dev-runtime/deps/vue.global.js', // 开发模式路径
|
|
67
|
+
* prodSrc: null, // 生产由宿主注入,Loader 不加载
|
|
68
|
+
* format: 'umd',
|
|
69
|
+
* loadMode: 'script'
|
|
70
|
+
* }
|
|
71
|
+
*/
|
|
72
|
+
export interface GlobalBinding {
|
|
73
|
+
/**
|
|
74
|
+
* 挂载到 window 上的属性路径,支持链式(如 'MyLib.Core')。
|
|
75
|
+
* Loader 用 getWindowPath(path) 读写,无需 eval。
|
|
76
|
+
*
|
|
77
|
+
* shimB 生成时使用此字段:
|
|
78
|
+
* const __m = window['Vue'] ← 来自 binding.window
|
|
79
|
+
*/
|
|
80
|
+
window: WindowPath;
|
|
81
|
+
/**
|
|
82
|
+
* 开发模式(mode === 'development')下的脚本路径。
|
|
83
|
+
* 通常是本地 devServer 或相对路径。
|
|
84
|
+
*/
|
|
85
|
+
src: UrlPath;
|
|
86
|
+
/**
|
|
87
|
+
* 生产模式(mode !== 'development')下的脚本路径。
|
|
88
|
+
* UrlPath —— 使用此路径加载
|
|
89
|
+
* null —— 生产由宿主环境注入,Loader 不发起加载,
|
|
90
|
+
* 但会调用 getWindowPath(window) 做存在性校验
|
|
91
|
+
* undefined(未填) —— 回退使用 src 字段
|
|
92
|
+
*
|
|
93
|
+
* 最佳实践:生产环境由 Nginx/CDN 统一注入时设为 null,
|
|
94
|
+
* 避免 Loader 重复加载已存在于页面的库。
|
|
95
|
+
*/
|
|
96
|
+
prodSrc?: UrlPath | null;
|
|
97
|
+
/**
|
|
98
|
+
* 文件格式声明。强烈建议显式填写,避免 guessFormat 误判。
|
|
99
|
+
* 格式 → 默认 loadMode 见 GlobalBindingFormat 注释。
|
|
100
|
+
*/
|
|
101
|
+
format?: GlobalBindingFormat;
|
|
102
|
+
/**
|
|
103
|
+
* 覆盖 format 推导的加载方式(单依赖级别)。
|
|
104
|
+
* 仅在 format 推导结果不符合预期时填写。
|
|
105
|
+
*
|
|
106
|
+
* 常见需求:某个文件扩展名看似 ESM,但实际是副作用挂全局
|
|
107
|
+
* format: 'esm-global', loadMode: 'blob-script' // 通常 format 已蕴含此推导
|
|
108
|
+
*/
|
|
109
|
+
loadMode?: LoadMode;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* ESM 依赖绑定:依赖注册到 importMap,通过 import specifier 消费
|
|
113
|
+
*
|
|
114
|
+
* 使用场景:
|
|
115
|
+
* - 现代 ESM 项目,应用代码通过 import { ref } from 'vue' 消费
|
|
116
|
+
* - 供 shimA 生成(import() 后挂到 window)
|
|
117
|
+
*
|
|
118
|
+
* 典型配置示例(Vue ESM 形态):
|
|
119
|
+
* {
|
|
120
|
+
* specifier: 'vue',
|
|
121
|
+
* src: '/anov-dev-runtime/deps/vue.esm-browser.js',
|
|
122
|
+
* prodSrc: '/anov-prod-runtime/deps/vue.esm-browser.js',
|
|
123
|
+
* format: 'esm',
|
|
124
|
+
* loadMode: 'import'
|
|
125
|
+
* }
|
|
126
|
+
*/
|
|
127
|
+
export interface EsmBinding {
|
|
128
|
+
/**
|
|
129
|
+
* 注册到 importMap.imports 的 key(import specifier)。
|
|
130
|
+
* resolveManifest 会将此 specifier 映射到对应的 URL:
|
|
131
|
+
* importMap.imports[specifier] = pickUrl(mode, binding)
|
|
132
|
+
*/
|
|
133
|
+
specifier: Specifier;
|
|
134
|
+
/** 开发模式下的 ESM 文件路径 */
|
|
135
|
+
src: UrlPath;
|
|
136
|
+
/**
|
|
137
|
+
* 生产模式下的路径。
|
|
138
|
+
* null —— 生产由宿主 importMap 提供,resolveManifest 不写入 imports
|
|
139
|
+
* undefined —— 回退使用 src
|
|
140
|
+
*/
|
|
141
|
+
prodSrc?: UrlPath | null;
|
|
142
|
+
/**
|
|
143
|
+
* 固定为 'esm',不可变更。
|
|
144
|
+
* readonly 确保类型安全,防止运行时修改。
|
|
145
|
+
*/
|
|
146
|
+
readonly format: 'esm';
|
|
147
|
+
/**
|
|
148
|
+
* 覆盖默认加载方式(通常不需要填写,保留给特殊场景)。
|
|
149
|
+
* shimA 阶段:'import' 是默认且推荐的值
|
|
150
|
+
* 特殊场景:某些 ESM 文件有副作用但不导出,用 'blob-script' 加载
|
|
151
|
+
*/
|
|
152
|
+
loadMode?: LoadMode;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* 单依赖的供给形态组合
|
|
156
|
+
*
|
|
157
|
+
* 两种都有(最优):Loader 直连满足所有 consume 需求,无 shim 开销
|
|
158
|
+
* 只有 global:
|
|
159
|
+
* - consume='global' → direct-global(loadScript)
|
|
160
|
+
* - consume='esm' → shimB(loadScript + buildShimB 生成 data: URL)
|
|
161
|
+
* 只有 esm:
|
|
162
|
+
* - consume='esm' → direct-esm(importMap 直连)
|
|
163
|
+
* - consume='global' → shimA(import() 后 setWindowProp)
|
|
164
|
+
*
|
|
165
|
+
* ⚠️ 至少声明一种,否则 resolveManifest 抛出错误。
|
|
166
|
+
*/
|
|
167
|
+
export interface ProvideBindings {
|
|
168
|
+
global?: GlobalBinding;
|
|
169
|
+
esm?: EsmBinding;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 依赖的导出接口声明(仅 shimB 场景需要)
|
|
173
|
+
*
|
|
174
|
+
* shimB 生成的 data: URL shim 代码结构:
|
|
175
|
+
* const __m = window['Vue'] ← 从 window 读取全局对象
|
|
176
|
+
* export default __m ← 当 default=true 时生成
|
|
177
|
+
* export const { ref, reactive } = __m ← 来自 named 列表
|
|
178
|
+
*
|
|
179
|
+
* 若不填此字段(exports=undefined 或 named=[]):
|
|
180
|
+
* - shim 只有 default export
|
|
181
|
+
* - import { ref } from 'vue' → ref 为 undefined(静默失败!)
|
|
182
|
+
* - Loader 会发出 warning,但不中止流程
|
|
183
|
+
*
|
|
184
|
+
* 建议:对所有可能走 shimB 的依赖(只有 global binding),
|
|
185
|
+
* 务必声明完整的 exports.named 列表。
|
|
186
|
+
*/
|
|
187
|
+
export interface ExportsDeclaration {
|
|
188
|
+
/**
|
|
189
|
+
* 具名导出列表,用于生成:
|
|
190
|
+
* export const { ref, reactive, computed, ... } = __m
|
|
191
|
+
*
|
|
192
|
+
* 应包含应用代码实际用到的所有具名导出,
|
|
193
|
+
* 不需要覆盖全部导出,只覆盖用到的即可(减少 shim 体积)。
|
|
194
|
+
*/
|
|
195
|
+
named: string[];
|
|
196
|
+
/**
|
|
197
|
+
* 是否有 default export,用于生成:
|
|
198
|
+
* export default __m
|
|
199
|
+
*
|
|
200
|
+
* 注意:pinia 没有 default export(default=false),
|
|
201
|
+
* 若设为 true 会导致 import Pinia from 'pinia' 异常。
|
|
202
|
+
*/
|
|
203
|
+
default: boolean;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* 单依赖的完整供给描述(RuntimeManifest.provides 的值类型)
|
|
207
|
+
*
|
|
208
|
+
* 设计意图:
|
|
209
|
+
* 供给表只声明"我有什么",不关心消费方"要什么"。
|
|
210
|
+
* Loader 在 resolveManifest 时将供给 × 需求做笛卡尔积匹配。
|
|
211
|
+
*/
|
|
212
|
+
export interface ProvideEntry {
|
|
213
|
+
/**
|
|
214
|
+
* 实际提供的版本号(semver string,具体值,非范围)。
|
|
215
|
+
* resolveManifest 用 checkVersion(provided.version, ext.version) 校验。
|
|
216
|
+
*
|
|
217
|
+
* 示例:'3.4.21'(正确)
|
|
218
|
+
* '^3.0.0'(错误,此处不接受范围)
|
|
219
|
+
*/
|
|
220
|
+
version: SemverString;
|
|
221
|
+
/**
|
|
222
|
+
* 导出接口声明(shimB 场景必填)。
|
|
223
|
+
*
|
|
224
|
+
* 若该依赖只有 global binding,且有 esm 消费需求,
|
|
225
|
+
* 必须填写此字段,否则生成的 shim 缺少具名导出。
|
|
226
|
+
*
|
|
227
|
+
* 若两种 binding 都有(direct 路径),此字段可不填。
|
|
228
|
+
*/
|
|
229
|
+
exports?: ExportsDeclaration;
|
|
230
|
+
/**
|
|
231
|
+
* 供给形态,至少声明一种。
|
|
232
|
+
* 两种都有是"理想态",性能最优,无 shim 开销。
|
|
233
|
+
* 只有一种时,Loader 自动生成对应 shim(shimA 或 shimB)。
|
|
234
|
+
*/
|
|
235
|
+
bindings: ProvideBindings;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Runtime 供给清单(宿主侧,由平台运维/构建工具维护)
|
|
239
|
+
*
|
|
240
|
+
* 字段分组:
|
|
241
|
+
* version —— manifest 格式版本,用于 Loader 兼容判断
|
|
242
|
+
* engine —— 宿主运行时能力描述(平台/框架/版本/模式)
|
|
243
|
+
* provides —— 依赖供给表(核心:宿主能提供什么)
|
|
244
|
+
* importMap —— 基础路径前缀映射(cdn/ 等)
|
|
245
|
+
* env —— 默认环境变量(可被 cic.env 覆盖)
|
|
246
|
+
* preload —— 运行时核心 chunk 预加载列表
|
|
247
|
+
* entry —— 默认应用入口模块路径
|
|
248
|
+
* extensions —— 业务扩展字段
|
|
249
|
+
*
|
|
250
|
+
* 生命周期:
|
|
251
|
+
* 由 manifest-loader 在页面启动时 fetch,
|
|
252
|
+
* 与 cic.manifest 一起传入 resolveManifest(),
|
|
253
|
+
* 结果写入 window.__MANIFEST__。
|
|
254
|
+
*/
|
|
255
|
+
export interface RuntimeManifest {
|
|
256
|
+
/**
|
|
257
|
+
* manifest 格式版本(semver),供 Loader 做格式兼容判断。
|
|
258
|
+
* 当前稳定版本:'2.0.0'
|
|
259
|
+
*/
|
|
260
|
+
version: SemverString;
|
|
261
|
+
/**
|
|
262
|
+
* 宿主运行时能力描述
|
|
263
|
+
*/
|
|
264
|
+
engine: {
|
|
265
|
+
platform: EnginePlatform;
|
|
266
|
+
runtime: EngineRuntime;
|
|
267
|
+
/**
|
|
268
|
+
* 宿主提供的框架实际版本(semver string)。
|
|
269
|
+
* resolveManifest 用此版本与 cic.modules.requires[].version 校验。
|
|
270
|
+
* 强烈建议填写,未填则所有版本校验结果为 'unknown'。
|
|
271
|
+
*/
|
|
272
|
+
version: SemverString;
|
|
273
|
+
/**
|
|
274
|
+
* 运行模式,决定 Loader 选 binding.src 还是 binding.prodSrc。
|
|
275
|
+
* development → 使用 src(本地/devServer 路径)
|
|
276
|
+
* production → 使用 prodSrc(CDN / 部署路径)
|
|
277
|
+
* staging → 使用 prodSrc,但可开启额外日志
|
|
278
|
+
*
|
|
279
|
+
* ⚠️ 可选(?),但不填时 Loader 默认按 'development' 处理(使用 src),
|
|
280
|
+
* 生产部署时务必设置为 'production',否则会加载开发服务器路径。
|
|
281
|
+
*/
|
|
282
|
+
mode?: EngineMode;
|
|
283
|
+
/**
|
|
284
|
+
* 开发服务器基础 URL(仅 development 模式有效)。
|
|
285
|
+
* 用于将相对路径转换为绝对 URL(适配 devServer proxy)。
|
|
286
|
+
* 区别于 CICManifest.modules.baseURL(应用模块路径前缀)。
|
|
287
|
+
*
|
|
288
|
+
* 示例:'http://localhost:5173'
|
|
289
|
+
*/
|
|
290
|
+
devServerURL?: string;
|
|
291
|
+
};
|
|
292
|
+
/**
|
|
293
|
+
* 依赖供给表(宿主能提供的所有依赖)
|
|
294
|
+
* key:依赖 id,通常与 npm 包名一致(如 'vue' '@anov/charts')
|
|
295
|
+
* value:依赖的版本 + 导出声明 + 供给形态
|
|
296
|
+
*
|
|
297
|
+
* resolveManifest 遍历 cic.modules.requires,对每条 external:
|
|
298
|
+
* 1. 查找 provides[external.id]
|
|
299
|
+
* 2. 若不存在 → host-injected 检查
|
|
300
|
+
* 3. 若存在 → 版本校验 → 供需匹配 → 决策 strategy
|
|
301
|
+
*/
|
|
302
|
+
provides: Record<string, ProvideEntry>;
|
|
303
|
+
/**
|
|
304
|
+
* 基础 importMap(路径前缀 / 全局别名映射)。
|
|
305
|
+
* 不直接承载具体依赖的 specifier 映射(由供需匹配动态生成)。
|
|
306
|
+
*
|
|
307
|
+
* 典型用途:
|
|
308
|
+
* { 'cdn/': '/anov-prod/mgt/ui/' } → 路径前缀映射
|
|
309
|
+
* { '@/': '/src/' } → 开发别名(通常由 cic.modules.alias 处理)
|
|
310
|
+
*
|
|
311
|
+
* 合并优先级(最低):此字段被供需生成映射和 cic 显式映射覆盖。
|
|
312
|
+
*/
|
|
313
|
+
importMap?: ImportMap;
|
|
314
|
+
/**
|
|
315
|
+
* 默认环境变量(可被 CICManifest.env 覆盖同名字段)。
|
|
316
|
+
* 合并结果写入 window.__ENV__ 和 ResolvedManifest.env。
|
|
317
|
+
*
|
|
318
|
+
* 示例:{ NODE_ENV: 'development', APP_NAME: 'CIC Runtime', ENABLE_DEVTOOLS: true }
|
|
319
|
+
*/
|
|
320
|
+
env?: EnvRecord;
|
|
321
|
+
/**
|
|
322
|
+
* importMap 注入后需要预加载的模块路径列表(运行时核心 chunk)。
|
|
323
|
+
*
|
|
324
|
+
* ⚠️ 重要:不能写在 HTML 的 <link rel="modulepreload"> 里!
|
|
325
|
+
* 原因:HTML 解析阶段触发 modulepreload 时 importMap 尚未注入,
|
|
326
|
+
* module graph 解析 specifier 失败。
|
|
327
|
+
* 正确做法:由 manifest-loader 在 injectImportMap() 之后动态插入。
|
|
328
|
+
*
|
|
329
|
+
* 与 cic.modules.preload 合并去重后,统一由 Loader 的
|
|
330
|
+
* injectModulePreloads() 插入 <link rel="modulepreload">。
|
|
331
|
+
*/
|
|
332
|
+
preload?: UrlPath[];
|
|
333
|
+
/**
|
|
334
|
+
* 默认应用入口模块路径,可被 CICManifest.entry(如果存在)覆盖。
|
|
335
|
+
*
|
|
336
|
+
* 入口加载失败语义:
|
|
337
|
+
* - 触发 CustomEvent('manifest:error')
|
|
338
|
+
* - 中止流程,不重试,不走 fallback
|
|
339
|
+
* - 两者均未填 → resolveManifest 后 Loader 抛出错误
|
|
340
|
+
*/
|
|
341
|
+
entry?: UrlPath;
|
|
342
|
+
/** 预留扩展,Loader 不处理,原样透传到 ResolvedManifest.runtime.extensions */
|
|
343
|
+
extensions?: Record<string, unknown>;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* 供需匹配决策结果枚举
|
|
347
|
+
*
|
|
348
|
+
* 每条 CICRequires 经过 resolveManifest 后得到唯一一个 strategy:
|
|
349
|
+
*
|
|
350
|
+
* direct-esm 供给有 esm binding,消费需求含 'esm'
|
|
351
|
+
* → importMap.imports[specifier] = esm.src
|
|
352
|
+
*
|
|
353
|
+
* direct-global 供给有 global binding,消费需求含 'global'
|
|
354
|
+
* → Loader 调用 loadByFormat(global.src) 挂 window
|
|
355
|
+
*
|
|
356
|
+
* shimA 供给只有 esm binding,消费需求含 'global'
|
|
357
|
+
* → importMap 注入后,import(esm.src) 结果挂到 window.X
|
|
358
|
+
* → CSP 失败时自动回退 import()(importMap 已就绪)
|
|
359
|
+
*
|
|
360
|
+
* shimB 供给只有 global binding,消费需求含 'esm'
|
|
361
|
+
* → 先加载 global script,再生成 data: URL ESM shim
|
|
362
|
+
* → shimB 必须在 importMap 注入前完成(data: URL 在此阶段确定)
|
|
363
|
+
* → CSP 失败直接报错(无回退路径)
|
|
364
|
+
*
|
|
365
|
+
* host-injected runtime.provides 无记录,但 window.X 存在性校验通过
|
|
366
|
+
* → 假定宿主通过其他方式(HTML script / 框架注入)提供
|
|
367
|
+
* → 记录 warning,不生成任何 importMap 条目
|
|
368
|
+
*
|
|
369
|
+
* skipped required=false 且失败(版本不满足/加载失败/宿主未注入)
|
|
370
|
+
* → 跳过此依赖,记录 warning,继续执行
|
|
371
|
+
*/
|
|
372
|
+
export type ResolutionStrategy = 'direct-esm' | 'direct-global' | 'shimA' | 'shimB' | 'host-injected' | 'skipped';
|
|
373
|
+
/**
|
|
374
|
+
* 版本校验三态结果
|
|
375
|
+
*
|
|
376
|
+
* 'yes' provides[id].version 满足 external.version 范围
|
|
377
|
+
* 'no' 不满足;required=true 时中止,required=false 时 skipped
|
|
378
|
+
* 'unknown' version 字段缺失,或 semver 解析失败,无法判断
|
|
379
|
+
* → host-injected 场景下固定为 'unknown'(无供给版本可比较)
|
|
380
|
+
*/
|
|
381
|
+
export type VersionSatisfied = 'yes' | 'no' | 'unknown';
|
|
382
|
+
/**
|
|
383
|
+
* 单依赖的供需匹配结果记录
|
|
384
|
+
*
|
|
385
|
+
* 用途:
|
|
386
|
+
* - 开发调试:在 window.__MANIFEST__.report.entries 中查看每个依赖的决策过程
|
|
387
|
+
* - 性能监控:统计 shim 路径数量(shim 比 direct 有额外开销)
|
|
388
|
+
* - 版本告警:过滤 versionSatisfied='no' 的条目上报监控
|
|
389
|
+
*/
|
|
390
|
+
export interface ResolutionEntry {
|
|
391
|
+
/** 依赖 id,对应 CICRequires.id 和 RuntimeManifest.provides 的 key */
|
|
392
|
+
id: string;
|
|
393
|
+
/**
|
|
394
|
+
* 供需匹配决策结果。
|
|
395
|
+
* 决定 Loader 实际执行的加载/shim 路径,详见 ResolutionStrategy 注释。
|
|
396
|
+
*/
|
|
397
|
+
strategy: ResolutionStrategy;
|
|
398
|
+
/** 供给方实际版本(来自 provides[id].version),host-injected/skipped 时为 undefined */
|
|
399
|
+
providedVersion?: SemverString;
|
|
400
|
+
/** 需求方版本范围(来自 CICRequires.version),未声明时为 undefined */
|
|
401
|
+
requiredVersion?: SemverRange;
|
|
402
|
+
/** 版本校验三态结果,详见 VersionSatisfied 注释 */
|
|
403
|
+
versionSatisfied: VersionSatisfied;
|
|
404
|
+
/**
|
|
405
|
+
* ESM 场景:最终注册到 importMap.imports 的 specifier。
|
|
406
|
+
* strategy 为 direct-esm / shimB / shimA 时填充。
|
|
407
|
+
*/
|
|
408
|
+
finalSpecifier?: Specifier;
|
|
409
|
+
/**
|
|
410
|
+
* global 场景:最终挂载到 window 的属性路径。
|
|
411
|
+
* strategy 为 direct-global / shimA / host-injected 时填充。
|
|
412
|
+
*/
|
|
413
|
+
finalWindowKey?: WindowPath;
|
|
414
|
+
/**
|
|
415
|
+
* 最终解析到的 URL(物理路径或 data: URL)。
|
|
416
|
+
* direct-esm → esm.src 或 esm.prodSrc
|
|
417
|
+
* direct-global → global.src 或 global.prodSrc
|
|
418
|
+
* shimB → data:text/javascript,... (生成的 shim)
|
|
419
|
+
* shimA → esm.src(import() 的目标)
|
|
420
|
+
*/
|
|
421
|
+
finalUrl?: string;
|
|
422
|
+
/**
|
|
423
|
+
* 本条目产生的所有警告信息列表。
|
|
424
|
+
* 常见警告:
|
|
425
|
+
* - "版本不满足但 required=false,已跳过"
|
|
426
|
+
* - "exports.named 未声明,shimB 只有 default export"
|
|
427
|
+
* - "runtime 无供给记录,按 host-injected 处理"
|
|
428
|
+
*/
|
|
429
|
+
warnings: string[];
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* 本次 resolveManifest 过程的汇总报告
|
|
433
|
+
*
|
|
434
|
+
* 始终生成,写入 ResolvedManifest.report 和 window.__MANIFEST__.report。
|
|
435
|
+
* 调用方可通过 await window.__manifestReady 获取完整报告。
|
|
436
|
+
*/
|
|
437
|
+
export interface ResolutionReport {
|
|
438
|
+
/** ISO 8601 时间戳,如 "2026-03-23T08:00:00.000Z" */
|
|
439
|
+
timestamp: string;
|
|
440
|
+
/**
|
|
441
|
+
* 本次运行的引擎模式(来自 RuntimeManifest.engine.mode)。
|
|
442
|
+
* 用于区分开发/生产环境下的报告差异。
|
|
443
|
+
*/
|
|
444
|
+
mode: EngineMode;
|
|
445
|
+
/** 所有 CICRequires 条目的匹配结果列表(顺序与 cic.modules.requires 一致) */
|
|
446
|
+
entries: ResolutionEntry[];
|
|
447
|
+
/**
|
|
448
|
+
* 最终注入到页面的 importMap.imports 条目数量。
|
|
449
|
+
* 包含:runtime 基础映射 + 供需生成映射 + alias 展开 + cic 显式映射
|
|
450
|
+
*/
|
|
451
|
+
importMapSize: number;
|
|
452
|
+
/**
|
|
453
|
+
* 最终注入的 modulepreload 数量(runtime.preload + cic.modules.preload 去重后)。
|
|
454
|
+
* 用于监控预加载策略的覆盖范围。
|
|
455
|
+
*/
|
|
456
|
+
preloadCount: number;
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* resolveManifest() 的输出,Loader 将其写入 window.__MANIFEST__
|
|
460
|
+
*
|
|
461
|
+
* importMap 合并优先级(低 → 高):
|
|
462
|
+
* runtime.importMap.imports(基础前缀)
|
|
463
|
+
* < 供需匹配生成(direct-esm URL + shimB data: URL)
|
|
464
|
+
* < alias 展开(cic.modules.alias → imports)
|
|
465
|
+
* < cic.modules.importMap.imports(应用显式,最高优先级)
|
|
466
|
+
*
|
|
467
|
+
* scopes 深度合并(mergeScopes 函数,非 spread 整体覆盖):
|
|
468
|
+
* 同 scope key 下的 imports 按 key 级覆盖
|
|
469
|
+
*
|
|
470
|
+
* env 合并:{ ...runtime.env, ...cic.env }(cic 覆盖 runtime 同名字段)
|
|
471
|
+
*/
|
|
472
|
+
export interface ResolvedManifest {
|
|
473
|
+
/** 原始供给表(未修改,原样保留供调试用) */
|
|
474
|
+
runtime: RuntimeManifest;
|
|
475
|
+
/** 原始需求表(未修改,原样保留供调试用) */
|
|
476
|
+
cic: CICManifest;
|
|
477
|
+
/**
|
|
478
|
+
* 三方合并后的完整 importMap(含 scopes)。
|
|
479
|
+
* Loader 将此结构注入为 <script type="importmap">。
|
|
480
|
+
*/
|
|
481
|
+
importMap: ImportMap;
|
|
482
|
+
/**
|
|
483
|
+
* 合并后的环境变量。
|
|
484
|
+
* 同步写入 window.__ENV__,可直接通过 window.__ENV__.API_BASE_URL 访问。
|
|
485
|
+
*/
|
|
486
|
+
env: EnvRecord;
|
|
487
|
+
/**
|
|
488
|
+
* 供需匹配过程报告,始终生成。
|
|
489
|
+
* 用于调试、监控和验收。
|
|
490
|
+
* 访问方式:window.__MANIFEST__.report 或 const { report } = await window.__manifestReady
|
|
491
|
+
*/
|
|
492
|
+
report: ResolutionReport;
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* manifest-loader 初始化选项(传入 createManifestLoader)
|
|
496
|
+
*
|
|
497
|
+
* 所有字段均可选,提供合理默认值,零配置开箱即用。
|
|
498
|
+
*/
|
|
499
|
+
export interface LoaderOptions {
|
|
500
|
+
/** runtime.manifest.json 的 URL,默认 './runtime.manifest.json' */
|
|
501
|
+
runtimeUrl?: string;
|
|
502
|
+
/** cic.manifest.json 的 URL,默认 './cic.manifest.json' */
|
|
503
|
+
cicUrl?: string;
|
|
504
|
+
/**
|
|
505
|
+
* 单个任务网络加载的最大重试次数,默认 1(允许一次重试)。
|
|
506
|
+
* 重试粒度:单个 script / import() 加载(非整个 Adapter 生命周期阶段)。
|
|
507
|
+
* 0 表示不重试,直接报错。
|
|
508
|
+
*
|
|
509
|
+
* ⚠️ entry 加载失败不受此选项影响,直接触发 manifest:error,不重试。
|
|
510
|
+
*/
|
|
511
|
+
maxRetries?: number;
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* RuntimeManifest 完整配置示例
|
|
515
|
+
*
|
|
516
|
+
* 场景说明:
|
|
517
|
+
* - vue 同时提供 esm + global(两种都有,理想态,无 shim 开销)
|
|
518
|
+
* - @anov/charts 只有 esm(新内部库,只支持 ESM)
|
|
519
|
+
* - echarts 只有 global(老版本,只有 UMD,通过 CDN 加载)
|
|
520
|
+
* → 若应用 consume='esm',Loader 自动走 shimB 路径
|
|
521
|
+
*/
|
|
522
|
+
export declare const RuntimeManifestExample: RuntimeManifest;
|
|
523
|
+
declare global {
|
|
524
|
+
interface Window {
|
|
525
|
+
/**
|
|
526
|
+
* Loader 完成后可 await 的 Promise,resolve 值为 ResolvedManifest。
|
|
527
|
+
*
|
|
528
|
+
* 使用方式:
|
|
529
|
+
* const manifest = await window.__manifestReady
|
|
530
|
+
* // 此时 importMap 已注入,所有 external 依赖已就绪
|
|
531
|
+
*
|
|
532
|
+
* 注意:在 src/main.js 中无需 await,因为 main.js 本身由
|
|
533
|
+
* manifest-loader 在 Promise resolve 后 import(),
|
|
534
|
+
* 执行到 main.js 时 __MANIFEST__ 已经可以同步访问。
|
|
535
|
+
*/
|
|
536
|
+
__manifestReady: Promise<ResolvedManifest>;
|
|
537
|
+
/**
|
|
538
|
+
* Loader 完成后写入的完整解析结果(同步可访问)。
|
|
539
|
+
* 在 manifest:ready 事件触发后即可使用。
|
|
540
|
+
*/
|
|
541
|
+
__MANIFEST__: ResolvedManifest;
|
|
542
|
+
/**
|
|
543
|
+
* 合并后的环境变量(等同于 __MANIFEST__.env)。
|
|
544
|
+
* 独立提取为顶层字段,方便业务代码直接访问:
|
|
545
|
+
* const { API_BASE_URL } = window.__ENV__
|
|
546
|
+
*/
|
|
547
|
+
__ENV__: EnvRecord;
|
|
548
|
+
}
|
|
549
|
+
}
|