@lytjs/ssr 6.0.0
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/index.cjs +741 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +372 -0
- package/dist/index.d.ts +372 -0
- package/dist/index.mjs +722 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +50 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import { VNode } from '@lytjs/vdom';
|
|
2
|
+
import * as _lytjs_component from '@lytjs/component';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @lytjs/ssr - 服务端渲染
|
|
6
|
+
*
|
|
7
|
+
* 将 VNode 渲染为 HTML 字符串
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 渲染 VNode 为 HTML 字符串
|
|
12
|
+
*/
|
|
13
|
+
declare function renderToString(vnode: VNode | VNode[] | string | number | null | undefined): string;
|
|
14
|
+
/**
|
|
15
|
+
* 渲染完整的 HTML 页面
|
|
16
|
+
*/
|
|
17
|
+
declare function renderToHtml(vnode: VNode | VNode[], options?: {
|
|
18
|
+
title?: string;
|
|
19
|
+
lang?: string;
|
|
20
|
+
head?: string;
|
|
21
|
+
bodyAttrs?: Record<string, string>;
|
|
22
|
+
}): string;
|
|
23
|
+
declare const _default: {
|
|
24
|
+
renderToString: typeof renderToString;
|
|
25
|
+
renderToHtml: typeof renderToHtml;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @lytjs/ssr - 虚拟列表组件
|
|
30
|
+
*
|
|
31
|
+
* 高性能大数据列表渲染
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* 虚拟列表组件
|
|
35
|
+
*/
|
|
36
|
+
declare const VirtualList: _lytjs_component.ComponentOptions<Record<string, unknown>, Record<string, unknown>, Record<string, unknown>, Record<string, unknown>>;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @lytjs/ssr - 流式服务端渲染
|
|
40
|
+
*
|
|
41
|
+
* 将 VNode 渲染为 ReadableStream,支持分块发送和 Suspense 边界
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
/** 流式渲染配置选项 */
|
|
45
|
+
interface StreamRenderOptions {
|
|
46
|
+
/** 每个分块的最大字节数,默认 4096 */
|
|
47
|
+
chunkSize?: number;
|
|
48
|
+
/** Shell 就绪回调(Suspense 边界之前的初始内容已发送) */
|
|
49
|
+
onShellReady?: () => void;
|
|
50
|
+
/** 错误回调 */
|
|
51
|
+
onError?: (error: Error) => void;
|
|
52
|
+
}
|
|
53
|
+
/** 异步数据预取上下文 */
|
|
54
|
+
interface DataPrefetchContext {
|
|
55
|
+
/** 路由路径 */
|
|
56
|
+
path?: string;
|
|
57
|
+
/** 路由参数 */
|
|
58
|
+
params?: Record<string, string>;
|
|
59
|
+
/** 查询参数 */
|
|
60
|
+
query?: Record<string, string>;
|
|
61
|
+
}
|
|
62
|
+
/** 异步数据预取结果 */
|
|
63
|
+
interface PrefetchResult {
|
|
64
|
+
/** 预取的数据 */
|
|
65
|
+
data: Record<string, any>;
|
|
66
|
+
/** 数据过期时间(毫秒) */
|
|
67
|
+
ttl?: number;
|
|
68
|
+
}
|
|
69
|
+
/** 支持数据预取的组件接口 */
|
|
70
|
+
interface PrefetchableComponent {
|
|
71
|
+
/** 预取数据方法 */
|
|
72
|
+
prefetch?: (context: DataPrefetchContext) => Promise<PrefetchResult>;
|
|
73
|
+
}
|
|
74
|
+
/** 流式渲染增强选项 */
|
|
75
|
+
interface EnhancedStreamRenderOptions extends StreamRenderOptions {
|
|
76
|
+
/** 数据预取上下文 */
|
|
77
|
+
prefetchContext?: DataPrefetchContext;
|
|
78
|
+
/** 数据预取完成回调 */
|
|
79
|
+
onDataPrefetched?: (data: Record<string, any>) => void;
|
|
80
|
+
/** 是否启用渐进式水合 */
|
|
81
|
+
progressiveHydration?: boolean;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 将 VNode 渲染为 ReadableStream(流式服务端渲染)
|
|
85
|
+
*
|
|
86
|
+
* @description
|
|
87
|
+
* 将 VNode 树渲染为 HTML 并通过 ReadableStream 分块发送。
|
|
88
|
+
* 支持以下特性:
|
|
89
|
+
* - 按组件边界拆分 HTML 分块
|
|
90
|
+
* - 支持 Suspense 边界(先发送 shell,再发送异步内容)
|
|
91
|
+
* - 使用 TextEncoder 编码为 Uint8Array
|
|
92
|
+
* - 可配置分块大小和回调
|
|
93
|
+
*
|
|
94
|
+
* @param vnode - 要渲染的 VNode
|
|
95
|
+
* @param options - 流式渲染配置选项
|
|
96
|
+
* @returns ReadableStream<Uint8Array>
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* const stream = renderToStream(vnode, {
|
|
101
|
+
* chunkSize: 2048,
|
|
102
|
+
* onShellReady: () => console.log('Shell 已发送'),
|
|
103
|
+
* onError: (err) => console.error(err),
|
|
104
|
+
* });
|
|
105
|
+
*
|
|
106
|
+
* for await (const chunk of stream) {
|
|
107
|
+
* response.write(chunk);
|
|
108
|
+
* }
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
declare function renderToStream(vnode: VNode, options?: StreamRenderOptions): ReadableStream<Uint8Array>;
|
|
112
|
+
/**
|
|
113
|
+
* 将 VNode 渲染为异步 ReadableStream(支持异步组件和数据预取)
|
|
114
|
+
*
|
|
115
|
+
* @description
|
|
116
|
+
* 与 renderToStream 类似,但支持异步组件和数据预取。
|
|
117
|
+
* 遇到返回 Promise 的组件时先发送占位内容,等 Promise 解析后再发送实际内容。
|
|
118
|
+
*
|
|
119
|
+
* @param vnode - 要渲染的 VNode
|
|
120
|
+
* @param options - 流式渲染配置选项
|
|
121
|
+
* @returns ReadableStream<Uint8Array>
|
|
122
|
+
*/
|
|
123
|
+
declare function renderToStreamAsync(vnode: VNode, options?: EnhancedStreamRenderOptions): ReadableStream<Uint8Array>;
|
|
124
|
+
/**
|
|
125
|
+
* 增强型流式渲染(包含数据预取和渐进式水合)
|
|
126
|
+
*
|
|
127
|
+
* @description
|
|
128
|
+
* 完整的流式渲染解决方案,包含数据预取、渐进式水合等高级特性。
|
|
129
|
+
*
|
|
130
|
+
* @param vnode - 要渲染的 VNode
|
|
131
|
+
* @param options - 增强型流式渲染配置
|
|
132
|
+
* @returns Promise<{ stream: ReadableStream<Uint8Array>; dehydratedState: Record<string, any> }>
|
|
133
|
+
*/
|
|
134
|
+
declare function renderToStreamEnhanced(vnode: VNode, options?: EnhancedStreamRenderOptions): Promise<{
|
|
135
|
+
stream: ReadableStream<Uint8Array>;
|
|
136
|
+
dehydratedState: Record<string, any>;
|
|
137
|
+
}>;
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* @lytjs/ssr - 静态站点生成(SSG)
|
|
141
|
+
*
|
|
142
|
+
* 预渲染页面配置为静态 HTML 文件
|
|
143
|
+
*/
|
|
144
|
+
|
|
145
|
+
/** SSG 页面配置 */
|
|
146
|
+
interface SSGPage {
|
|
147
|
+
/** 页面路径,如 '/' 或 '/about' */
|
|
148
|
+
path: string;
|
|
149
|
+
/** 页面组件 VNode */
|
|
150
|
+
component: VNode;
|
|
151
|
+
/** 可选布局组件 */
|
|
152
|
+
layout?: VNode;
|
|
153
|
+
/** 页面头部信息 */
|
|
154
|
+
head?: {
|
|
155
|
+
/** 页面标题 */
|
|
156
|
+
title?: string;
|
|
157
|
+
/** 元信息键值对 */
|
|
158
|
+
meta?: Record<string, string>;
|
|
159
|
+
};
|
|
160
|
+
/** 额外的脚本标签 */
|
|
161
|
+
scripts?: string[];
|
|
162
|
+
/** 额外的样式标签 */
|
|
163
|
+
styles?: string[];
|
|
164
|
+
}
|
|
165
|
+
/** SSG 生成选项 */
|
|
166
|
+
interface SSGOptions {
|
|
167
|
+
/** 站点基础 URL,默认 '/' */
|
|
168
|
+
baseUrl?: string;
|
|
169
|
+
/** 输出目录,默认 'dist' */
|
|
170
|
+
outDir?: string;
|
|
171
|
+
/** 默认页面标题 */
|
|
172
|
+
defaultTitle?: string;
|
|
173
|
+
/** 默认语言 */
|
|
174
|
+
lang?: string;
|
|
175
|
+
/** 是否生成 sitemap */
|
|
176
|
+
generateSitemap?: boolean;
|
|
177
|
+
/** 站点名称(用于 sitemap) */
|
|
178
|
+
siteName?: string;
|
|
179
|
+
/** 是否使用哈希路由 */
|
|
180
|
+
hashMode?: boolean;
|
|
181
|
+
/** 全局额外脚本 */
|
|
182
|
+
globalScripts?: string[];
|
|
183
|
+
/** 全局额外样式 */
|
|
184
|
+
globalStyles?: string[];
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* 将生成的 HTML 写入文件系统
|
|
188
|
+
*
|
|
189
|
+
* @description
|
|
190
|
+
* 将 generateStaticPages 生成的结果写入到指定的输出目录。
|
|
191
|
+
* 会自动创建所需的目录结构。
|
|
192
|
+
*
|
|
193
|
+
* @param pages - 页面配置数组
|
|
194
|
+
* @param options - SSG 选项
|
|
195
|
+
* @returns Promise<void>
|
|
196
|
+
*
|
|
197
|
+
* @example
|
|
198
|
+
* ```typescript
|
|
199
|
+
* await writeStaticFiles(pages, { outDir: 'build' });
|
|
200
|
+
* ```
|
|
201
|
+
*/
|
|
202
|
+
declare function writeStaticFiles(pages: SSGPage[], options?: SSGOptions): Promise<void>;
|
|
203
|
+
/**
|
|
204
|
+
* 预渲染页面配置数组为静态 HTML
|
|
205
|
+
*
|
|
206
|
+
* @description
|
|
207
|
+
* 接受页面配置数组,为每个页面生成完整的 HTML 内容。
|
|
208
|
+
* 返回一个 Map,键为文件路径,值为 HTML 内容。
|
|
209
|
+
*
|
|
210
|
+
* @param pages - 页面配置数组
|
|
211
|
+
* @param options - SSG 生成选项
|
|
212
|
+
* @returns Map<string, string> 文件路径 -> HTML 内容
|
|
213
|
+
*
|
|
214
|
+
* @example
|
|
215
|
+
* ```typescript
|
|
216
|
+
* const pages: SSGPage[] = [
|
|
217
|
+
* {
|
|
218
|
+
* path: '/',
|
|
219
|
+
* component: h('div', {}, 'Home'),
|
|
220
|
+
* head: { title: '首页', meta: { description: '欢迎' } },
|
|
221
|
+
* },
|
|
222
|
+
* {
|
|
223
|
+
* path: '/about',
|
|
224
|
+
* component: h('div', {}, 'About'),
|
|
225
|
+
* },
|
|
226
|
+
* ];
|
|
227
|
+
*
|
|
228
|
+
* const results = generateStaticPages(pages, {
|
|
229
|
+
* baseUrl: 'https://example.com',
|
|
230
|
+
* defaultTitle: 'My Site',
|
|
231
|
+
* });
|
|
232
|
+
*
|
|
233
|
+
* for (const [filePath, html] of results) {
|
|
234
|
+
* console.log(filePath, html);
|
|
235
|
+
* }
|
|
236
|
+
* ```
|
|
237
|
+
*/
|
|
238
|
+
declare function generateStaticPages(pages: SSGPage[], options?: SSGOptions): Map<string, string>;
|
|
239
|
+
/**
|
|
240
|
+
* 生成页面路由清单
|
|
241
|
+
*
|
|
242
|
+
* @description
|
|
243
|
+
* 根据页面配置生成一个 JSON 格式的路由清单,
|
|
244
|
+
* 可用于客户端路由注册或构建分析。
|
|
245
|
+
*
|
|
246
|
+
* @param pages - 页面配置数组
|
|
247
|
+
* @param baseUrl - 站点基础 URL
|
|
248
|
+
* @returns 路由信息数组
|
|
249
|
+
*/
|
|
250
|
+
declare function generateRouteManifest(pages: SSGPage[], baseUrl?: string): Array<{
|
|
251
|
+
path: string;
|
|
252
|
+
filePath: string;
|
|
253
|
+
title?: string;
|
|
254
|
+
}>;
|
|
255
|
+
/**
|
|
256
|
+
* 验证页面配置数组的合法性
|
|
257
|
+
*
|
|
258
|
+
* @description
|
|
259
|
+
* 检查每个页面配置是否包含必要的字段(path 和 component),
|
|
260
|
+
* 以及路径是否合法。返回错误信息数组。
|
|
261
|
+
*
|
|
262
|
+
* @param pages - 页面配置数组
|
|
263
|
+
* @returns 错误信息数组,空数组表示全部合法
|
|
264
|
+
*/
|
|
265
|
+
declare function validatePages(pages: SSGPage[]): string[];
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* @lytjs/ssr - 组件级水合提示
|
|
269
|
+
*
|
|
270
|
+
* 提供水合标记、策略检测和状态序列化等辅助函数,
|
|
271
|
+
* 用于 SSR 输出中嵌入客户端水合所需的信息
|
|
272
|
+
*/
|
|
273
|
+
|
|
274
|
+
/** 水合策略类型 */
|
|
275
|
+
type HydrationStrategy = 'lazy' | 'eager' | 'idle';
|
|
276
|
+
/** 水合提示信息 */
|
|
277
|
+
interface HydrationHints {
|
|
278
|
+
/** 组件唯一标识 */
|
|
279
|
+
componentId: string;
|
|
280
|
+
/** 水合策略 */
|
|
281
|
+
strategy: HydrationStrategy;
|
|
282
|
+
/** 组件 props 快照 */
|
|
283
|
+
props: Record<string, unknown>;
|
|
284
|
+
}
|
|
285
|
+
/** 水合状态数据结构 */
|
|
286
|
+
interface HydrationState {
|
|
287
|
+
/** 组件水合提示列表 */
|
|
288
|
+
hints: HydrationHints[];
|
|
289
|
+
/** 全局初始状态 */
|
|
290
|
+
initialState?: Record<string, unknown>;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* 重置组件 ID 计数器(仅用于测试)
|
|
294
|
+
*/
|
|
295
|
+
declare function resetComponentIdCounter(): void;
|
|
296
|
+
/**
|
|
297
|
+
* 为 VNode 树添加水合标记
|
|
298
|
+
*
|
|
299
|
+
* @description
|
|
300
|
+
* 递归遍历 VNode 树,为每个元素节点添加 data-hydrate 属性,
|
|
301
|
+
* 用于客户端水合时识别对应的 SSR 输出节点。
|
|
302
|
+
* 同时根据 props 中的 hydrateStrategy 设置 data-hydrate-strategy 属性。
|
|
303
|
+
*
|
|
304
|
+
* @param vnode - 原始 VNode
|
|
305
|
+
* @returns 添加了水合标记的新 VNode(浅拷贝)
|
|
306
|
+
*
|
|
307
|
+
* @example
|
|
308
|
+
* ```typescript
|
|
309
|
+
* const marked = createHydrationMarkers(vnode);
|
|
310
|
+
* // marked 的每个元素节点都带有 data-hydrate="lyt-hydrate-1" 等属性
|
|
311
|
+
* ```
|
|
312
|
+
*/
|
|
313
|
+
declare function createHydrationMarkers(vnode: VNode): VNode;
|
|
314
|
+
/**
|
|
315
|
+
* 获取组件的水合策略
|
|
316
|
+
*
|
|
317
|
+
* @description
|
|
318
|
+
* 从 VNode 的 props 中读取 hydrateStrategy 字段,
|
|
319
|
+
* 返回对应的水合策略。如果未设置,默认返回 'eager'。
|
|
320
|
+
*
|
|
321
|
+
* @param vnode - 目标 VNode
|
|
322
|
+
* @returns 水合策略(lazy / eager / idle)
|
|
323
|
+
*
|
|
324
|
+
* @example
|
|
325
|
+
* ```typescript
|
|
326
|
+
* const strategy = getHydrationStrategy(vnode);
|
|
327
|
+
* // 'eager' | 'lazy' | 'idle'
|
|
328
|
+
* ```
|
|
329
|
+
*/
|
|
330
|
+
declare function getHydrationStrategy(vnode: VNode): HydrationStrategy;
|
|
331
|
+
/**
|
|
332
|
+
* 序列化客户端水合所需的初始状态
|
|
333
|
+
*
|
|
334
|
+
* @description
|
|
335
|
+
* 将任意状态对象序列化为可安全嵌入 HTML 的 JSON 字符串。
|
|
336
|
+
* 处理特殊值(undefined、函数、Symbol 等)以确保 JSON 安全。
|
|
337
|
+
*
|
|
338
|
+
* @param state - 要序列化的状态对象
|
|
339
|
+
* @returns JSON 字符串
|
|
340
|
+
*
|
|
341
|
+
* @example
|
|
342
|
+
* ```typescript
|
|
343
|
+
* const serialized = serializeHydrationState({
|
|
344
|
+
* user: { name: 'Alice', age: 30 },
|
|
345
|
+
* items: [1, 2, 3],
|
|
346
|
+
* });
|
|
347
|
+
* // '{"user":{"name":"Alice","age":30},"items":[1,2,3]}'
|
|
348
|
+
* ```
|
|
349
|
+
*/
|
|
350
|
+
declare function serializeHydrationState(state: unknown): string;
|
|
351
|
+
/**
|
|
352
|
+
* 创建脱水状态(SSR 时序列化到 HTML 中的状态)
|
|
353
|
+
*
|
|
354
|
+
* @description
|
|
355
|
+
* 从 VNode 树中提取水合所需的信息,生成一段可嵌入 HTML 的 script 标签内容。
|
|
356
|
+
* 客户端加载时读取此状态进行水合。
|
|
357
|
+
*
|
|
358
|
+
* @param vnode - VNode 节点
|
|
359
|
+
* @param initialState - 可选的全局初始状态
|
|
360
|
+
* @returns 可嵌入 HTML 的 script 标签字符串
|
|
361
|
+
*
|
|
362
|
+
* @example
|
|
363
|
+
* ```typescript
|
|
364
|
+
* const script = createDehydratedState(vnode, {
|
|
365
|
+
* user: { name: 'Alice' },
|
|
366
|
+
* });
|
|
367
|
+
* // <script id="__LYT_DEHYDRATED_STATE__" type="application/json">...</script>
|
|
368
|
+
* ```
|
|
369
|
+
*/
|
|
370
|
+
declare function createDehydratedState(vnode: VNode, initialState?: Record<string, unknown>): string;
|
|
371
|
+
|
|
372
|
+
export { type DataPrefetchContext, type EnhancedStreamRenderOptions, type HydrationHints, type HydrationState, type HydrationStrategy, type PrefetchResult, type PrefetchableComponent, type SSGOptions, type SSGPage, type StreamRenderOptions, VirtualList, createDehydratedState, createHydrationMarkers, _default as default, generateRouteManifest, generateStaticPages, getHydrationStrategy, renderToHtml, renderToStream, renderToStreamAsync, renderToStreamEnhanced, renderToString, resetComponentIdCounter, serializeHydrationState, validatePages, writeStaticFiles };
|