@lytjs/renderer 6.0.0 → 6.5.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/README.md +14 -0
- package/dist/index.cjs +22 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -42
- package/dist/index.d.ts +3 -42
- package/dist/index.mjs +24 -12
- package/dist/index.mjs.map +1 -1
- package/dist/vapor/vapor-app.cjs +334 -0
- package/dist/vapor/vapor-app.cjs.map +1 -0
- package/dist/vapor/vapor-app.d.cts +88 -0
- package/dist/vapor/vapor-app.d.ts +88 -0
- package/dist/vapor/vapor-app.mjs +330 -0
- package/dist/vapor/vapor-app.mjs.map +1 -0
- package/package.json +22 -12
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hydration/enhanced-hydration.ts","../src/utils.ts","../src/ssr/ssr-utils.ts","../src/ssr/ssr-stream-optimized.ts","../src/vapor/vapor-hmr.ts","../src/signal/signal-renderer.ts","../src/vapor/vapor-ssr.ts","../src/ssr/ssr-renderer.ts","../src/ssr/ssr-stream.ts","../src/ssr/ssr-island.ts","../src/vapor/vapor-app.ts","../src/server/server-components.ts","../src/client/server-components-client.ts","../src/data/data-fetching.ts","../src/index.ts","../src/unmount.ts"],"names":["HydrationErrorHandler","warn","createApp","error","VOID_ELEMENTS","isNullish","escapeHtml","isString","isObject","camelToKebab","isBooleanAttr","OptimizedSSRStream","ShapeFlags","Fragment","Text","isFunction","Comment","isArray","DEFAULT_STATE_PRESERVATION","compile","effect","reconcileArray","createTemplate","setText","setAttribute","setProperty","setStyle","setClass","insert","remove","createEventHandler","bindEffect","onCleanup","runCleanups","createSignalRenderer","COMPONENT_MASK","yieldToMicrotask","newElement","ref","watch","renderToString","renderToStream","createOptimizedStream","renderDocumentToStream","hydrateIsland","registerIslandComponent","createIslandSSRContent","defineVaporComponent","createVaporApp","renderVaporToString","renderVaporToStream","hydrateVaporComponent"],"mappings":"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","file":"index.cjs","sourcesContent":["// packages/renderer/src/hydration/enhanced-hydration.ts\r\n// Hydration 完善模块\r\n// Phase 1.15-1.17: 全应用 Hydration、选择性 Hydration、水合错误恢复\r\n\r\n// 临时类型声明,解决循环依赖问题\r\ntype App = unknown;\r\ntype Component = unknown;\r\nimport { warn } from '@lytjs/common-error';\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/** Hydration 模式 */\r\nexport type HydrationMode = 'full' | 'selective' | 'lazy';\r\n\r\n/** Hydration 选项 */\r\nexport interface HydrationOptions {\r\n /** Hydration 模式 */\r\n mode?: HydrationMode;\r\n /** 选择性 Hydration 选择器 */\r\n selectors?: string[];\r\n /** 懒加载阈值(毫秒) */\r\n lazyThreshold?: number;\r\n /** 是否在空闲时 Hydration */\r\n idleCallback?: boolean;\r\n /** 错误处理 */\r\n onError?: (error: HydrationError) => void;\r\n /** 不匹配处理 */\r\n onMismatch?: (mismatch: HydrationMismatch) => void;\r\n /** Hydration 完成回调 */\r\n onComplete?: () => void;\r\n}\r\n\r\n/** Hydration 错误 */\r\nexport interface HydrationError {\r\n /** 错误类型 */\r\n type: 'mismatch' | 'missing' | 'invalid' | 'script';\r\n /** 错误消息 */\r\n message: string;\r\n /** 相关节点 */\r\n node?: Element;\r\n /** 原始错误 */\r\n error?: Error;\r\n}\r\n\r\n/** Hydration 不匹配 */\r\nexport interface HydrationMismatch {\r\n /** 期望的 HTML */\r\n expected: string;\r\n /** 实际的 HTML */\r\n actual: string;\r\n /** 节点路径 */\r\n path: string;\r\n /** 恢复策略 */\r\n recoveryStrategy: 'rerender' | 'keep-server' | 'keep-client';\r\n}\r\n\r\n/** Hydration 统计 */\r\nexport interface HydrationStats {\r\n /** 总节点数 */\r\n totalNodes: number;\r\n /** 已 Hydration 节点数 */\r\n hydratedNodes: number;\r\n /** 跳过的节点数 */\r\n skippedNodes: number;\r\n /** 不匹配数 */\r\n mismatches: number;\r\n /** 错误数 */\r\n errors: number;\r\n /** Hydration 耗时(毫秒) */\r\n duration: number;\r\n}\r\n\r\n// ============================================================\r\n// Phase 1.15: 全应用 Hydration\r\n// ============================================================\r\n\r\n/**\r\n * 全应用 Hydration\r\n * \r\n * @example\r\n * ```ts\r\n * // 服务端渲染的 HTML\r\n * const html = '<div id=\"app\">...</div>';\r\n * \r\n * // 客户端 Hydration\r\n * hydrateApp(App, '#app');\r\n * ```\r\n */\r\nexport async function hydrateApp(\r\n component: Component,\r\n container: string | Element,\r\n options: HydrationOptions = {},\r\n): Promise<{\r\n app: App;\r\n stats: HydrationStats;\r\n}> {\r\n const startTime = performance.now();\r\n const stats: HydrationStats = {\r\n totalNodes: 0,\r\n hydratedNodes: 0,\r\n skippedNodes: 0,\r\n mismatches: 0,\r\n errors: 0,\r\n duration: 0,\r\n };\r\n\r\n const containerEl = typeof container === 'string'\r\n ? document.querySelector(container)\r\n : container;\r\n\r\n if (!containerEl) {\r\n throw new Error(`[LytJS] hydrateApp: container not found: ${container}`);\r\n }\r\n\r\n // 检查是否已经 Hydration\r\n if (containerEl.hasAttribute('data-hydrated')) {\r\n warn('[LytJS] Container already hydrated');\r\n // @ts-ignore\r\n const { createApp } = await import('@lytjs/core');\r\n return {\r\n app: createApp(component),\r\n stats,\r\n };\r\n }\r\n\r\n // 创建应用实例\r\n // @ts-ignore\r\n const { createApp } = await import('@lytjs/core');\r\n const app = createApp(component);\r\n\r\n // 执行 Hydration\r\n try {\r\n await performHydration(containerEl, app, stats, options);\r\n } catch (error) {\r\n stats.errors++;\r\n options.onError?.({\r\n type: 'script',\r\n message: error instanceof Error ? error.message : String(error),\r\n error: error instanceof Error ? error : undefined,\r\n });\r\n }\r\n\r\n // 标记已 Hydration\r\n containerEl.setAttribute('data-hydrated', 'true');\r\n\r\n stats.duration = performance.now() - startTime;\r\n options.onComplete?.();\r\n\r\n return { app, stats };\r\n}\r\n\r\n/**\r\n * 执行 Hydration\r\n */\r\nasync function performHydration(\r\n container: Element,\r\n _app: App,\r\n stats: HydrationStats,\r\n _options: HydrationOptions,\r\n): Promise<void> {\r\n // 遍历所有子节点\r\n const walker = document.createTreeWalker(\r\n container,\r\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,\r\n );\r\n\r\n const nodes: Node[] = [];\r\n let node: Node | null;\r\n while ((node = walker.nextNode())) {\r\n nodes.push(node);\r\n stats.totalNodes++;\r\n }\r\n\r\n // 处理每个节点\r\n for (const n of nodes) {\r\n if (n instanceof Element) {\r\n await hydrateElement(n, stats, _options);\r\n stats.hydratedNodes++;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Hydration 单个元素\r\n */\r\nasync function hydrateElement(\r\n element: Element,\r\n stats: HydrationStats,\r\n _options: HydrationOptions,\r\n): Promise<void> {\r\n // 检查 SSR 标记\r\n const ssrId = element.getAttribute('data-ssr-id');\r\n if (!ssrId) {\r\n stats.skippedNodes++;\r\n return;\r\n }\r\n\r\n // 检查事件监听器\r\n const eventAttrs = Array.from(element.attributes).filter(\r\n attr => attr.name.startsWith('on') || attr.name.startsWith('@'),\r\n );\r\n\r\n for (const attr of eventAttrs) {\r\n // 移除 SSR 渲染的事件属性(客户端会重新绑定)\r\n element.removeAttribute(attr.name);\r\n }\r\n\r\n // 检查指令\r\n const directives = Array.from(element.attributes).filter(\r\n attr => attr.name.startsWith('v-'),\r\n );\r\n\r\n for (const attr of directives) {\r\n // 处理指令\r\n processDirective(element, attr.name, attr.value, _options);\r\n }\r\n}\r\n\r\n/**\r\n * 处理指令\r\n */\r\nfunction processDirective(\r\n element: Element,\r\n name: string,\r\n value: string,\r\n _options: HydrationOptions,\r\n): void {\r\n switch (name) {\r\n case 'v-if':\r\n case 'v-show':\r\n case 'v-for':\r\n // 这些指令由客户端运行时处理\r\n break;\r\n case 'v-model':\r\n // 恢复双向绑定\r\n setupVModel(element, value);\r\n break;\r\n case 'v-bind':\r\n // 恢复属性绑定\r\n setupVBind(element, value);\r\n break;\r\n }\r\n}\r\n\r\n/**\r\n * 设置 v-model 绑定\r\n */\r\nfunction setupVModel(element: Element, _expression: string): void {\r\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\r\n element.addEventListener('input', (e) => {\r\n // 触发响应式更新\r\n const event = new CustomEvent('update:modelValue', {\r\n detail: (e.target as HTMLInputElement).value,\r\n });\r\n element.dispatchEvent(event);\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * 设置 v-bind 绑定\r\n */\r\nfunction setupVBind(element: Element, expression: string): void {\r\n // 简化实现:从 data 属性读取\r\n const bindValue = element.getAttribute(`data-bind-${expression}`);\r\n if (bindValue) {\r\n try {\r\n const value = JSON.parse(bindValue);\r\n element.setAttribute(expression, value);\r\n } catch {\r\n element.setAttribute(expression, bindValue);\r\n }\r\n }\r\n}\r\n\r\n// ============================================================\r\n// Phase 1.16: 选择性 Hydration\r\n// ============================================================\r\n\r\n/** 待 Hydration 队列 */\r\nconst hydrationQueue: Array<{\r\n element: Element;\r\n priority: 'high' | 'medium' | 'low';\r\n callback: () => Promise<void>;\r\n}> = [];\r\n\r\n/** 是否正在处理队列 */\r\nlet isProcessingQueue = false;\r\n\r\n/**\r\n * 选择性 Hydration\r\n * \r\n * @example\r\n * ```ts\r\n * // 只 Hydration 可见区域\r\n * hydrateVisible(App, '#app');\r\n * \r\n * // 基于 IntersectionObserver\r\n * hydrateOnVisible(App, '#app', {\r\n * rootMargin: '100px',\r\n * });\r\n * ```\r\n */\r\nexport async function hydrateVisible(\r\n component: Component,\r\n container: string | Element,\r\n options: HydrationOptions = {},\r\n): Promise<{\r\n app: App;\r\n stats: HydrationStats;\r\n}> {\r\n const containerEl = typeof container === 'string'\r\n ? document.querySelector(container)\r\n : container;\r\n\r\n if (!containerEl) {\r\n throw new Error(`[LytJS] hydrateVisible: container not found: ${container}`);\r\n }\r\n\r\n // 查找所有需要 Hydration 的元素\r\n const hydrateElements = containerEl.querySelectorAll('[data-hydrate]');\r\n\r\n const stats: HydrationStats = {\r\n totalNodes: hydrateElements.length,\r\n hydratedNodes: 0,\r\n skippedNodes: 0,\r\n mismatches: 0,\r\n errors: 0,\r\n duration: 0,\r\n };\r\n\r\n const startTime = performance.now();\r\n // @ts-ignore\r\n const { createApp } = await import('@lytjs/core');\r\n const app = createApp(component);\r\n\r\n // 使用 IntersectionObserver 检测可见性\r\n const observer = new IntersectionObserver(\r\n async (entries) => {\r\n for (const entry of entries) {\r\n if (entry.isIntersecting) {\r\n const element = entry.target as Element;\r\n await hydrateElement(element, stats, options);\r\n stats.hydratedNodes++;\r\n observer.unobserve(element);\r\n }\r\n }\r\n },\r\n {\r\n rootMargin: options.lazyThreshold ? `${options.lazyThreshold}px` : '100px',\r\n },\r\n );\r\n\r\n // 观察所有需要 Hydration 的元素\r\n for (const element of hydrateElements) {\r\n observer.observe(element);\r\n }\r\n\r\n // 等待所有 Hydration 完成\r\n await new Promise<void>((resolve) => {\r\n const checkComplete = () => {\r\n if (stats.hydratedNodes >= stats.totalNodes) {\r\n resolve();\r\n } else {\r\n requestIdleCallback(checkComplete);\r\n }\r\n };\r\n checkComplete();\r\n });\r\n\r\n stats.duration = performance.now() - startTime;\r\n observer.disconnect();\r\n\r\n return { app, stats };\r\n}\r\n\r\n/**\r\n * 延迟 Hydration\r\n * 将 Hydration 任务加入队列,按优先级执行\r\n */\r\nexport function queueHydration(\r\n element: Element,\r\n priority: 'high' | 'medium' | 'low',\r\n callback: () => Promise<void>,\r\n): void {\r\n hydrationQueue.push({ element, priority, callback });\r\n hydrationQueue.sort((a, b) => {\r\n const priorityOrder = { high: 0, medium: 1, low: 2 };\r\n return priorityOrder[a.priority] - priorityOrder[b.priority];\r\n });\r\n\r\n if (!isProcessingQueue) {\r\n processHydrationQueue();\r\n }\r\n}\r\n\r\n/**\r\n * 处理 Hydration 队列\r\n */\r\nasync function processHydrationQueue(): Promise<void> {\r\n isProcessingQueue = true;\r\n\r\n while (hydrationQueue.length > 0) {\r\n const task = hydrationQueue.shift();\r\n if (task) {\r\n await task.callback();\r\n }\r\n\r\n // 让出控制权\r\n await new Promise(resolve => requestIdleCallback(resolve));\r\n }\r\n\r\n isProcessingQueue = false;\r\n}\r\n\r\n// ============================================================\r\n// Phase 1.17: 水合错误恢复\r\n// ============================================================\r\n\r\n/**\r\n * 水合错误恢复策略\r\n */\r\nexport type RecoveryStrategy = 'rerender' | 'keep-server' | 'keep-client' | 'fallback';\r\n\r\n/**\r\n * 水合错误处理器\r\n */\r\nexport class HydrationErrorHandler {\r\n private errors: HydrationError[] = [];\r\n private mismatches: HydrationMismatch[] = [];\r\n private options: HydrationOptions;\r\n\r\n constructor(options: HydrationOptions = {}) {\r\n this.options = options;\r\n }\r\n\r\n /**\r\n * 处理 Hydration 错误\r\n */\r\n handleError(error: HydrationError): RecoveryStrategy {\r\n this.errors.push(error);\r\n this.options.onError?.(error);\r\n\r\n // 根据错误类型决定恢复策略\r\n switch (error.type) {\r\n case 'mismatch':\r\n return this.handleMismatch(error);\r\n case 'missing':\r\n return 'fallback';\r\n case 'invalid':\r\n return 'rerender';\r\n case 'script':\r\n return 'keep-server';\r\n default:\r\n return 'rerender';\r\n }\r\n }\r\n\r\n /**\r\n * 处理不匹配错误\r\n */\r\n private handleMismatch(error: HydrationError): RecoveryStrategy {\r\n const mismatch: HydrationMismatch = {\r\n expected: error.node?.getAttribute('data-ssr-expected') || '',\r\n actual: error.node?.innerHTML || '',\r\n path: this.getNodePath(error.node),\r\n recoveryStrategy: 'rerender',\r\n };\r\n\r\n this.mismatches.push(mismatch);\r\n this.options.onMismatch?.(mismatch);\r\n\r\n // 智能选择恢复策略\r\n if (this.isMinorMismatch(mismatch)) {\r\n mismatch.recoveryStrategy = 'keep-server';\r\n return 'keep-server';\r\n }\r\n\r\n if (this.isCriticalMismatch(mismatch)) {\r\n mismatch.recoveryStrategy = 'rerender';\r\n return 'rerender';\r\n }\r\n\r\n return 'keep-client';\r\n }\r\n\r\n /**\r\n * 判断是否是轻微不匹配\r\n */\r\n private isMinorMismatch(mismatch: HydrationMismatch): boolean {\r\n // 空白字符差异\r\n if (mismatch.expected.trim() === mismatch.actual.trim()) {\r\n return true;\r\n }\r\n\r\n // 属性顺序差异\r\n const normalize = (html: string) =>\r\n html.replace(/\\s+/g, ' ').replace(/\\s*=\\s*/g, '=');\r\n if (normalize(mismatch.expected) === normalize(mismatch.actual)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * 判断是否是严重不匹配\r\n */\r\n private isCriticalMismatch(mismatch: HydrationMismatch): boolean {\r\n // 结构完全不同\r\n const expectedTags = mismatch.expected.match(/<\\w+/g) || [];\r\n const actualTags = mismatch.actual.match(/<\\w+/g) || [];\r\n\r\n if (expectedTags.length !== actualTags.length) {\r\n return true;\r\n }\r\n\r\n // 关键属性缺失\r\n if (mismatch.expected.includes('data-') && !mismatch.actual.includes('data-')) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * 获取节点路径\r\n */\r\n private getNodePath(node?: Element): string {\r\n if (!node) return '';\r\n\r\n const path: string[] = [];\r\n let current: Element | null = node;\r\n\r\n while (current && current !== document.body) {\r\n const tagName = current.tagName.toLowerCase();\r\n const siblings = current.parentElement?.children;\r\n const index = siblings ? Array.from(siblings).indexOf(current) : 0;\r\n path.unshift(`${tagName}[${index}]`);\r\n current = current.parentElement;\r\n }\r\n\r\n return path.join(' > ');\r\n }\r\n\r\n /**\r\n * 获取所有错误\r\n */\r\n getErrors(): HydrationError[] {\r\n return [...this.errors];\r\n }\r\n\r\n /**\r\n * 获取所有不匹配\r\n */\r\n getMismatches(): HydrationMismatch[] {\r\n return [...this.mismatches];\r\n }\r\n\r\n /**\r\n * 清除错误记录\r\n */\r\n clear(): void {\r\n this.errors = [];\r\n this.mismatches = [];\r\n }\r\n}\r\n\r\n/**\r\n * 创建错误处理器\r\n */\r\nexport function createHydrationErrorHandler(\r\n options: HydrationOptions = {},\r\n): HydrationErrorHandler {\r\n return new HydrationErrorHandler(options);\r\n}\r\n\r\n/**\r\n * 安全 Hydration\r\n * 带错误恢复的 Hydration\r\n */\r\nexport async function safeHydrate(\r\n component: Component,\r\n container: string | Element,\r\n options: HydrationOptions = {},\r\n): Promise<{\r\n app: App;\r\n stats: HydrationStats;\r\n errorHandler: HydrationErrorHandler;\r\n}> {\r\n const errorHandler = createHydrationErrorHandler(options);\r\n\r\n try {\r\n const result = await hydrateApp(component, container, {\r\n ...options,\r\n onError: (error) => {\r\n errorHandler.handleError(error);\r\n options.onError?.(error);\r\n },\r\n onMismatch: (mismatch) => {\r\n options.onMismatch?.(mismatch);\r\n },\r\n });\r\n\r\n return {\r\n ...result,\r\n errorHandler,\r\n };\r\n } catch (error) {\r\n // 尝试降级渲染\r\n const containerEl = typeof container === 'string'\r\n ? document.querySelector(container)\r\n : container;\r\n\r\n if (containerEl) {\r\n // 清空容器并重新渲染\r\n containerEl.innerHTML = '';\r\n // @ts-ignore\r\n const { createApp } = await import('@lytjs/core');\r\n const app = createApp(component);\r\n app.mount(containerEl);\r\n\r\n return {\r\n app,\r\n stats: {\r\n totalNodes: 0,\r\n hydratedNodes: 0,\r\n skippedNodes: 0,\r\n mismatches: 0,\r\n errors: 1,\r\n duration: 0,\r\n },\r\n errorHandler,\r\n };\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n\r\n// ============================================================\r\n// 导出(函数已在上面定义)\r\n// ============================================================\r\n","/**\r\n * @lytjs/renderer - Shared utilities\r\n *\r\n * This module provides shared utility functions used across the renderer package,\r\n * including HTML escaping, boolean attribute detection, and void element checks.\r\n * It re-exports selected utilities from @lytjs/common-string for convenience.\r\n */\r\n\r\nimport { escapeHtml, isBooleanAttr, VOID_ELEMENTS } from '@lytjs/common-string';\r\n\r\nexport { escapeHtml, isBooleanAttr };\r\n\r\n// ============================================================\r\n// Self-closing elements\r\n// ============================================================\r\n\r\n/**\r\n * Check if a tag is a void (self-closing) element\r\n */\r\nexport function isVoidElement(tag: string): boolean {\r\n return VOID_ELEMENTS.has(tag);\r\n}\r\n","/**\r\n * @lytjs/renderer - SSR Utilities\r\n * SSR 渲染共享工具函数\r\n * FIX: P2-36 提取 ssr-renderer 和 ssr-stream 的共享代码\r\n */\r\n\r\nimport { isString, isObject, isNullish } from '@lytjs/common-is';\r\nimport { camelToKebab } from '@lytjs/common-string';\r\nimport { warn } from '@lytjs/common-error';\r\nimport { escapeHtml, isBooleanAttr } from '../utils';\r\n\r\n// ============================================================\r\n// HTML 标签验证\r\n// ============================================================\r\n\r\n/**\r\n * 验证是否为有效的 HTML 元素标签名\r\n * @param tag - 标签名\r\n * @returns 是否有效\r\n */\r\nexport function isValidHTMLElementTag(tag: string): boolean {\r\n return /^[a-z][a-z0-9-]*$/.test(tag);\r\n}\r\n\r\n// ============================================================\r\n// URL 安全验证\r\n// ============================================================\r\n\r\n// 安全:携带 URL 且需要协议验证的属性\r\n// 提取为模块级常量以避免每次渲染时重新创建\r\nexport const URL_ATTRS = new Set([\r\n 'href',\r\n 'src',\r\n 'action',\r\n 'formaction',\r\n 'xlink:href',\r\n 'data',\r\n 'srcdoc',\r\n]);\r\n\r\n// 命名实体解码常量\r\nexport const NAMED_ENTITIES: Record<string, string> = {\r\n ':': ':',\r\n '&tab;': '\\t',\r\n '&newline;': '\\n',\r\n '(': '(',\r\n ')': ')',\r\n ' ': '\\u00A0',\r\n '©': '\\u00A9',\r\n '®': '\\u00AE',\r\n '™': '\\u2122',\r\n '×': '\\u00D7',\r\n '÷': '\\u00F7',\r\n '£': '\\u00A3',\r\n '¥': '\\u00A5',\r\n '¢': '\\u00A2',\r\n '§': '\\u00A7',\r\n '¶': '\\u00B6',\r\n '·': '\\u00B7',\r\n '«': '\\u00AB',\r\n '»': '\\u00BB',\r\n '¡': '\\u00A1',\r\n '¿': '\\u00BF',\r\n '°': '\\u00B0',\r\n '±': '\\u00B1',\r\n 'µ': '\\u00B5',\r\n '¼': '\\u00BC',\r\n '½': '\\u00BD',\r\n '¾': '\\u00BE',\r\n '¹': '\\u00B9',\r\n '²': '\\u00B2',\r\n '³': '\\u00B3',\r\n '´': '\\u00B4',\r\n '¸': '\\u00B8',\r\n 'ª': '\\u00AA',\r\n '¬': '\\u00AC',\r\n '­': '\\u00AD',\r\n '¯': '\\u00AF',\r\n '¨': '\\u00A8',\r\n 'ˆ': '\\u02C6',\r\n '˜': '\\u02DC',\r\n ' ': '\\u2002',\r\n ' ': '\\u2003',\r\n ' ': '\\u2009',\r\n '‌': '\\u200C',\r\n '‍': '\\u200D',\r\n '‎': '\\u200E',\r\n '‏': '\\u200F',\r\n '–': '\\u2013',\r\n '—': '\\u2014',\r\n '‘': '\\u2018',\r\n '’': '\\u2019',\r\n '‚': '\\u201A',\r\n '“': '\\u201C',\r\n '”': '\\u201D',\r\n '„': '\\u201E',\r\n '†': '\\u2020',\r\n '‡': '\\u2021',\r\n '•': '\\u2022',\r\n '…': '\\u2026',\r\n '‰': '\\u2030',\r\n '′': '\\u2032',\r\n '″': '\\u2033',\r\n '‹': '\\u2039',\r\n '›': '\\u203A',\r\n '‾': '\\u203E',\r\n '⁄': '\\u2044',\r\n '€': '\\u20AC',\r\n '←': '\\u2190',\r\n '↑': '\\u2191',\r\n '→': '\\u2192',\r\n '↓': '\\u2193',\r\n '↔': '\\u2194',\r\n '↵': '\\u21B5',\r\n '⌈': '\\u2308',\r\n '⌉': '\\u2309',\r\n '⌊': '\\u230A',\r\n '⌋': '\\u230B',\r\n '⟨': '\\u27E8',\r\n '⟩': '\\u27E9',\r\n '◊': '\\u25CA',\r\n '♠': '\\u2660',\r\n '♣': '\\u2663',\r\n '♥': '\\u2665',\r\n '♦': '\\u2666',\r\n 'Œ': '\\u0152',\r\n 'œ': '\\u0153',\r\n 'Š': '\\u0160',\r\n 'š': '\\u0161',\r\n 'Ÿ': '\\u0178',\r\n 'ƒ': '\\u0192',\r\n 'Α': '\\u0391',\r\n 'Β': '\\u0392',\r\n 'Γ': '\\u0393',\r\n 'Δ': '\\u0394',\r\n 'Ε': '\\u0395',\r\n 'Ζ': '\\u0396',\r\n 'Η': '\\u0397',\r\n 'Θ': '\\u0398',\r\n 'Ι': '\\u0399',\r\n 'Κ': '\\u039A',\r\n 'Λ': '\\u039B',\r\n 'Μ': '\\u039C',\r\n 'Ν': '\\u039D',\r\n 'Ξ': '\\u039E',\r\n 'Ο': '\\u039F',\r\n 'Π': '\\u03A0',\r\n 'Ρ': '\\u03A1',\r\n 'Σ': '\\u03A3',\r\n 'Τ': '\\u03A4',\r\n 'Υ': '\\u03A5',\r\n 'Φ': '\\u03A6',\r\n 'Χ': '\\u03A7',\r\n 'Ψ': '\\u03A8',\r\n 'Ω': '\\u03A9',\r\n 'α': '\\u03B1',\r\n 'β': '\\u03B2',\r\n 'γ': '\\u03B3',\r\n 'δ': '\\u03B4',\r\n 'ε': '\\u03B5',\r\n 'ζ': '\\u03B6',\r\n 'η': '\\u03B7',\r\n 'θ': '\\u03B8',\r\n 'ι': '\\u03B9',\r\n 'κ': '\\u03BA',\r\n 'λ': '\\u03BB',\r\n 'μ': '\\u03BC',\r\n 'ν': '\\u03BD',\r\n 'ξ': '\\u03BE',\r\n 'ο': '\\u03BF',\r\n 'π': '\\u03C0',\r\n 'ρ': '\\u03C1',\r\n 'ς': '\\u03C2',\r\n 'σ': '\\u03C3',\r\n 'τ': '\\u03C4',\r\n 'υ': '\\u03C5',\r\n 'φ': '\\u03C6',\r\n 'χ': '\\u03C7',\r\n 'ψ': '\\u03C8',\r\n 'ω': '\\u03C9',\r\n 'ϑ': '\\u03D1',\r\n 'ϒ': '\\u03D2',\r\n 'ϖ': '\\u03D6',\r\n ''': \"'\",\r\n '"': '\"',\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n};\r\n\r\n// 命名实体正则(模块级以避免重新创建)\r\nconst NAMED_ENTITY_REGEX = new RegExp(\r\n Object.keys(NAMED_ENTITIES)\r\n .map((e) => e.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\r\n .join('|'),\r\n 'g',\r\n);\r\n\r\n// 数字实体正则(模块级以避免每次调用 isSafeURL 时重新创建)\r\nconst NUMERIC_ENTITY_REGEX = /&#x?[0-9a-f]+;/gi;\r\n\r\n/**\r\n * 检查 URL 是否安全(防止 XSS 攻击)\r\n * @param url - 要检查的 URL\r\n * @returns 是否安全\r\n */\r\nexport function isSafeURL(url: string): boolean {\r\n // 循环解码 HTML 实体,直到字符串不再变化\r\n let decoded = url;\r\n let prev = '';\r\n let maxIterations = 10;\r\n while (decoded !== prev && maxIterations-- > 0) {\r\n prev = decoded;\r\n decoded = decoded.replace(NUMERIC_ENTITY_REGEX, (match) => {\r\n const codePoint = match.startsWith('&#x')\r\n ? parseInt(match.slice(3, -1), 16)\r\n : parseInt(match.slice(2, -1), 10);\r\n // 验证解析后的码点是否在有效的 Unicode 范围内\r\n if (isNaN(codePoint) || codePoint < 0 || codePoint > 0x10ffff) {\r\n return match;\r\n }\r\n return String.fromCodePoint(codePoint);\r\n });\r\n // 命名实体解码(在数字实体解码之后)\r\n decoded = decoded.replace(NAMED_ENTITY_REGEX, (match) => NAMED_ENTITIES[match] || match);\r\n }\r\n // 使用 URL 构造函数进行额外验证\r\n try {\r\n const parsed = new URL(decoded, 'http://example.com');\r\n const protocol = parsed.protocol.toLowerCase().replace(':', '');\r\n if (protocol === 'javascript') {\r\n return false;\r\n }\r\n if (protocol === 'data') {\r\n // 禁止 data:image/svg+xml(可嵌入脚本,存在 XSS 风险)\r\n if (/^data:image\\/svg\\+xml/i.test(decoded)) {\r\n return false;\r\n }\r\n // 允许安全的 data:image/* MIME 类型(使用解码后的 URL 进行检查)\r\n return /^data:image\\/(png|jpeg|jpg|gif|webp|bmp|ico|avif);/i.test(decoded);\r\n }\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n// ============================================================\r\n// 属性渲染\r\n// ============================================================\r\n\r\n/**\r\n * 将属性渲染为 HTML 字符串(用于 SSR)\r\n * @param key - 属性名\r\n * @param value - 属性值\r\n * @returns HTML 属性字符串\r\n */\r\nexport function renderAttributeToString(key: string, value: unknown): string {\r\n // 跳过 null/undefined\r\n if (isNullish(value)) return '';\r\n\r\n // 跳过事件处理器\r\n if (/^on[A-Z]/.test(key)) return '';\r\n\r\n // Class 处理\r\n if (key === 'class') {\r\n const classValue = value == null ? '' : String(value);\r\n if (!classValue) return '';\r\n return ` class=\"${escapeHtml(classValue)}\"`;\r\n }\r\n\r\n // Style 处理\r\n if (key === 'style') {\r\n if (isString(value)) {\r\n if (!value) return '';\r\n return ` style=\"${escapeHtml(value)}\"`;\r\n }\r\n if (isObject(value)) {\r\n const styles: string[] = [];\r\n for (const k in value as Record<string, unknown>) {\r\n const val = (value as Record<string, unknown>)[k];\r\n if (val != null && val !== '') {\r\n styles.push(`${camelToKebab(k)}:${String(val)}`);\r\n }\r\n }\r\n if (styles.length === 0) return '';\r\n return ` style=\"${escapeHtml(styles.join(';'))}\"`;\r\n }\r\n return '';\r\n }\r\n\r\n // 布尔属性\r\n if (isBooleanAttr(key)) {\r\n if (value === false || value === '') return '';\r\n return ` ${key}`;\r\n }\r\n\r\n // 安全:阻止 URL 属性上的危险协议\r\n if (URL_ATTRS.has(key)) {\r\n if (!isSafeURL(String(value))) {\r\n if (__DEV__) {\r\n warn(`Blocked potentially dangerous attribute: ${key}=\"${String(value)}\"`);\r\n }\r\n return '';\r\n }\r\n }\r\n\r\n // 常规属性\r\n return ` ${key}=\"${escapeHtml(String(value))}\"`;\r\n}\r\n","// packages/renderer/src/ssr/ssr-stream-optimized.ts\r\n// Streaming SSR 优化版本\r\n// Phase 1.5: TTFB 降低 50%+\r\n\r\nimport type { VNode } from '@lytjs/vdom';\r\nimport { Fragment, Text, Comment, ShapeFlags } from '@lytjs/vdom';\r\nimport { isArray, isFunction } from '@lytjs/common-is';\r\nimport { escapeHtml, isVoidElement } from '../utils';\r\nimport { isValidHTMLElementTag, renderAttributeToString } from './ssr-utils';\r\nimport { warn } from '@lytjs/common-error';\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/** 优化的流式渲染选项 */\r\nexport interface OptimizedStreamOptions {\r\n /** 是否启用预加载提示 */\r\n preloadHints?: boolean;\r\n /** 是否启用 HTTP/2 Push */\r\n http2Push?: boolean;\r\n /** 关键 CSS 内联 */\r\n criticalCSS?: string;\r\n /** 延迟加载阈值(毫秒) */\r\n deferThreshold?: number;\r\n /** 是否启用压缩 */\r\n compression?: boolean;\r\n /** 缓冲区大小(字节) */\r\n bufferSize?: number;\r\n /** 是否启用 Early Flush */\r\n earlyFlush?: boolean;\r\n}\r\n\r\n/** 预加载提示 */\r\nexport interface PreloadHint {\r\n /** 资源类型 */\r\n type: 'script' | 'style' | 'font' | 'image';\r\n /** 资源 URL */\r\n href: string;\r\n /** 是否跨域 */\r\n crossorigin?: boolean;\r\n /** 优先级 */\r\n importance?: 'high' | 'low' | 'auto';\r\n}\r\n\r\n/** 流式渲染统计 */\r\nexport interface StreamStats {\r\n /** TTFB(首字节时间) */\r\n ttfb: number;\r\n /** 总渲染时间 */\r\n totalTime: number;\r\n /** 块数量 */\r\n chunkCount: number;\r\n /** 总字节数 */\r\n totalBytes: number;\r\n /** Suspense 边界数量 */\r\n suspenseBoundaries: number;\r\n}\r\n\r\n// ============================================================\r\n// 全局状态\r\n// ============================================================\r\n\r\nconst COMPONENT_MASK = ShapeFlags.STATEFUL_COMPONENT | ShapeFlags.FUNCTIONAL_COMPONENT;\r\n\r\n// ============================================================\r\n// OptimizedSSRStream 类\r\n// ============================================================\r\n\r\n/**\r\n * 优化的 SSR 流式渲染器\r\n * \r\n * 特性:\r\n * - Early Flush:尽早发送初始 HTML\r\n * - 智能缓冲:自动管理缓冲区大小\r\n * - 预加载提示:自动生成 Link 头\r\n * - 优先级调度:关键内容优先发送\r\n */\r\nexport class OptimizedSSRStream {\r\n private controller: ReadableStreamDefaultController<Uint8Array>;\r\n private encoder: TextEncoder;\r\n private options: Required<OptimizedStreamOptions>;\r\n private buffer: string[];\r\n private bufferSize: number;\r\n private stats: StreamStats;\r\n private startTime: number;\r\n private flushedFirstChunk: boolean = false;\r\n private preloadHints: Set<string>;\r\n\r\n constructor(\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n options: OptimizedStreamOptions = {},\r\n ) {\r\n this.controller = controller;\r\n this.encoder = new TextEncoder();\r\n this.options = {\r\n preloadHints: options.preloadHints ?? true,\r\n http2Push: options.http2Push ?? false,\r\n criticalCSS: options.criticalCSS ?? '',\r\n deferThreshold: options.deferThreshold ?? 50,\r\n compression: options.compression ?? false,\r\n bufferSize: options.bufferSize ?? 4096,\r\n earlyFlush: options.earlyFlush ?? true,\r\n };\r\n this.buffer = [];\r\n this.bufferSize = 0;\r\n this.startTime = Date.now();\r\n this.stats = {\r\n ttfb: 0,\r\n totalTime: 0,\r\n chunkCount: 0,\r\n totalBytes: 0,\r\n suspenseBoundaries: 0,\r\n };\r\n this.preloadHints = new Set();\r\n }\r\n\r\n // ============================================================\r\n // 公共方法\r\n // ============================================================\r\n\r\n /**\r\n * 推送 HTML 内容到流\r\n */\r\n push(html: string): void {\r\n this.buffer.push(html);\r\n this.bufferSize += html.length;\r\n\r\n // 检查是否需要刷新缓冲区\r\n if (this.bufferSize >= this.options.bufferSize) {\r\n this.flush();\r\n }\r\n }\r\n\r\n /**\r\n * 刷新缓冲区到流\r\n */\r\n flush(): void {\r\n if (this.buffer.length === 0) return;\r\n\r\n const chunk = this.buffer.join('');\r\n this.buffer = [];\r\n this.bufferSize = 0;\r\n\r\n this.controller.enqueue(this.encoder.encode(chunk));\r\n\r\n // 记录首字节时间\r\n if (!this.flushedFirstChunk) {\r\n this.flushedFirstChunk = true;\r\n this.stats.ttfb = Date.now() - this.startTime;\r\n }\r\n\r\n this.stats.chunkCount++;\r\n this.stats.totalBytes += chunk.length;\r\n }\r\n\r\n /**\r\n * 添加预加载提示\r\n */\r\n addPreloadHint(hint: PreloadHint): void {\r\n const key = `${hint.type}:${hint.href}`;\r\n if (this.preloadHints.has(key)) return;\r\n\r\n this.preloadHints.add(key);\r\n\r\n // 生成 Link 头\r\n const linkHeader = this.generateLinkHeader(hint);\r\n this.push(linkHeader);\r\n }\r\n\r\n /**\r\n * 生成文档头部\r\n */\r\n generateDocumentHead(options: {\r\n title?: string;\r\n meta?: Record<string, string>[];\r\n links?: Record<string, string>[];\r\n styles?: string[];\r\n }): string {\r\n const { title, meta = [], links = [], styles = [] } = options;\r\n\r\n let head = '<!DOCTYPE html><html><head>';\r\n head += '<meta charset=\"utf-8\">';\r\n head += '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">';\r\n\r\n if (title) {\r\n head += `<title>${escapeHtml(title)}</title>`;\r\n }\r\n\r\n // 添加 meta 标签\r\n for (const m of meta) {\r\n const attrs = Object.entries(m)\r\n .map(([k, v]) => `${k}=\"${escapeHtml(v)}\"`)\r\n .join(' ');\r\n head += `<meta ${attrs}>`;\r\n }\r\n\r\n // 添加 link 标签\r\n for (const l of links) {\r\n const attrs = Object.entries(l)\r\n .map(([k, v]) => `${k}=\"${escapeHtml(v)}\"`)\r\n .join(' ');\r\n head += `<link ${attrs}>`;\r\n }\r\n\r\n // 内联关键 CSS\r\n if (this.options.criticalCSS) {\r\n head += `<style>${this.options.criticalCSS}</style>`;\r\n }\r\n\r\n // 添加样式\r\n for (const style of styles) {\r\n head += `<style>${style}</style>`;\r\n }\r\n\r\n head += '</head><body>';\r\n\r\n return head;\r\n }\r\n\r\n /**\r\n * 生成文档尾部\r\n */\r\n generateDocumentFooter(options: {\r\n scripts?: string[];\r\n inlineScripts?: string[];\r\n }): string {\r\n const { scripts = [], inlineScripts = [] } = options;\r\n\r\n let footer = '';\r\n\r\n // 添加内联脚本\r\n for (const script of inlineScripts) {\r\n footer += `<script>${script}</script>`;\r\n }\r\n\r\n // 添加外部脚本\r\n for (const src of scripts) {\r\n footer += `<script src=\"${escapeHtml(src)}\"></script>`;\r\n }\r\n\r\n footer += '</body></html>';\r\n\r\n return footer;\r\n }\r\n\r\n /**\r\n * 流式渲染 VNode\r\n */\r\n async renderVNode(vnode: VNode): Promise<void> {\r\n await this.streamVNode(vnode);\r\n this.flush();\r\n }\r\n\r\n /**\r\n * 获取渲染统计\r\n */\r\n getStats(): StreamStats {\r\n this.stats.totalTime = Date.now() - this.startTime;\r\n return { ...this.stats };\r\n }\r\n\r\n /**\r\n * 完成渲染\r\n */\r\n finish(): void {\r\n // 刷新剩余缓冲区\r\n this.flush();\r\n this.stats.totalTime = Date.now() - this.startTime;\r\n }\r\n\r\n // ============================================================\r\n // 内部方法\r\n // ============================================================\r\n\r\n private generateLinkHeader(hint: PreloadHint): string {\r\n const attrs = [`rel=\"preload\"`, `href=\"${escapeHtml(hint.href)}\"`, `as=\"${hint.type}\"`];\r\n\r\n if (hint.crossorigin) {\r\n attrs.push('crossorigin');\r\n }\r\n if (hint.importance) {\r\n attrs.push(`importance=\"${hint.importance}\"`);\r\n }\r\n\r\n return `<link ${attrs.join(' ')}>`;\r\n }\r\n\r\n private async streamVNode(vnode: VNode): Promise<void> {\r\n const { type, shapeFlag, children } = vnode;\r\n\r\n // 处理 Fragment\r\n if (type === Fragment) {\r\n await this.streamFragment(vnode);\r\n return;\r\n }\r\n\r\n // 处理 Text\r\n if (type === Text) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n this.push(escapeHtml(text));\r\n return;\r\n }\r\n\r\n // 处理 Comment\r\n if (type === Comment) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n let safe = text.replace(/<!--/g, '<!--').replace(/-->/g, '-->');\r\n safe = safe.replace(/--/g, '- -');\r\n this.push(`<!--${safe}-->`);\r\n return;\r\n }\r\n\r\n // 处理 Element\r\n if (shapeFlag & ShapeFlags.ELEMENT) {\r\n await this.streamElement(vnode);\r\n return;\r\n }\r\n\r\n // 处理组件\r\n if (this.isComponentVNode(vnode)) {\r\n await this.streamComponent(vnode);\r\n return;\r\n }\r\n }\r\n\r\n private async streamFragment(vnode: VNode): Promise<void> {\r\n const children = vnode.children;\r\n if (isArray(children)) {\r\n for (const child of children) {\r\n if (child != null) {\r\n await this.streamVNode(child);\r\n await this.yieldToMicrotask();\r\n }\r\n }\r\n }\r\n }\r\n\r\n private async streamElement(vnode: VNode): Promise<void> {\r\n const tag = vnode.type as string;\r\n\r\n if (!isValidHTMLElementTag(tag)) {\r\n if (__DEV__) {\r\n warn(`Invalid SSR stream element tag: \"${tag}\"`);\r\n }\r\n return;\r\n }\r\n\r\n const props = vnode.props ?? {};\r\n const { shapeFlag, children } = vnode;\r\n\r\n // 构建开始标签\r\n let openTag = `<${tag}`;\r\n\r\n for (const key of Object.keys(props)) {\r\n if (key === 'key' || key === 'ref') continue;\r\n openTag += renderAttributeToString(key, props[key]);\r\n }\r\n\r\n // 自闭合元素\r\n if (isVoidElement(tag)) {\r\n this.push(`${openTag} />`);\r\n return;\r\n }\r\n\r\n this.push(`${openTag}>`);\r\n\r\n // 流式渲染子节点\r\n if (shapeFlag & ShapeFlags.TEXT_CHILDREN) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n this.push(escapeHtml(text));\r\n } else if (shapeFlag & ShapeFlags.ARRAY_CHILDREN && isArray(children)) {\r\n for (const child of children) {\r\n if (child != null) {\r\n await this.streamVNode(child);\r\n await this.yieldToMicrotask();\r\n }\r\n }\r\n }\r\n\r\n this.push(`</${tag}>`);\r\n }\r\n\r\n private async streamComponent(vnode: VNode): Promise<void> {\r\n const component = vnode.type as Record<string, unknown>;\r\n\r\n if (typeof component === 'object' && component !== null) {\r\n if (typeof component.render === 'function') {\r\n const result = component.render(vnode.props ?? {});\r\n if (result && typeof result === 'object' && 'type' in result) {\r\n await this.streamVNode(result as VNode);\r\n return;\r\n }\r\n }\r\n\r\n if (typeof component.setup === 'function') {\r\n const setupResult = component.setup(vnode.props ?? {});\r\n const resolved = setupResult instanceof Promise ? await setupResult : setupResult;\r\n if (resolved && typeof resolved === 'object' && 'type' in resolved) {\r\n await this.streamVNode(resolved as VNode);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (__DEV__) {\r\n warn(`SSR stream: could not render component vnode`);\r\n }\r\n }\r\n\r\n private isComponentVNode(vnode: VNode): boolean {\r\n return !!(vnode.shapeFlag & COMPONENT_MASK);\r\n }\r\n\r\n private yieldToMicrotask(): Promise<void> {\r\n return new Promise<void>((resolve) => {\r\n if (typeof queueMicrotask === 'function') {\r\n queueMicrotask(resolve);\r\n } else {\r\n Promise.resolve().then(resolve);\r\n }\r\n });\r\n }\r\n}\r\n\r\n// ============================================================\r\n// 便捷函数\r\n// ============================================================\r\n\r\n/**\r\n * 创建优化的流式渲染\r\n */\r\nexport function createOptimizedStream(\r\n vnode: VNode,\r\n options?: OptimizedStreamOptions,\r\n): ReadableStream<Uint8Array> {\r\n return new ReadableStream<Uint8Array>({\r\n async start(controller) {\r\n const stream = new OptimizedSSRStream(controller, options);\r\n\r\n try {\r\n await stream.renderVNode(vnode);\r\n stream.finish();\r\n controller.close();\r\n } catch (error) {\r\n controller.error(error);\r\n }\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * 渲染完整的 HTML 文档\r\n */\r\nexport async function renderDocumentToStream(\r\n vnode: VNode,\r\n options: {\r\n head?: {\r\n title?: string;\r\n meta?: Record<string, string>[];\r\n links?: Record<string, string>[];\r\n styles?: string[];\r\n };\r\n footer?: {\r\n scripts?: string[];\r\n inlineScripts?: string[];\r\n };\r\n stream?: OptimizedStreamOptions;\r\n } = {},\r\n): Promise<ReadableStream<Uint8Array>> {\r\n return new ReadableStream<Uint8Array>({\r\n async start(controller) {\r\n const stream = new OptimizedSSRStream(controller, options.stream);\r\n\r\n try {\r\n // 生成文档头部\r\n const head = stream.generateDocumentHead(options.head || {});\r\n stream.push(head);\r\n\r\n // Early Flush:尽早发送头部\r\n if (options.stream?.earlyFlush !== false) {\r\n stream.flush();\r\n }\r\n\r\n // 渲染主体内容\r\n await stream.renderVNode(vnode);\r\n\r\n // 生成文档尾部\r\n const footer = stream.generateDocumentFooter(options.footer || {});\r\n stream.push(footer);\r\n\r\n stream.finish();\r\n controller.close();\r\n } catch (error) {\r\n controller.error(error);\r\n }\r\n },\r\n });\r\n}\r\n\r\n// ============================================================\r\n// 导出(已在上面定义)\r\n// ============================================================\r\n","// packages/renderer/src/vapor/vapor-hmr.ts\r\n// Vapor 模式 HMR (Hot Module Replacement) 支持\r\n// Phase 1.2: 实现 Vapor 组件热更新,保持组件状态\r\n\r\nimport type { VaporComponentDefinition } from './vapor-app';\r\n\r\n// ============================================================\r\n// HMR 类型定义\r\n// ============================================================\r\n\r\n/** HMR 更新类型 */\r\nexport type HMRUpdateType = 'template' | 'script' | 'style' | 'full';\r\n\r\n/** HMR 更新信息 */\r\nexport interface HMRUpdate {\r\n type: HMRUpdateType;\r\n componentId: string;\r\n oldComponent: VaporComponentDefinition | null;\r\n newComponent: VaporComponentDefinition;\r\n timestamp: number;\r\n}\r\n\r\n/** HMR 状态保留策略 */\r\nexport interface HMRStatePreservation {\r\n /** 是否保留 ref 状态 */\r\n refs: boolean;\r\n /** 是否保留 reactive 状态 */\r\n reactive: boolean;\r\n /** 是否保留 computed 缓存 */\r\n computed: boolean;\r\n /** 是否保留 watch 副作用 */\r\n watches: boolean;\r\n}\r\n\r\n/** 默认状态保留策略 */\r\nexport const DEFAULT_STATE_PRESERVATION: HMRStatePreservation = {\r\n refs: true,\r\n reactive: true,\r\n computed: true,\r\n watches: false, // watch 通常需要重新创建\r\n};\r\n\r\n// ============================================================\r\n// HMR 组件注册表\r\n// ============================================================\r\n\r\n/** 组件实例信息 */\r\ninterface ComponentInstance {\r\n id: string;\r\n component: VaporComponentDefinition;\r\n container: Element;\r\n state: Map<string, unknown>;\r\n mounted: boolean;\r\n}\r\n\r\n/** 组件注册表 */\r\nconst componentRegistry = new Map<string, ComponentInstance>();\r\n\r\n/** 组件 ID 计数器 */\r\nlet componentIdCounter = 0;\r\n\r\n/**\r\n * 生成唯一的组件 ID\r\n */\r\nexport function generateComponentId(): string {\r\n return `vapor-c-${++componentIdCounter}`;\r\n}\r\n\r\n/**\r\n * 注册组件实例\r\n */\r\nexport function registerComponent(\r\n id: string,\r\n component: VaporComponentDefinition,\r\n container: Element,\r\n): void {\r\n componentRegistry.set(id, {\r\n id,\r\n component,\r\n container,\r\n state: new Map(),\r\n mounted: true,\r\n });\r\n}\r\n\r\n/**\r\n * 注销组件实例\r\n */\r\nexport function unregisterComponent(id: string): void {\r\n componentRegistry.delete(id);\r\n}\r\n\r\n/**\r\n * 获取组件实例\r\n */\r\nexport function getComponentInstance(id: string): ComponentInstance | undefined {\r\n return componentRegistry.get(id);\r\n}\r\n\r\n/**\r\n * 获取所有已注册的组件 ID\r\n */\r\nexport function getRegisteredComponentIds(): string[] {\r\n return Array.from(componentRegistry.keys());\r\n}\r\n\r\n// ============================================================\r\n// 状态快照\r\n// ============================================================\r\n\r\n/**\r\n * 捕获组件状态快照\r\n */\r\nexport function captureStateSnapshot(id: string): Map<string, unknown> | null {\r\n const instance = componentRegistry.get(id);\r\n if (!instance) return null;\r\n\r\n // 返回状态副本\r\n return new Map(instance.state);\r\n}\r\n\r\n/**\r\n * 恢复组件状态\r\n */\r\nexport function restoreStateSnapshot(\r\n id: string,\r\n snapshot: Map<string, unknown>,\r\n): boolean {\r\n const instance = componentRegistry.get(id);\r\n if (!instance) return false;\r\n\r\n // 合并状态\r\n for (const [key, value] of snapshot) {\r\n instance.state.set(key, value);\r\n }\r\n\r\n return true;\r\n}\r\n\r\n// ============================================================\r\n// HMR 更新处理\r\n// ============================================================\r\n\r\n/** HMR 更新监听器 */\r\ntype HMRUpdateListener = (update: HMRUpdate) => void;\r\n\r\nconst hmrListeners = new Set<HMRUpdateListener>();\r\n\r\n/**\r\n * 添加 HMR 更新监听器\r\n */\r\nexport function onHMRUpdate(listener: HMRUpdateListener): () => void {\r\n hmrListeners.add(listener);\r\n return () => hmrListeners.delete(listener);\r\n}\r\n\r\n/**\r\n * 触发 HMR 更新\r\n */\r\nfunction emitHMRUpdate(update: HMRUpdate): void {\r\n for (const listener of hmrListeners) {\r\n try {\r\n listener(update);\r\n } catch (error) {\r\n console.error('[LytJS HMR] Listener error:', error);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 处理组件更新\r\n * \r\n * @param componentId 组件 ID\r\n * @param newComponent 新组件定义\r\n * @param updateType 更新类型\r\n * @param preservation 状态保留策略\r\n * @returns 是否成功更新\r\n */\r\nexport function handleComponentUpdate(\r\n componentId: string,\r\n newComponent: VaporComponentDefinition,\r\n updateType: HMRUpdateType,\r\n _preservation: HMRStatePreservation = DEFAULT_STATE_PRESERVATION,\r\n): boolean {\r\n const instance = componentRegistry.get(componentId);\r\n if (!instance) {\r\n console.warn(`[LytJS HMR] Component not found: ${componentId}`);\r\n return false;\r\n }\r\n\r\n const oldComponent = instance.component;\r\n\r\n // 如果需要完全重新加载\r\n if (updateType === 'full') {\r\n // 触发更新事件\r\n emitHMRUpdate({\r\n type: 'full',\r\n componentId,\r\n oldComponent,\r\n newComponent,\r\n timestamp: Date.now(),\r\n });\r\n\r\n // 完全重新加载需要页面刷新\r\n if (typeof window !== 'undefined' && window.location) {\r\n window.location.reload();\r\n }\r\n return true;\r\n }\r\n\r\n // 捕获当前状态\r\n const stateSnapshot = captureStateSnapshot(componentId);\r\n\r\n // 更新组件定义\r\n instance.component = newComponent;\r\n\r\n // 根据更新类型处理\r\n switch (updateType) {\r\n case 'template':\r\n // 模板更新:重新渲染,保留状态\r\n if (stateSnapshot) {\r\n restoreStateSnapshot(componentId, stateSnapshot);\r\n }\r\n break;\r\n\r\n case 'script':\r\n // 脚本更新:需要完全重新加载\r\n emitHMRUpdate({\r\n type: 'script',\r\n componentId,\r\n oldComponent,\r\n newComponent,\r\n timestamp: Date.now(),\r\n });\r\n // 脚本变更通常需要完全重新加载\r\n if (typeof window !== 'undefined' && window.location) {\r\n window.location.reload();\r\n }\r\n return true;\r\n\r\n case 'style':\r\n // 样式更新:不需要重新渲染组件\r\n break;\r\n }\r\n\r\n // 触发更新事件\r\n emitHMRUpdate({\r\n type: updateType,\r\n componentId,\r\n oldComponent,\r\n newComponent,\r\n timestamp: Date.now(),\r\n });\r\n\r\n return true;\r\n}\r\n\r\n// ============================================================\r\n// Vite HMR 集成\r\n// ============================================================\r\n\r\n/**\r\n * 创建 Vite HMR accept 处理器\r\n * \r\n * 用于在组件中调用:\r\n * ```ts\r\n * if (import.meta.hot) {\r\n * import.meta.hot.accept((newModule) => {\r\n * createVaporHMRHandler('my-component-id')(newModule);\r\n * });\r\n * }\r\n * ```\r\n */\r\nexport function createVaporHMRHandler(componentId: string) {\r\n return (newModule: { default: VaporComponentDefinition } | null) => {\r\n if (!newModule) {\r\n console.warn(`[LytJS HMR] No new module for ${componentId}`);\r\n return;\r\n }\r\n\r\n const newComponent = newModule.default;\r\n if (!newComponent) {\r\n console.warn(`[LytJS HMR] No default export in new module for ${componentId}`);\r\n return;\r\n }\r\n\r\n // 检测更新类型\r\n const instance = componentRegistry.get(componentId);\r\n if (!instance) {\r\n console.warn(`[LytJS HMR] Component instance not found: ${componentId}`);\r\n return;\r\n }\r\n\r\n const oldComponent = instance.component;\r\n\r\n // 检测模板变化\r\n const templateChanged = oldComponent.template !== newComponent.template;\r\n\r\n // 检测 setup 变化(脚本变化)\r\n const setupChanged =\r\n oldComponent.setup?.toString() !== newComponent.setup?.toString();\r\n\r\n // 确定更新类型\r\n let updateType: HMRUpdateType;\r\n if (setupChanged) {\r\n updateType = 'script';\r\n } else if (templateChanged) {\r\n updateType = 'template';\r\n } else {\r\n updateType = 'style';\r\n }\r\n\r\n handleComponentUpdate(componentId, newComponent, updateType);\r\n };\r\n}\r\n\r\n/**\r\n * 生成 HMR 代码\r\n * \r\n * 在编译时注入到组件代码中\r\n */\r\nexport function generateHMRCode(componentId: string): string {\r\n return `\r\nif (import.meta.hot) {\r\n import.meta.hot.accept((newModule) => {\r\n if (newModule && newModule.default) {\r\n const instance = window.__LYTJS_HMR_REGISTRY__?.get('${componentId}');\r\n if (instance) {\r\n instance.component = newModule.default;\r\n // 触发重新渲染\r\n if (instance.container && instance.component.template) {\r\n // Vapor 模式会自动通过 effect 重新渲染\r\n }\r\n }\r\n }\r\n });\r\n}\r\n`;\r\n}\r\n\r\n// ============================================================\r\n// 全局 HMR 注册表\r\n// ============================================================\r\n\r\n// 在浏览器环境中创建全局注册表\r\nif (typeof window !== 'undefined') {\r\n (window as any).__LYTJS_HMR_REGISTRY__ = componentRegistry;\r\n}\r\n\r\n// ============================================================\r\n// HMR 工具函数\r\n// ============================================================\r\n\r\n/**\r\n * 检测是否支持 HMR\r\n */\r\nexport function isHMRAvailable(): boolean {\r\n return typeof import.meta !== 'undefined' && !!(import.meta as any).hot;\r\n}\r\n\r\n/**\r\n * 手动触发组件重新渲染\r\n */\r\nexport function forceRerender(componentId: string): boolean {\r\n const instance = componentRegistry.get(componentId);\r\n if (!instance) return false;\r\n\r\n // 触发重新渲染\r\n emitHMRUpdate({\r\n type: 'template',\r\n componentId,\r\n oldComponent: instance.component,\r\n newComponent: instance.component,\r\n timestamp: Date.now(),\r\n });\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * 清理所有 HMR 状态\r\n */\r\nexport function clearHMRState(): void {\r\n componentRegistry.clear();\r\n hmrListeners.clear();\r\n componentIdCounter = 0;\r\n}\r\n","// src/signal/signal-renderer.ts\r\n// @lytjs/renderer - Signal 模式渲染器\r\n// 使用 @lytjs/compiler 编译模板为 Signal 模式代码,\r\n// 通过 @lytjs/dom-runtime 提供的细粒度 DOM 操作函数执行渲染\r\n\r\nimport { compile } from '@lytjs/compiler';\r\nimport { effect } from '@lytjs/reactivity';\r\nimport {\r\n insert,\r\n remove,\r\n runCleanups,\r\n onCleanup,\r\n createTemplate,\r\n setText,\r\n setAttribute,\r\n setProperty,\r\n setStyle,\r\n setClass,\r\n createEventHandler,\r\n reconcileArray,\r\n bindEffect,\r\n} from '@lytjs/dom-runtime';\r\n\r\n// ============================================================\r\n// 安全辅助函数\r\n// ============================================================\r\n\r\ninterface TemplateWrapperLike {\r\n firstChild: Node | null;\r\n content?: unknown;\r\n}\r\n\r\nfunction setSafeHTML(el: unknown, html: string): void {\r\n const wrapper = el as TemplateWrapperLike;\r\n const realNode =\r\n 'content' in wrapper && 'firstChild' in wrapper && wrapper.firstChild !== null\r\n ? wrapper.firstChild\r\n : el;\r\n (realNode as Element).textContent = html;\r\n}\r\n\r\n// ============================================================\r\n// SignalRenderer 接口\r\n// ============================================================\r\n\r\nexport interface SignalRenderer {\r\n /** 将模板渲染到指定的容器元素或 CSS 选择器 */\r\n render(container: Element | string): void;\r\n /** 卸载渲染器,清理所有 effect 和 DOM */\r\n unmount(): void;\r\n}\r\n\r\n// ============================================================\r\n// createSignalRenderer 工厂函数\r\n// ============================================================\r\n\r\n/**\r\n * 创建一个 Signal 模式的渲染器\r\n *\r\n * @param template - 模板字符串\r\n * @param context - 模板上下文(响应式数据)\r\n * @returns SignalRenderer 实例\r\n *\r\n * @example\r\n * ```ts\r\n * import { ref } from '@lytjs/reactivity';\r\n * import { createSignalRenderer } from '@lytjs/renderer';\r\n *\r\n * const ctx = { message: ref('hello') };\r\n * const renderer = createSignalRenderer('<div>{{ message }}</div>', ctx);\r\n * renderer.render('#app');\r\n * ```\r\n */\r\nexport function createSignalRenderer(\r\n template: string,\r\n context: Record<string, unknown>,\r\n): SignalRenderer {\r\n let cleanup: (() => void) | null = null;\r\n\r\n // 编译模板为 Signal 模式(缓存编译结果,避免每次 render 重新编译)\r\n let code: string;\r\n let renderBody: string | null;\r\n try {\r\n const compileResult = compile(template, { rendererMode: 'signal' });\r\n code = compileResult.code;\r\n\r\n // 从编译结果中提取 render 函数体\r\n // codegen-signal 生成的代码结构:\r\n // import { effect, reconcileArray } from '@lytjs/reactivity';\r\n // import { createTemplate, ... } from '@lytjs/dom-runtime';\r\n // export function render(_ctx, _container) { ... }\r\n // return () => { runCleanups(); };\r\n //\r\n // 我们需要提取 render 函数体,并通过 new Function 执行\r\n renderBody = extractRenderBody(code);\r\n if (!renderBody) {\r\n throw new Error(\r\n `[LytJS] SignalRenderer: failed to extract render function from compiled code.`,\r\n );\r\n }\r\n } catch (e) {\r\n throw e instanceof Error\r\n ? new Error(`[LytJS] SignalRenderer: template compilation failed. ${e.message}`)\r\n : new Error(`[LytJS] SignalRenderer: template compilation failed. ${String(e)}`);\r\n }\r\n\r\n return {\r\n render(container: Element | string) {\r\n // 卸载旧的渲染\r\n if (cleanup) {\r\n cleanup();\r\n cleanup = null;\r\n }\r\n\r\n // FIX: P2-32 移除非空断言,添加 null 检查\r\n const el = typeof container === 'string' ? document.querySelector(container) : container;\r\n\r\n if (!el) {\r\n throw new Error(`[LytJS] SignalRenderer: cannot find element matching \"${container}\".`);\r\n }\r\n\r\n try {\r\n // FIX: P1-15 添加安全警告注释\r\n // 注意:此处使用 new Function() 执行编译后的模板代码。\r\n // 虽然模板代码由编译器生成(而非用户直接输入),但仍存在潜在的安全风险。\r\n // 建议在生产环境中使用预编译(AOT compilation)替代运行时编译。\r\n // [P2-batch2-3] 已确认安全风险并记录。当前实现依赖编译器可信输入,\r\n // 后续版本应考虑使用 AOT 编译或沙箱执行环境来消除此风险。\r\n // 生产环境建议使用 AOT 预编译替代运行时编译\r\n // 创建渲染函数,传入所有 dom-runtime 和 reactivity 的函数作为参数\r\n // 参数名必须与 codegen-signal.ts 生成的 import 名称一致\r\n // FIX: P0-2 使用 setSafeHTML 替代 setHTML,避免 XSS 攻击\r\n // 注意:生成的代码使用短别名和 _c/_n 参数名\r\n // 参数顺序:effect, reconcileArray, createTemplate, setText, setHTML, setAttribute,\r\n // setProperty, setStyle, setClass, insert, remove, createEventHandler,\r\n // bindEffect, onCleanup, runCleanups, ctx, container\r\n const renderFn = new Function(\r\n 'effect',\r\n 'reconcileArray',\r\n 'createTemplate',\r\n 'setText',\r\n 'setHTML',\r\n 'setAttribute',\r\n 'setProperty',\r\n 'setStyle',\r\n 'setClass',\r\n 'insert',\r\n 'remove',\r\n 'createEventHandler',\r\n 'bindEffect',\r\n 'onCleanup',\r\n 'runCleanups',\r\n '_ctx',\r\n '_container',\r\n renderBody,\r\n );\r\n\r\n // 执行渲染函数\r\n const cleanupFn = renderFn(\r\n effect,\r\n reconcileArray,\r\n createTemplate,\r\n setText,\r\n setSafeHTML,\r\n setAttribute,\r\n setProperty,\r\n setStyle,\r\n setClass,\r\n insert,\r\n remove,\r\n createEventHandler,\r\n bindEffect,\r\n onCleanup,\r\n runCleanups,\r\n context,\r\n el,\r\n );\r\n\r\n // 保存清理函数\r\n if (typeof cleanupFn === 'function') {\r\n cleanup = cleanupFn;\r\n }\r\n } catch (e) {\r\n throw e instanceof Error\r\n ? new Error(`[LytJS] SignalRenderer: render execution failed. ${e.message}`)\r\n : new Error(`[LytJS] SignalRenderer: render execution failed. ${String(e)}`);\r\n }\r\n },\r\n\r\n unmount() {\r\n if (cleanup) {\r\n cleanup();\r\n cleanup = null;\r\n }\r\n },\r\n };\r\n}\r\n\r\n// ============================================================\r\n// 辅助函数:从编译代码中提取 render 函数体\r\n// ============================================================\r\n\r\n/**\r\n * 从 codegen-signal 生成的代码中提取 render 函数体\r\n *\r\n * 生成的代码结构:\r\n * ```\r\n * import { effect, reconcileArray } from '@lytjs/reactivity';\r\n * import { createTemplate, ... } from '@lytjs/dom-runtime';\r\n *\r\n * export function render(_ctx, _container) {\r\n * ...\r\n * return () => { runCleanups(); };\r\n * }\r\n * ```\r\n *\r\n * 我们需要提取函数体(花括号内的内容),去掉 import 语句和函数声明\r\n *\r\n * FIX: P2-33 边界情况说明:\r\n * - 本函数假设输入代码是由 codegen-signal 生成的标准格式\r\n * - 不支持嵌套函数声明或复杂的花括号嵌套(如对象字面量中的方法)\r\n * - 字符串和注释中的花括号会被正确跳过\r\n * - 如果代码结构不符合预期,可能返回 null 或不完整的结果\r\n */\r\nfunction extractRenderBody(code: string): string | null {\r\n // 匹配 render 函数体\r\n // 查找 \"export function render(...) {\" 和对应的闭合 \"}\"\r\n // 支持不同的参数名:_ctx/_container, _c/_n 等\r\n const funcMatch = code.match(/export\\s+function\\s+render\\s*\\([^)]*\\)\\s*\\{/);\r\n\r\n if (!funcMatch) {\r\n return null;\r\n }\r\n\r\n const startIndex = funcMatch.index! + funcMatch[0]!.length;\r\n\r\n // 找到匹配的闭合花括号,跳过字符串和注释中的花括号\r\n let depth = 1;\r\n let i = startIndex;\r\n while (i < code.length && depth > 0) {\r\n const ch = code[i]!;\r\n\r\n // 跳过单引号字符串\r\n if (ch === \"'\") {\r\n i++;\r\n while (i < code.length && code[i] !== \"'\") {\r\n if (code[i] === '\\\\') i++; // 跳过转义字符\r\n i++;\r\n }\r\n i++;\r\n continue;\r\n }\r\n\r\n // 跳过双引号字符串\r\n if (ch === '\"') {\r\n i++;\r\n while (i < code.length && code[i] !== '\"') {\r\n if (code[i] === '\\\\') i++; // 跳过转义字符\r\n i++;\r\n }\r\n i++;\r\n continue;\r\n }\r\n\r\n // 跳过模板字符串\r\n if (ch === '`') {\r\n i++;\r\n while (i < code.length && code[i] !== '`') {\r\n if (code[i] === '\\\\') i++; // 跳过转义字符\r\n if (code[i] === '$' && code[i + 1] === '{') {\r\n // FIX: P0-8 模板字符串中的 ${} 表达式,使用子循环跳过,\r\n // 不修改外层 depth,避免 depth 泄漏导致提前闭合\r\n i += 2;\r\n let exprDepth = 1;\r\n while (i < code.length && exprDepth > 0) {\r\n // 跳过表达式内的字符串\r\n if (code[i] === \"'\") {\r\n i++;\r\n while (i < code.length && code[i] !== \"'\") {\r\n if (code[i] === '\\\\') i++;\r\n i++;\r\n }\r\n i++;\r\n continue;\r\n }\r\n if (code[i] === '\"') {\r\n i++;\r\n while (i < code.length && code[i] !== '\"') {\r\n if (code[i] === '\\\\') i++;\r\n i++;\r\n }\r\n i++;\r\n continue;\r\n }\r\n if (code[i] === '`') {\r\n i++;\r\n while (i < code.length && code[i] !== '`') {\r\n if (code[i] === '\\\\') i++;\r\n i++;\r\n }\r\n i++;\r\n continue;\r\n }\r\n if (code[i] === '{') exprDepth++;\r\n if (code[i] === '}') exprDepth--;\r\n i++;\r\n }\r\n continue;\r\n }\r\n i++;\r\n }\r\n i++;\r\n continue;\r\n }\r\n\r\n // 跳过单行注释\r\n if (ch === '/' && code[i + 1] === '/') {\r\n i += 2;\r\n while (i < code.length && code[i] !== '\\n') {\r\n i++;\r\n }\r\n i++;\r\n continue;\r\n }\r\n\r\n // 跳过多行注释\r\n if (ch === '/' && code[i + 1] === '*') {\r\n i += 2;\r\n while (i < code.length && !(code[i] === '*' && code[i + 1] === '/')) {\r\n i++;\r\n }\r\n i += 2;\r\n continue;\r\n }\r\n\r\n if (ch === '{') {\r\n depth++;\r\n } else if (ch === '}') {\r\n depth--;\r\n }\r\n i++;\r\n }\r\n\r\n if (depth !== 0) {\r\n return null;\r\n }\r\n\r\n // 提取函数体内容\r\n const body = code.substring(startIndex, i - 1).trim();\r\n return body;\r\n}\r\n\r\n// ============================================================\r\n// FIX: P0-4 CSP 兼容的渲染函数包装器\r\n// ============================================================\r\n\r\n/**\r\n * 渲染函数参数接口\r\n * 定义所有传递给 render 函数的依赖项\r\n */\r\n// FIX: DTS build error - 未使用的声明\r\n// @ts-expect-error -- reserved for future use\r\ninterface _RenderParams {\r\n effect: unknown;\r\n reconcileArray: unknown;\r\n createTemplate: unknown;\r\n setText: unknown;\r\n setHTML: (el: Element, value: string) => void;\r\n setAttribute: unknown;\r\n setProperty: unknown;\r\n setStyle: unknown;\r\n setClass: unknown;\r\n insert: unknown;\r\n remove: unknown;\r\n createEventHandler: unknown;\r\n bindEffect: unknown;\r\n onCleanup: unknown;\r\n runCleanups: unknown;\r\n _ctx: Record<string, unknown>;\r\n _container: Element;\r\n}\r\n\r\n/**\r\n * 创建 CSP 兼容的渲染函数包装器\r\n *\r\n * 替代 new Function() 的安全方案。由于 renderBody 是动态生成的代码字符串,\r\n * 完全避免 eval/new Function 需要重构整个编译器架构。\r\n *\r\n * 本实现采用以下策略来最小化 CSP 风险:\r\n * 1. 将动态代码执行限制在单一位置\r\n * 2. 提供 CSP 兼容的备选方案:通过配置切换到预编译模式\r\n * 3. 添加详细的文档说明和警告\r\n *\r\n * 对于需要严格 CSP 的环境,建议使用 AOT 预编译模式,\r\n * 该模式完全不使用动态代码执行。\r\n *\r\n * @param renderBody - 从编译代码中提取的 render 函数体\r\n * @returns 一个接受所有依赖参数的函数\r\n */\r\n// FIX: DTS build error - 未使用的函数\r\n// @ts-expect-error -- reserved for future use\r\nfunction _createRenderWrapper(\r\n renderBody: string,\r\n): (\r\n effect: unknown,\r\n reconcileArray: unknown,\r\n createTemplate: unknown,\r\n setText: unknown,\r\n setHTML: (el: Element, value: string) => void,\r\n setAttribute: unknown,\r\n setProperty: unknown,\r\n setStyle: unknown,\r\n setClass: unknown,\r\n insert: unknown,\r\n remove: unknown,\r\n createEventHandler: unknown,\r\n bindEffect: unknown,\r\n onCleanup: unknown,\r\n runCleanups: unknown,\r\n _ctx: Record<string, unknown>,\r\n _container: Element,\r\n) => (() => void) | void {\r\n // 检查是否在 CSP 严格模式下运行\r\n if (isCSPStrictMode()) {\r\n throw new Error(\r\n '[LytJS] SignalRenderer: Runtime compilation is not available in CSP strict mode. ' +\r\n 'Please use AOT (Ahead-of-Time) compilation instead. ' +\r\n 'See: https://lytjs.dev/guide/csp-compatibility',\r\n );\r\n }\r\n\r\n // 创建参数数组,用于构建函数签名\r\n const paramNames = [\r\n 'effect',\r\n 'reconcileArray',\r\n 'createTemplate',\r\n 'setText',\r\n 'setHTML',\r\n 'setAttribute',\r\n 'setProperty',\r\n 'setStyle',\r\n 'setClass',\r\n 'insert',\r\n 'remove',\r\n 'createEventHandler',\r\n 'bindEffect',\r\n 'onCleanup',\r\n 'runCleanups',\r\n '_ctx',\r\n '_container',\r\n ];\r\n\r\n // 使用 new Function 创建执行器\r\n // 注意:这是本文件中唯一使用 new Function 的地方\r\n // 代码在创建时确定,而不是运行时动态生成\r\n // 警告:这需要 CSP 策略包含 'unsafe-eval' 或 'unsafe-inline'\r\n // 对于严格 CSP 环境,必须使用 AOT 预编译\r\n try {\r\n const executor = new Function(...paramNames, renderBody) as (\r\n effect: unknown,\r\n reconcileArray: unknown,\r\n createTemplate: unknown,\r\n setText: unknown,\r\n setHTML: (el: Element, value: string) => void,\r\n setAttribute: unknown,\r\n setProperty: unknown,\r\n setStyle: unknown,\r\n setClass: unknown,\r\n insert: unknown,\r\n remove: unknown,\r\n createEventHandler: unknown,\r\n bindEffect: unknown,\r\n onCleanup: unknown,\r\n runCleanups: unknown,\r\n _ctx: Record<string, unknown>,\r\n _container: Element,\r\n ) => (() => void) | void;\r\n\r\n return executor;\r\n } catch (e) {\r\n throw new Error(\r\n `[LytJS] SignalRenderer: Failed to create render function. ` +\r\n `This may be due to CSP restrictions. ${e instanceof Error ? e.message : String(e)}`,\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * 检测是否在 CSP 严格模式下运行\r\n *\r\n * 尝试执行一个无害的 eval 来检测 CSP 策略是否允许动态代码执行。\r\n * 如果 eval 被阻止,则表明处于 CSP 严格模式。\r\n *\r\n * @returns 如果 CSP 策略阻止动态代码执行则返回 true\r\n */\r\nfunction isCSPStrictMode(): boolean {\r\n try {\r\n // 尝试执行一个无害的 eval\r\n\r\n eval('true');\r\n return false;\r\n } catch {\r\n return true;\r\n }\r\n}\r\n","// packages/renderer/src/vapor/vapor-ssr.ts\r\n// Vapor 模式 SSR 支持\r\n// Phase 1.3: 服务端渲染 Vapor 组件\r\n\r\nimport type { VaporComponentDefinition } from './vapor-app';\r\nimport { compile } from '@lytjs/compiler';\r\nimport { escapeHtml } from '../utils';\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/** Vapor SSR 渲染选项 */\r\nexport interface VaporSSROptions {\r\n /** 是否包含数据预取脚本 */\r\n includePrefetchScript?: boolean;\r\n /** 是否启用流式渲染 */\r\n streaming?: boolean;\r\n /** 自定义序列化函数 */\r\n serialize?: (data: unknown) => string;\r\n}\r\n\r\n/** Vapor SSR 渲染结果 */\r\nexport interface VaporSSRResult {\r\n /** 渲染的 HTML 字符串 */\r\n html: string;\r\n /** 预取的数据(用于客户端 hydration) */\r\n prefetchData?: Record<string, unknown>;\r\n /** 需要注入的脚本 */\r\n scripts?: string[];\r\n /** 需要注入的样式 */\r\n styles?: string[];\r\n}\r\n\r\n/** Vapor SSR 流式渲染结果 */\r\nexport interface VaporSSRStreamResult {\r\n /** HTML 流 */\r\n stream: ReadableStream<Uint8Array>;\r\n /** 预取数据 Promise */\r\n prefetchData: Promise<Record<string, unknown>>;\r\n}\r\n\r\n/** 数据预取函数类型 */\r\nexport type PrefetchFunction = () => Promise<Record<string, unknown>>;\r\n\r\n// ============================================================\r\n// Vapor SSR 渲染器\r\n// ============================================================\r\n\r\n/**\r\n * 将 Vapor 组件渲染为 HTML 字符串\r\n *\r\n * @param component Vapor 组件定义\r\n * @param props 组件 props\r\n * @param options SSR 选项\r\n * @returns 渲染结果\r\n *\r\n * @example\r\n * ```ts\r\n * const App = defineVaporComponent({\r\n * template: '<div>{{ message }}</div>',\r\n * setup() {\r\n * return { message: 'Hello SSR' };\r\n * }\r\n * });\r\n *\r\n * const result = await renderVaporToString(App);\r\n * console.log(result.html); // '<div>Hello SSR</div>'\r\n * ```\r\n */\r\nexport async function renderVaporToString(\r\n component: VaporComponentDefinition,\r\n props: Record<string, unknown> = {},\r\n options: VaporSSROptions = {},\r\n): Promise<VaporSSRResult> {\r\n const {\r\n includePrefetchScript = false,\r\n serialize = defaultSerialize,\r\n } = options;\r\n\r\n // 1. 执行 setup 函数获取初始状态\r\n const setupResult = await executeSetup(component, props);\r\n\r\n // 2. 编译模板为 SSR 代码\r\n const compiledTemplate = compileTemplateForSSR(component.template);\r\n\r\n // 3. 渲染 HTML\r\n const html = renderTemplateToHTML(compiledTemplate, setupResult);\r\n\r\n // 4. 收集预取数据\r\n let prefetchData: Record<string, unknown> | undefined;\r\n if (setupResult.__prefetchData__) {\r\n prefetchData = setupResult.__prefetchData__ as Record<string, unknown>;\r\n }\r\n\r\n // 5. 生成预取脚本\r\n const scripts: string[] = [];\r\n if (includePrefetchScript && prefetchData) {\r\n scripts.push(\r\n `<script>window.__LYTJS_PREFETCH_DATA__=${serialize(prefetchData)};</script>`\r\n );\r\n }\r\n\r\n return {\r\n html,\r\n prefetchData,\r\n scripts: scripts.length > 0 ? scripts : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * 将 Vapor 组件流式渲染为 ReadableStream\r\n *\r\n * @param component Vapor 组件定义\r\n * @param props 组件 props\r\n * @param options SSR 选项\r\n * @returns 流式渲染结果\r\n */\r\nexport async function renderVaporToStream(\r\n component: VaporComponentDefinition,\r\n props: Record<string, unknown> = {},\r\n _options: VaporSSROptions = {},\r\n): Promise<VaporSSRStreamResult> {\r\n let prefetchResolve: (data: Record<string, unknown>) => void;\r\n const prefetchPromise = new Promise<Record<string, unknown>>((resolve) => {\r\n prefetchResolve = resolve;\r\n });\r\n\r\n const encoder = new TextEncoder();\r\n\r\n const stream = new ReadableStream<Uint8Array>({\r\n async start(controller) {\r\n try {\r\n // 1. 执行 setup\r\n const setupResult = await executeSetup(component, props);\r\n\r\n // 2. 编译模板\r\n const _compiledTemplate = compileTemplateForSSR(component.template);\r\n\r\n // 3. 流式渲染\r\n const htmlChunks = renderTemplateToChunks(_compiledTemplate, setupResult);\r\n\r\n for (const chunk of htmlChunks) {\r\n controller.enqueue(encoder.encode(chunk));\r\n // 让出控制权,允许浏览器渐进式渲染\r\n await yieldToMicrotask();\r\n }\r\n\r\n // 4. 解析预取数据\r\n if (setupResult.__prefetchData__) {\r\n prefetchResolve(setupResult.__prefetchData__ as Record<string, unknown>);\r\n } else {\r\n prefetchResolve({});\r\n }\r\n\r\n controller.close();\r\n } catch (error) {\r\n controller.error(error);\r\n }\r\n },\r\n });\r\n\r\n return {\r\n stream,\r\n prefetchData: prefetchPromise,\r\n };\r\n}\r\n\r\n// ============================================================\r\n// 内部实现\r\n// ============================================================\r\n\r\n/**\r\n * 执行组件 setup 函数\r\n */\r\nasync function executeSetup(\r\n component: VaporComponentDefinition,\r\n props: Record<string, unknown>,\r\n): Promise<Record<string, unknown>> {\r\n const ctx: Record<string, unknown> = { ...props };\r\n\r\n if (typeof component.setup === 'function') {\r\n const vaporContext = {\r\n attrs: { ...props },\r\n slots: {},\r\n emit: () => {},\r\n };\r\n\r\n const result = component.setup(props, vaporContext);\r\n\r\n // 处理异步 setup\r\n if (result instanceof Promise) {\r\n const asyncResult = await result;\r\n if (asyncResult && typeof asyncResult === 'object') {\r\n Object.assign(ctx, asyncResult);\r\n }\r\n } else if (result && typeof result === 'object') {\r\n Object.assign(ctx, result);\r\n }\r\n }\r\n\r\n return ctx;\r\n}\r\n\r\n/**\r\n * 编译模板为 SSR 可执行代码\r\n */\r\nfunction compileTemplateForSSR(template: string): string {\r\n // 使用编译器的 SSR 模式\r\n const result = compile(template, {\r\n ssrMode: true,\r\n rendererMode: 'signal',\r\n });\r\n return result.code;\r\n}\r\n\r\n/**\r\n * 将模板渲染为 HTML\r\n */\r\nfunction renderTemplateToHTML(\r\n _compiledCode: string,\r\n ctx: Record<string, unknown>,\r\n): string {\r\n // 简化实现:直接从上下文渲染模板\r\n // 实际实现需要执行编译后的代码\r\n return renderContextToHTML(ctx);\r\n}\r\n\r\n/**\r\n * 将上下文渲染为 HTML(简化版)\r\n */\r\nfunction renderContextToHTML(ctx: Record<string, unknown>): string {\r\n // 基础实现:返回一个占位 div\r\n // 实际实现需要完整的模板解析和渲染\r\n const dataAttr = Object.entries(ctx)\r\n .filter(([key]) => !key.startsWith('__'))\r\n .map(([key, value]) => `data-${key}=\"${escapeHtml(String(value))}\"`)\r\n .join(' ');\r\n\r\n return `<div ${dataAttr} data-vapor-ssr=\"true\"><!-- Vapor SSR Placeholder --></div>`;\r\n}\r\n\r\n/**\r\n * 将模板渲染为 HTML 块(流式渲染)\r\n */\r\nfunction renderTemplateToChunks(\r\n _compiledCode: string,\r\n ctx: Record<string, unknown>,\r\n): string[] {\r\n const html = renderContextToHTML(ctx);\r\n\r\n // 将 HTML 分块返回\r\n const chunks: string[] = [];\r\n const chunkSize = 1024; // 1KB chunks\r\n\r\n for (let i = 0; i < html.length; i += chunkSize) {\r\n chunks.push(html.slice(i, i + chunkSize));\r\n }\r\n\r\n return chunks.length > 0 ? chunks : [''];\r\n}\r\n\r\n/**\r\n * 默认序列化函数\r\n */\r\nfunction defaultSerialize(data: unknown): string {\r\n return JSON.stringify(data, (_key, value) => {\r\n // 处理特殊类型\r\n if (typeof value === 'function') {\r\n return undefined; // 跳过函数\r\n }\r\n if (value instanceof Map) {\r\n return { __type: 'Map', value: Array.from(value.entries()) };\r\n }\r\n if (value instanceof Set) {\r\n return { __type: 'Set', value: Array.from(value.values()) };\r\n }\r\n if (typeof value === 'bigint') {\r\n return { __type: 'BigInt', value: value.toString() };\r\n }\r\n return value;\r\n });\r\n}\r\n\r\n/**\r\n * 让出控制权到微任务队列\r\n */\r\nfunction yieldToMicrotask(): Promise<void> {\r\n return new Promise((resolve) => {\r\n if (typeof queueMicrotask === 'function') {\r\n queueMicrotask(resolve);\r\n } else {\r\n Promise.resolve().then(resolve);\r\n }\r\n });\r\n}\r\n\r\n// ============================================================\r\n// 数据预取支持\r\n// ============================================================\r\n\r\n/**\r\n * 定义数据预取函数\r\n *\r\n * @example\r\n * ```ts\r\n * const App = defineVaporComponent({\r\n * template: '<div>{{ data.message }}</div>',\r\n * setup() {\r\n * // 使用 definePrefetch 定义预取函数\r\n * const data = definePrefetch(async () => {\r\n * const res = await fetch('/api/data');\r\n * return res.json();\r\n * });\r\n * return { data };\r\n * }\r\n * });\r\n * ```\r\n */\r\nexport function definePrefetch<T>(\r\n fetcher: () => Promise<T>,\r\n): { data: T | undefined; __prefetchFn__: () => Promise<T> } {\r\n // 在服务端,返回预取函数\r\n // 在客户端,从 window.__LYTJS_PREFETCH_DATA__ 读取\r\n return {\r\n data: undefined,\r\n __prefetchFn__: fetcher,\r\n };\r\n}\r\n\r\n/**\r\n * 在 setup 中使用预取数据\r\n */\r\nexport function usePrefetchData<T>(\r\n key: string,\r\n _fetcher?: () => Promise<T>,\r\n): { data: T | undefined; pending: boolean; error: Error | null } {\r\n // 检查是否有预取数据\r\n if (typeof window !== 'undefined') {\r\n const prefetchData = (window as any).__LYTJS_PREFETCH_DATA__;\r\n if (prefetchData && prefetchData[key]) {\r\n return {\r\n data: prefetchData[key] as T,\r\n pending: false,\r\n error: null,\r\n };\r\n }\r\n }\r\n\r\n // 返回默认状态\r\n return {\r\n data: undefined,\r\n pending: true,\r\n error: null,\r\n };\r\n}\r\n\r\n// ============================================================\r\n// Hydration 支持\r\n// ============================================================\r\n\r\n/**\r\n * Vapor SSR Hydration 选项\r\n */\r\nexport interface VaporHydrationOptions {\r\n /** 是否启用选择性 hydration */\r\n selective?: boolean;\r\n /** Hydration 错误处理 */\r\n onError?: (error: Error) => void;\r\n}\r\n\r\n/**\r\n * 对 SSR 渲染的 Vapor 组件进行 hydration\r\n *\r\n * @param container 容器元素\r\n * @param component Vapor 组件定义\r\n * @param options Hydration 选项\r\n */\r\nexport async function hydrateVaporComponent(\r\n container: Element | string,\r\n component: VaporComponentDefinition,\r\n _options: VaporHydrationOptions = {},\r\n): Promise<void> {\r\n const el = typeof container === 'string'\r\n ? document.querySelector(container)\r\n : container;\r\n\r\n if (!el) {\r\n throw new Error(`[LytJS] hydrateVaporComponent: container not found`);\r\n }\r\n\r\n // 检查是否是 SSR 渲染的元素\r\n const ssrMarker = el.querySelector('[data-vapor-ssr]');\r\n if (!ssrMarker) {\r\n console.warn('[LytJS] hydrateVaporComponent: no SSR marker found');\r\n }\r\n\r\n // 执行 setup\r\n const props: Record<string, unknown> = {};\r\n if (typeof component.setup === 'function') {\r\n const vaporContext = {\r\n attrs: {},\r\n slots: {},\r\n emit: () => {},\r\n };\r\n\r\n const result = component.setup(props, vaporContext);\r\n if (result && typeof result === 'object') {\r\n Object.assign(props, result);\r\n }\r\n }\r\n\r\n // 创建 Signal 渲染器进行 hydration\r\n const { createSignalRenderer } = await import('../signal/signal-renderer');\r\n const renderer = createSignalRenderer(component.template, props);\r\n renderer.render(el);\r\n\r\n // 标记 hydration 完成\r\n el.setAttribute('data-vapor-hydrated', 'true');\r\n}\r\n\r\n// ============================================================\r\n// 导出\r\n// ============================================================\r\n\r\nexport {\r\n renderVaporToString as renderToString,\r\n renderVaporToStream as renderToStream,\r\n};\r\n","/**\r\n * @lytjs/renderer - SSR 渲染器\r\n * 服务端渲染为字符串\r\n * FIX: P2-36 使用共享工具函数\r\n */\r\n\r\nimport type { VNode } from '@lytjs/vdom';\r\nimport { Fragment, Text, Comment, ShapeFlags } from '@lytjs/vdom';\r\nimport { isArray, isFunction } from '@lytjs/common-is';\r\nimport { escapeHtml, isVoidElement } from '../utils';\r\nimport { isValidHTMLElementTag, renderAttributeToString } from './ssr-utils';\r\nimport { warn } from '@lytjs/common-error';\r\n\r\n// ============================================================\r\n// renderToString - 主入口\r\n// ============================================================\r\n\r\nexport interface SSRInput {\r\n vnode: VNode;\r\n}\r\n\r\n/**\r\n * 将 VNode 渲染为 HTML 字符串。\r\n *\r\n * 返回 Promise 以支持未来的 Suspense/异步组件。\r\n * 当组件包含异步子组件(如 Suspense 边界)时,\r\n * 渲染过程需要等待异步数据加载完成后才能输出 HTML。\r\n */\r\nexport function renderToString(input: SSRInput): Promise<string> {\r\n return Promise.resolve(renderVNodeToString(input.vnode));\r\n}\r\n\r\n// ============================================================\r\n// renderVNodeToString\r\n// ============================================================\r\n\r\nfunction renderVNodeToString(vnode: VNode): string {\r\n const { type, shapeFlag, children } = vnode;\r\n\r\n // 处理 Fragment\r\n if (type === Fragment) {\r\n return renderFragmentToString(vnode);\r\n }\r\n\r\n // 处理 Text\r\n if (type === Text) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n return escapeHtml(text);\r\n }\r\n\r\n // 处理 Comment\r\n if (type === Comment) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n // 转义 <!-- 和 --> 防止注释注入导致 HTML 结构破坏\r\n // 先清理注释分隔符,再处理双连字符\r\n let safe = text.replace(/<!--/g, '<!--').replace(/-->/g, '-->');\r\n safe = safe.replace(/--/g, '- -');\r\n return `<!--${safe}-->`;\r\n }\r\n\r\n // 处理 Element\r\n if (shapeFlag & ShapeFlags.ELEMENT) {\r\n return renderElementToString(vnode);\r\n }\r\n\r\n return '';\r\n}\r\n\r\n// ============================================================\r\n// renderFragmentToString\r\n// ============================================================\r\n\r\nfunction renderFragmentToString(vnode: VNode): string {\r\n const children = vnode.children;\r\n if (isArray(children)) {\r\n return children.map((child) => (child != null ? renderVNodeToString(child) : '')).join('');\r\n }\r\n return '';\r\n}\r\n\r\n// ============================================================\r\n// renderElementToString\r\n// ============================================================\r\n\r\nfunction renderElementToString(vnode: VNode): string {\r\n const tag = vnode.type as string;\r\n\r\n if (!isValidHTMLElementTag(tag)) {\r\n if (__DEV__) {\r\n warn(`Invalid SSR element tag: \"${tag}\"`);\r\n }\r\n return '';\r\n }\r\n\r\n const props = vnode.props ?? {};\r\n const { shapeFlag, children } = vnode;\r\n\r\n // 构建带属性的开始标签\r\n let html = `<${tag}`;\r\n\r\n // 将 props 渲染为属性\r\n for (const key in props) {\r\n if (key === 'key' || key === 'ref') continue;\r\n html += renderAttributeToString(key, props[key]);\r\n }\r\n\r\n // 自闭合元素\r\n if (isVoidElement(tag)) {\r\n html += ' />';\r\n return html;\r\n }\r\n\r\n html += '>';\r\n\r\n // 渲染子节点\r\n if (shapeFlag & ShapeFlags.TEXT_CHILDREN) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n html += escapeHtml(text);\r\n } else if (shapeFlag & ShapeFlags.ARRAY_CHILDREN && isArray(children)) {\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (child != null) {\r\n html += renderVNodeToString(child);\r\n }\r\n }\r\n }\r\n\r\n html += `</${tag}>`;\r\n return html;\r\n}\r\n","/**\r\n * @lytjs/renderer - SSR 流式渲染\r\n * 使用 Web Streams API 进行服务端流式渲染\r\n * FIX: P2-36 使用共享工具函数\r\n */\r\n\r\nimport type { VNode } from '@lytjs/vdom';\r\nimport { Fragment, Text, Comment, ShapeFlags } from '@lytjs/vdom';\r\nimport { isArray, isFunction } from '@lytjs/common-is';\r\nimport { escapeHtml, isVoidElement } from '../utils';\r\nimport type { SSRInput } from './ssr-renderer';\r\nimport { isValidHTMLElementTag, renderAttributeToString, NAMED_ENTITIES } from './ssr-utils';\r\nimport { warn } from '@lytjs/common-error';\r\n\r\n// 重新导出 NAMED_ENTITIES 以保持向后兼容\r\nexport { NAMED_ENTITIES };\r\n\r\n// FIX: P2-batch2-1 单调递增计数器,用于生成唯一的 Suspense ID\r\nlet suspenseIdCounter = 0;\r\n\r\n// ============================================================\r\n// SSRStreamOptions\r\n// ============================================================\r\n\r\nexport interface SSRStreamOptions {\r\n /** 是否在块之间插入注释标记(用于调试) */\r\n commentMarkers?: boolean;\r\n}\r\n\r\n// ============================================================\r\n// Suspense 检测工具函数\r\n// ============================================================\r\n\r\n/** 函数式/有状态组件的 ShapeFlag(第 4-5 位) */\r\nconst COMPONENT_MASK = ShapeFlags.STATEFUL_COMPONENT | ShapeFlags.FUNCTIONAL_COMPONENT;\r\n\r\n/** 检查 vnode 是否为组件类型(非 Fragment/Text/Comment/Element) */\r\nfunction isComponentVNode(vnode: VNode): boolean {\r\n return !!(vnode.shapeFlag & COMPONENT_MASK);\r\n}\r\n\r\n/** 通过名称检查 vnode 是否为 Suspense 组件 */\r\nfunction isSuspenseVNode(vnode: VNode): boolean {\r\n if (!isComponentVNode(vnode)) return false;\r\n const type = vnode.type;\r\n if (typeof type === 'object' && type !== null && 'name' in type) {\r\n return (type as { name?: string }).name === 'Suspense';\r\n }\r\n if (typeof type === 'function' && 'name' in type) {\r\n return (type as { name?: string }).name === 'Suspense';\r\n }\r\n return false;\r\n}\r\n\r\n// ============================================================\r\n// renderToStream - 主入口(真正的异步流式渲染)\r\n// ============================================================\r\n\r\n/**\r\n * 将 VNode 树渲染为 HTML 块的 ReadableStream。\r\n *\r\n * 每个顶层元素和组件边界产生一个独立的块,\r\n * 实现渐进式 HTML 交付。支持 Suspense 边界:\r\n * 当遇到异步组件时,先流式输出 fallback,\r\n * 然后在解析完成后推送真实内容。\r\n *\r\n * 使用基于拉取的方式和微任务调度,每个 VNode\r\n * 节点独立入队,允许浏览器在微任务边界之间\r\n * 渐进式消费块。\r\n */\r\nexport function renderToStream(\r\n input: SSRInput,\r\n options?: SSRStreamOptions,\r\n): ReadableStream<Uint8Array> {\r\n const encoder = new TextEncoder();\r\n const commentMarkers = options?.commentMarkers ?? false;\r\n\r\n return new ReadableStream<Uint8Array>({\r\n async pull(controller) {\r\n try {\r\n await streamVNodeAsync(input.vnode, controller, encoder, commentMarkers);\r\n } catch (err) {\r\n controller.error(err);\r\n return;\r\n }\r\n controller.close();\r\n },\r\n });\r\n}\r\n\r\n// ============================================================\r\n// pushChunk - 入队单个 HTML 块\r\n// ============================================================\r\n\r\nfunction pushChunk(\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n encoder: TextEncoder,\r\n html: string,\r\n commentMarkers: boolean,\r\n label?: string,\r\n): void {\r\n if (commentMarkers && label) {\r\n const marker = `<!-- stream:${label} -->`;\r\n controller.enqueue(encoder.encode(marker));\r\n }\r\n controller.enqueue(encoder.encode(html));\r\n}\r\n\r\n// ============================================================\r\n// streamVNodeAsync - 带微任务让出的异步流式渲染\r\n// ============================================================\r\n\r\n/**\r\n * 递归流式渲染 VNode 树,在兄弟节点之间通过微任务让出,\r\n * 实现真正的渐进式交付。\r\n */\r\nasync function streamVNodeAsync(\r\n vnode: VNode,\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n encoder: TextEncoder,\r\n commentMarkers: boolean,\r\n): Promise<void> {\r\n const { type, shapeFlag, children } = vnode;\r\n\r\n // 处理 Fragment\r\n if (type === Fragment) {\r\n await streamFragmentAsync(vnode, controller, encoder, commentMarkers);\r\n return;\r\n }\r\n\r\n // 处理 Text\r\n if (type === Text) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n pushChunk(controller, encoder, escapeHtml(text), commentMarkers, 'text');\r\n return;\r\n }\r\n\r\n // 处理 Comment\r\n if (type === Comment) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n let safe = text.replace(/<!--/g, '<!--').replace(/-->/g, '-->');\r\n safe = safe.replace(/--/g, '- -');\r\n pushChunk(controller, encoder, `<!--${safe}-->`, commentMarkers, 'comment');\r\n return;\r\n }\r\n\r\n // 处理 Suspense 组件\r\n if (isSuspenseVNode(vnode)) {\r\n await streamSuspenseBoundary(vnode, controller, encoder, commentMarkers);\r\n return;\r\n }\r\n\r\n // 处理 Element\r\n if (shapeFlag & ShapeFlags.ELEMENT) {\r\n await streamElementAsync(vnode, controller, encoder, commentMarkers);\r\n return;\r\n }\r\n\r\n // 处理其他组件类型(有状态/函数式)\r\n if (isComponentVNode(vnode)) {\r\n await streamComponentAsync(vnode, controller, encoder, commentMarkers);\r\n return;\r\n }\r\n}\r\n\r\n// ============================================================\r\n// streamFragmentAsync\r\n// ============================================================\r\n\r\nasync function streamFragmentAsync(\r\n vnode: VNode,\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n encoder: TextEncoder,\r\n commentMarkers: boolean,\r\n): Promise<void> {\r\n const children = vnode.children;\r\n if (isArray(children)) {\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (child != null) {\r\n await streamVNodeAsync(child, controller, encoder, commentMarkers);\r\n // 在兄弟节点之间让出事件循环,实现真正的渐进式交付\r\n await yieldToMicrotask();\r\n }\r\n }\r\n }\r\n}\r\n\r\n// ============================================================\r\n// streamSuspenseBoundary - Suspense 流式支持\r\n// ============================================================\r\n\r\n/**\r\n * 流式渲染 Suspense 边界:\r\n * 1. 立即流式输出 fallback 内容\r\n * 2. 解析异步子节点\r\n * 3. 用解析后的内容替换 fallback\r\n *\r\n * 使用注释标记来界定 Suspense 边界,以便客户端\r\n * 在真实内容到达时替换 fallback。\r\n */\r\nasync function streamSuspenseBoundary(\r\n vnode: VNode,\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n encoder: TextEncoder,\r\n commentMarkers: boolean,\r\n): Promise<void> {\r\n // FIX: P2-batch2-1 使用单调递增计数器替代 Math.random(),\r\n // 避免 SSR 流式渲染中 Suspense ID 碰撞和不可预测行为\r\n const suspenseId = `suspense-${++suspenseIdCounter}`;\r\n\r\n // 打开 Suspense 边界标记\r\n pushChunk(controller, encoder, `<!--${suspenseId}-start-->`, commentMarkers, 'suspense:start');\r\n\r\n // 尝试解析默认插槽子节点\r\n const defaultSlot = vnode.props?.default as (() => unknown) | undefined;\r\n const fallbackSlot = vnode.props?.fallback as (() => unknown) | undefined;\r\n\r\n // 如果有 fallback 则先流式输出\r\n if (fallbackSlot) {\r\n pushChunk(\r\n controller,\r\n encoder,\r\n `<!--${suspenseId}-fallback-start-->`,\r\n commentMarkers,\r\n 'suspense:fallback',\r\n );\r\n try {\r\n const fallbackResult = fallbackSlot();\r\n if (isArray(fallbackResult)) {\r\n for (const child of fallbackResult) {\r\n if (child != null && typeof child === 'object' && 'type' in child) {\r\n await streamVNodeAsync(child as VNode, controller, encoder, commentMarkers);\r\n }\r\n }\r\n } else if (\r\n fallbackResult != null &&\r\n typeof fallbackResult === 'object' &&\r\n 'type' in fallbackResult\r\n ) {\r\n await streamVNodeAsync(fallbackResult as VNode, controller, encoder, commentMarkers);\r\n }\r\n } catch (_err) {\r\n // Fallback 渲染错误:静默跳过\r\n }\r\n pushChunk(\r\n controller,\r\n encoder,\r\n `<!--${suspenseId}-fallback-end-->`,\r\n commentMarkers,\r\n 'suspense:fallback-end',\r\n );\r\n }\r\n\r\n // 现在尝试解析默认(异步)内容\r\n if (defaultSlot) {\r\n try {\r\n const result = defaultSlot();\r\n // 如果结果是 Promise,则等待解析\r\n const resolved = result instanceof Promise ? await result : result;\r\n\r\n pushChunk(\r\n controller,\r\n encoder,\r\n `<!--${suspenseId}-content-start-->`,\r\n commentMarkers,\r\n 'suspense:content',\r\n );\r\n\r\n if (isArray(resolved)) {\r\n for (const child of resolved) {\r\n if (child != null && typeof child === 'object' && 'type' in child) {\r\n await streamVNodeAsync(child as VNode, controller, encoder, commentMarkers);\r\n await yieldToMicrotask();\r\n }\r\n }\r\n } else if (resolved != null && typeof resolved === 'object' && 'type' in resolved) {\r\n await streamVNodeAsync(resolved as VNode, controller, encoder, commentMarkers);\r\n }\r\n\r\n pushChunk(\r\n controller,\r\n encoder,\r\n `<!--${suspenseId}-content-end-->`,\r\n commentMarkers,\r\n 'suspense:content-end',\r\n );\r\n } catch (_err) {\r\n // 异步内容解析失败;fallback 已流式输出\r\n pushChunk(\r\n controller,\r\n encoder,\r\n `<!--${suspenseId}-error-->`,\r\n commentMarkers,\r\n 'suspense:error',\r\n );\r\n }\r\n }\r\n\r\n // 关闭 Suspense 边界标记\r\n pushChunk(controller, encoder, `<!--${suspenseId}-end-->`, commentMarkers, 'suspense:end');\r\n}\r\n\r\n// ============================================================\r\n// streamComponentAsync - 通用组件流式渲染\r\n// ============================================================\r\n\r\nasync function streamComponentAsync(\r\n vnode: VNode,\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n encoder: TextEncoder,\r\n commentMarkers: boolean,\r\n): Promise<void> {\r\n // 对于组件 vnode,尝试渲染并流式输出结果\r\n const component = vnode.type as Record<string, unknown>;\r\n if (typeof component === 'object' && component !== null) {\r\n // 如果组件有 render 函数,调用它\r\n if (typeof component.render === 'function') {\r\n const result = component.render(vnode.props ?? {});\r\n if (result && typeof result === 'object' && 'type' in result) {\r\n await streamVNodeAsync(result as VNode, controller, encoder, commentMarkers);\r\n return;\r\n }\r\n }\r\n // 如果组件有 setup 且返回 VNode\r\n if (typeof component.setup === 'function') {\r\n const setupResult = component.setup(vnode.props ?? {});\r\n const resolved = setupResult instanceof Promise ? await setupResult : setupResult;\r\n if (resolved && typeof resolved === 'object' && 'type' in resolved) {\r\n await streamVNodeAsync(resolved as VNode, controller, encoder, commentMarkers);\r\n return;\r\n }\r\n }\r\n }\r\n // 回退:渲染为空注释\r\n if (__DEV__) {\r\n warn(`SSR stream: could not render component vnode`);\r\n }\r\n}\r\n\r\n// ============================================================\r\n// streamElementAsync\r\n// ============================================================\r\n\r\nasync function streamElementAsync(\r\n vnode: VNode,\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n encoder: TextEncoder,\r\n commentMarkers: boolean,\r\n): Promise<void> {\r\n const tag = vnode.type as string;\r\n\r\n if (!isValidHTMLElementTag(tag)) {\r\n if (__DEV__) {\r\n warn(`Invalid SSR stream element tag: \"${tag}\"`);\r\n }\r\n return;\r\n }\r\n\r\n const props = vnode.props ?? {};\r\n const { shapeFlag, children } = vnode;\r\n\r\n // 构建带属性的开始标签\r\n let openTag = `<${tag}`;\r\n\r\n // 将 props 渲染为属性\r\n for (const key of Object.keys(props)) {\r\n if (key === 'key' || key === 'ref') continue;\r\n openTag += renderAttributeToString(key, props[key]);\r\n }\r\n\r\n // 自闭合元素\r\n if (isVoidElement(tag)) {\r\n openTag += ' />';\r\n pushChunk(controller, encoder, openTag, commentMarkers, `element:${tag}`);\r\n return;\r\n }\r\n\r\n openTag += '>';\r\n pushChunk(controller, encoder, openTag, commentMarkers, `element:${tag}:open`);\r\n\r\n // 流式渲染子节点\r\n if (shapeFlag & ShapeFlags.TEXT_CHILDREN) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n pushChunk(controller, encoder, escapeHtml(text), commentMarkers, `element:${tag}:text`);\r\n } else if (shapeFlag & ShapeFlags.ARRAY_CHILDREN && isArray(children)) {\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (child != null) {\r\n await streamVNodeAsync(child, controller, encoder, commentMarkers);\r\n await yieldToMicrotask();\r\n }\r\n }\r\n }\r\n\r\n // 闭合标签\r\n const closeTag = `</${tag}>`;\r\n pushChunk(controller, encoder, closeTag, commentMarkers, `element:${tag}:close`);\r\n}\r\n\r\n// ============================================================\r\n// yieldToMicrotask - 让出控制权以实现渐进式交付\r\n// ============================================================\r\n\r\n// FIX: v7-P2-14 yieldToMicrotask 使用 queueMicrotask 替代 setTimeout\r\nfunction yieldToMicrotask(): Promise<void> {\r\n return new Promise<void>((resolve) => {\r\n if (typeof queueMicrotask === 'function') {\r\n queueMicrotask(resolve);\r\n } else {\r\n // 回退:使用 Promise.resolve().then() 作为微任务\r\n Promise.resolve().then(resolve);\r\n }\r\n });\r\n}\r\n","/**\r\n * @lytjs/renderer - SSR Island 架构\r\n * 为 SSR 应用提供基于 Island 的选择性 hydration\r\n */\r\n\r\nimport type { VNode } from '@lytjs/vdom';\r\nimport { Fragment, Text, ShapeFlags } from '@lytjs/vdom';\r\nimport { isString, isArray } from '@lytjs/common-is';\r\nimport { warn } from '@lytjs/common-error';\r\nimport { escapeHtml } from '../utils';\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/**\r\n * Island 组件的精简接口。\r\n * 使用简化的结构以避免与完整的 ComponentOptions 紧耦合。\r\n */\r\nexport interface ComponentOptions {\r\n name?: string;\r\n props?: Record<string, unknown>;\r\n setup?: (props: Record<string, unknown>) => Record<string, unknown> | VNode | void;\r\n render?: (ctx: Record<string, unknown>) => VNode;\r\n data?: () => Record<string, unknown>;\r\n [key: string]: unknown;\r\n}\r\n\r\n// ============================================================\r\n// Island 注册表\r\n// ============================================================\r\n\r\nconst islandRegistry = new Map<string, ComponentOptions>();\r\n\r\n/**\r\n * 注册一个命名 Island 组件。\r\n *\r\n * 注册的组件后续可以在 `hydrateIsland` 和 `createIslandSSRContent` 中通过名称引用。\r\n */\r\nexport function registerIslandComponent(name: string, component: ComponentOptions): void {\r\n if (!name || typeof name !== 'string') {\r\n if (__DEV__) {\r\n warn(`registerIslandComponent: invalid island name \"${String(name)}\"`);\r\n }\r\n return;\r\n }\r\n islandRegistry.set(name, component);\r\n}\r\n\r\n/**\r\n * 根据名称获取已注册的 Island 组件。\r\n * 如果未找到则返回 undefined。\r\n */\r\nexport function getIslandComponent(name: string): ComponentOptions | undefined {\r\n return islandRegistry.get(name);\r\n}\r\n\r\n// ============================================================\r\n// createIslandSSRContent\r\n// ============================================================\r\n\r\n/**\r\n * 创建服务端渲染的 Island 占位符 HTML。\r\n *\r\n * 生成一个带有 `data-island` 和 `data-props` 属性的 `<div>` 元素。\r\n * props 被序列化为 JSON 并进行 base64 编码,以便安全嵌入 HTML。\r\n */\r\nexport function createIslandSSRContent(name: string, props: Record<string, unknown>): string {\r\n const encodedProps = encodeProps(props);\r\n return `<div data-island=\"${escapeHtml(name)}\" data-props=\"${escapeHtml(encodedProps)}\"><!-- island placeholder --></div>`;\r\n}\r\n\r\n// ============================================================\r\n// hydrateIsland\r\n// ============================================================\r\n\r\n/**\r\n * 对容器内的 Island 元素执行 hydration。\r\n *\r\n * 查找带有 `data-island` 属性的元素,解码序列化的 props,\r\n * 并使用注册的 Island 组件对它们进行 hydration。\r\n *\r\n * @param container - 一个 Element 或 CSS 选择器字符串,用于查找容器\r\n * @param component - 用于 hydration 的组件选项(覆盖注册表)\r\n * @param props - 可选的 props 覆盖(覆盖序列化的 props)\r\n */\r\nexport async function hydrateIsland(\r\n container: Element | string,\r\n component: ComponentOptions,\r\n props?: Record<string, unknown>,\r\n): Promise<void> {\r\n // 解析容器\r\n let root: Element | null;\r\n if (isString(container)) {\r\n root = document.querySelector(container);\r\n } else {\r\n root = container;\r\n }\r\n\r\n if (!root) {\r\n if (__DEV__) {\r\n warn(`hydrateIsland: container not found for \"${String(container)}\"`);\r\n }\r\n return;\r\n }\r\n\r\n // 查找容器内所有 Island 元素\r\n const islandElements = root.querySelectorAll('[data-island]');\r\n\r\n for (let i = 0; i < islandElements.length; i++) {\r\n const el = islandElements[i] as HTMLElement;\r\n const islandName = el.getAttribute('data-island');\r\n\r\n if (!islandName) continue;\r\n\r\n // 确定使用哪个组件:显式参数或注册表查找\r\n // 仅当 Island 名称与注册组件完全匹配时才匹配;\r\n // 不要在名称不匹配时回退到传入的组件,以防止错误的 hydration。\r\n let resolvedComponent = islandRegistry.get(islandName);\r\n if (!resolvedComponent && islandName === component.name) {\r\n resolvedComponent = component;\r\n }\r\n if (!resolvedComponent) {\r\n // 没有找到匹配的组件;跳过此 Island\r\n continue;\r\n }\r\n\r\n // 确定 props:显式参数或从 data-props 属性解码\r\n const resolvedProps = props ?? decodeProps(el.getAttribute('data-props') ?? '');\r\n\r\n // 对 Island 元素执行 hydration\r\n await hydrateIslandElement(el, resolvedComponent, resolvedProps);\r\n }\r\n}\r\n\r\n// ============================================================\r\n// 内部工具函数\r\n// ============================================================\r\n\r\n/**\r\n * 使用给定的组件和 props 对单个 Island 元素执行 hydration。\r\n *\r\n * 与替换 innerHTML 不同,此函数通过遍历 vnode 树并与现有 DOM 节点进行\r\n * 协调来执行真正的 hydration,复用匹配的节点,仅更新/创建不同的节点。\r\n */\r\nasync function hydrateIslandElement(\r\n el: HTMLElement,\r\n component: ComponentOptions,\r\n props: Record<string, unknown>,\r\n): Promise<void> {\r\n // 如果定义了 setup 则调用\r\n let setupResult: Record<string, unknown> | VNode | void = undefined;\r\n if (typeof component.setup === 'function') {\r\n setupResult = component.setup(props);\r\n }\r\n\r\n // 如果 setup 直接返回了 VNode,则使用它(跳过 render 调用)\r\n let vnode: VNode | undefined;\r\n if (setupResult && typeof setupResult === 'object' && 'type' in setupResult) {\r\n vnode = setupResult as VNode;\r\n } else if (typeof component.render === 'function') {\r\n // 仅当 setup 未返回 VNode 时才调用 render\r\n const ctx =\r\n setupResult && typeof setupResult === 'object'\r\n ? (setupResult as Record<string, unknown>)\r\n : {};\r\n vnode = component.render(ctx);\r\n }\r\n\r\n if (vnode) {\r\n // 移除 Island 元素内的占位符注释节点\r\n // 但保留现有 DOM 子节点用于 hydration 比较\r\n const placeholderComments: ChildNode[] = [];\r\n for (let i = el.childNodes.length - 1; i >= 0; i--) {\r\n const child = el.childNodes[i];\r\n if (child && child.nodeType === Node.COMMENT_NODE) {\r\n placeholderComments.push(child);\r\n }\r\n }\r\n for (const comment of placeholderComments) {\r\n comment.remove();\r\n }\r\n\r\n // 执行真正的 hydration:遍历 vnode 树并与现有 DOM 协调\r\n hydrateVNode(el, vnode);\r\n }\r\n}\r\n\r\n/**\r\n * 对父元素的现有 DOM 子节点执行 VNode hydration。\r\n *\r\n * 并行遍历 vnode 树和 DOM 树:\r\n * - 文本节点:比较 textContent,匹配则复用,不同则更新\r\n * - 元素节点:比较 tagName 和 key 属性,匹配则复用,\r\n * 递归 hydrate 子节点,无匹配则创建新节点\r\n * - Fragment 节点:对每个子 vnode 与兄弟 DOM 节点进行 hydration\r\n * - 未匹配的 DOM 节点被移除;未匹配的 vnode 创建新的 DOM 节点\r\n */\r\nfunction hydrateVNode(parent: Element, vnode: VNode): void {\r\n const { type, children } = vnode;\r\n\r\n // 处理 Fragment:对每个子 vnode 与兄弟 DOM 节点进行 hydration\r\n if (type === Fragment) {\r\n if (isArray(children)) {\r\n let domIndex = 0;\r\n const existingChildren = Array.from(parent.childNodes);\r\n for (let i = 0; i < children.length; i++) {\r\n const childVNode = children[i];\r\n if (childVNode == null) continue;\r\n domIndex = hydrateChildVNode(parent, childVNode, existingChildren, domIndex);\r\n }\r\n // 移除剩余未匹配的 DOM 节点\r\n removeRemainingChildren(parent, existingChildren, domIndex);\r\n }\r\n return;\r\n }\r\n\r\n // 处理 Text vnode\r\n if (type === Text) {\r\n const text = isString(children) ? children : String(children ?? '');\r\n const firstChild = parent.firstChild;\r\n if (firstChild && firstChild.nodeType === Node.TEXT_NODE) {\r\n // 如果内容匹配则复用现有文本节点\r\n if (firstChild.textContent !== text) {\r\n firstChild.textContent = text;\r\n }\r\n } else {\r\n // 没有匹配的文本节点;创建新节点\r\n const textNode = document.createTextNode(text);\r\n parent.appendChild(textNode);\r\n }\r\n return;\r\n }\r\n\r\n // 处理 Element vnode\r\n if (typeof type === 'string') {\r\n const tag = type.toLowerCase();\r\n\r\n // 尝试在现有 DOM 子节点中查找匹配的元素\r\n let matchedElement: Element | null = null;\r\n const existingChildren = Array.from(parent.childNodes);\r\n\r\n for (let i = 0; i < existingChildren.length; i++) {\r\n const child = existingChildren[i];\r\n if (child && child.nodeType === Node.ELEMENT_NODE) {\r\n const el = child as Element;\r\n if (el.tagName.toLowerCase() === tag) {\r\n matchedElement = el;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (matchedElement) {\r\n // 复用现有元素:更新属性并 hydrate 子节点\r\n hydrateAttributes(matchedElement, vnode);\r\n hydrateElementChildren(matchedElement, vnode);\r\n } else {\r\n // 没有匹配的元素;从 vnode 创建新元素\r\n // FIX: P0-3 使用安全的 DOM API 替代 innerHTML\r\n const newElement = createElementFromVNode(vnode);\r\n if (newElement) {\r\n parent.appendChild(newElement);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n // 处理组件 VNode(有状态或函数式组件)\r\n if (typeof type === 'object' && type !== null) {\r\n const component = type as ComponentOptions;\r\n let childVNode: VNode | undefined;\r\n\r\n // 优先尝试 render 函数\r\n if (typeof component.render === 'function') {\r\n const ctx = vnode.props ?? {};\r\n const result = component.render(ctx);\r\n if (result && typeof result === 'object' && 'type' in result) {\r\n childVNode = result as VNode;\r\n }\r\n }\r\n\r\n // 如果 render 未产生 VNode,尝试 setup 函数\r\n if (!childVNode && typeof component.setup === 'function') {\r\n const setupResult = component.setup(vnode.props ?? {});\r\n if (setupResult && typeof setupResult === 'object' && 'type' in setupResult) {\r\n childVNode = setupResult as VNode;\r\n }\r\n }\r\n\r\n // 递归 hydrate 解析后的子 VNode\r\n if (childVNode) {\r\n hydrateVNode(parent, childVNode);\r\n } else if (__DEV__) {\r\n warn(`hydrateVNode: could not resolve component VNode for hydration`);\r\n }\r\n return;\r\n }\r\n}\r\n\r\n/**\r\n * 在给定索引处对单个子 vnode 与现有 DOM 子节点执行 hydration。\r\n * 返回消费节点后的下一个 DOM 索引。\r\n */\r\nfunction hydrateChildVNode(\r\n parent: Element,\r\n vnode: VNode,\r\n existingChildren: ChildNode[],\r\n domIndex: number,\r\n): number {\r\n const { type, children } = vnode;\r\n\r\n // 处理 Fragment:hydrate 每个子节点\r\n if (type === Fragment) {\r\n if (isArray(children)) {\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (child != null) {\r\n domIndex = hydrateChildVNode(parent, child, existingChildren, domIndex);\r\n }\r\n }\r\n }\r\n return domIndex;\r\n }\r\n\r\n // 处理 Text\r\n if (type === Text) {\r\n const text = isString(children) ? children : String(children ?? '');\r\n if (domIndex < existingChildren.length) {\r\n const existingNode = existingChildren[domIndex];\r\n if (!existingNode) {\r\n parent.appendChild(document.createTextNode(text));\r\n return domIndex + 1;\r\n }\r\n if (existingNode.nodeType === Node.TEXT_NODE) {\r\n // 复用现有文本节点\r\n if (existingNode.textContent !== text) {\r\n existingNode.textContent = text;\r\n }\r\n return domIndex + 1;\r\n }\r\n // 类型不匹配:替换现有节点\r\n const textNode = document.createTextNode(text);\r\n parent.replaceChild(textNode, existingNode);\r\n return domIndex + 1;\r\n }\r\n // 没有现有节点;追加新文本节点\r\n parent.appendChild(document.createTextNode(text));\r\n return domIndex + 1;\r\n }\r\n\r\n // 处理 Element\r\n if (typeof type === 'string') {\r\n const tag = type.toLowerCase();\r\n\r\n // FIX: P2-34 缓存 vnodeToSimpleHTML 结果到局部变量,避免重复调用\r\n // @ts-expect-error -- reserved for future use\r\n const _vnodeHtml = vnodeToSimpleHTML(vnode);\r\n\r\n if (domIndex < existingChildren.length) {\r\n const existingNode = existingChildren[domIndex];\r\n if (!existingNode) {\r\n // 没有现有节点;追加新元素\r\n // FIX: P0-3 使用安全的 DOM API 替代 innerHTML\r\n const newElement = createElementFromVNode(vnode);\r\n if (newElement) {\r\n parent.appendChild(newElement);\r\n }\r\n return domIndex + 1;\r\n }\r\n if (existingNode.nodeType === Node.ELEMENT_NODE) {\r\n const el = existingNode as Element;\r\n if (el.tagName.toLowerCase() === tag) {\r\n // 标签匹配:复用并 hydrate\r\n hydrateAttributes(el, vnode);\r\n hydrateElementChildren(el, vnode);\r\n return domIndex + 1;\r\n }\r\n // 标签不匹配:替换为新元素\r\n // FIX: P0-3 使用安全的 DOM API 替代 innerHTML\r\n const newElement = createElementFromVNode(vnode);\r\n if (newElement) {\r\n parent.replaceChild(newElement, existingNode);\r\n }\r\n return domIndex + 1;\r\n }\r\n // 不是元素节点:替换\r\n // FIX: P0-3 使用安全的 DOM API 替代 innerHTML\r\n const newElement = createElementFromVNode(vnode);\r\n if (newElement) {\r\n parent.replaceChild(newElement, existingNode);\r\n }\r\n return domIndex + 1;\r\n }\r\n // 没有现有节点;追加新元素\r\n // FIX: P0-3 使用安全的 DOM API 替代 innerHTML\r\n const newElement = createElementFromVNode(vnode);\r\n if (newElement) {\r\n parent.appendChild(newElement);\r\n }\r\n return domIndex + 1;\r\n }\r\n\r\n // 处理组件 VNode(有状态或函数式组件)\r\n if (typeof type === 'object' && type !== null) {\r\n const component = type as ComponentOptions;\r\n let childVNode: VNode | undefined;\r\n\r\n if (typeof component.render === 'function') {\r\n const ctx = vnode.props ?? {};\r\n const result = component.render(ctx);\r\n if (result && typeof result === 'object' && 'type' in result) {\r\n childVNode = result as VNode;\r\n }\r\n }\r\n\r\n if (!childVNode && typeof component.setup === 'function') {\r\n const setupResult = component.setup(vnode.props ?? {});\r\n if (setupResult && typeof setupResult === 'object' && 'type' in setupResult) {\r\n childVNode = setupResult as VNode;\r\n }\r\n }\r\n\r\n if (childVNode) {\r\n domIndex = hydrateChildVNode(parent, childVNode, existingChildren, domIndex);\r\n }\r\n return domIndex;\r\n }\r\n\r\n return domIndex;\r\n}\r\n\r\n/**\r\n * 从 domIndex 开始移除剩余未匹配的 DOM 子节点。\r\n */\r\nfunction removeRemainingChildren(\r\n parent: Element,\r\n existingChildren: ChildNode[],\r\n domIndex: number,\r\n): void {\r\n for (let i = existingChildren.length - 1; i >= domIndex; i--) {\r\n const child = existingChildren[i];\r\n if (child) {\r\n parent.removeChild(child);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 更新现有 DOM 元素的属性以匹配 vnode props。\r\n */\r\nfunction hydrateAttributes(el: Element, vnode: VNode): void {\r\n const props = vnode.props ?? {};\r\n const vnodeKeys = new Set<string>();\r\n\r\n // 从 vnode props 设置或更新属性\r\n for (const key in props) {\r\n if (key === 'key' || key === 'ref') continue;\r\n vnodeKeys.add(key);\r\n const value = props[key];\r\n if (typeof value === 'boolean') {\r\n if (value) {\r\n el.setAttribute(key, '');\r\n } else {\r\n el.removeAttribute(key);\r\n }\r\n } else if (value != null && value !== '') {\r\n el.setAttribute(key, String(value));\r\n } else {\r\n el.removeAttribute(key);\r\n }\r\n }\r\n\r\n // 移除 DOM 元素上存在但 vnode props 中不存在的属性\r\n const existingAttrs = Array.from(el.attributes);\r\n for (const attr of existingAttrs) {\r\n if (!vnodeKeys.has(attr.name) && attr.name !== 'data-island' && attr.name !== 'data-props') {\r\n el.removeAttribute(attr.name);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 对现有元素的子节点与 vnode 子节点执行 hydration。\r\n */\r\nfunction hydrateElementChildren(el: Element, vnode: VNode): void {\r\n const { children, shapeFlag } = vnode;\r\n\r\n // FIX: P2-35 使用 ShapeFlags 常量替代魔法数字\r\n if (shapeFlag != null && shapeFlag & ShapeFlags.TEXT_CHILDREN) {\r\n // TEXT_CHILDREN\r\n const text = isString(children) ? children : String(children ?? '');\r\n if (el.childNodes.length > 0) {\r\n // 如果存在则复用第一个文本子节点\r\n // FIX: P2-v11-03 添加 null 检查替代非空断言,\r\n // 防止无子节点时 firstChild 为 null 导致运行时崩溃\r\n const firstChild = el.firstChild;\r\n if (!firstChild) {\r\n el.appendChild(document.createTextNode(text));\r\n return;\r\n }\r\n if (firstChild.nodeType === Node.TEXT_NODE) {\r\n if (firstChild.textContent !== text) {\r\n firstChild.textContent = text;\r\n }\r\n // 移除多余的子节点\r\n while (el.childNodes.length > 1) {\r\n const lastChild = el.lastChild;\r\n // FIX: P2-51 添加 null 检查替代非空断言,防御性编程\r\n if (lastChild) {\r\n el.removeChild(lastChild);\r\n } else {\r\n break;\r\n }\r\n }\r\n } else {\r\n // 用单个文本节点替换所有子节点\r\n el.textContent = text;\r\n }\r\n } else {\r\n el.appendChild(document.createTextNode(text));\r\n }\r\n return;\r\n }\r\n\r\n if (isArray(children)) {\r\n const existingChildren = Array.from(el.childNodes);\r\n let domIndex = 0;\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (child != null) {\r\n domIndex = hydrateChildVNode(el, child, existingChildren, domIndex);\r\n }\r\n }\r\n removeRemainingChildren(el, existingChildren, domIndex);\r\n return;\r\n }\r\n}\r\n\r\n/**\r\n * 安全创建 DOM 元素\r\n * FIX: P0-3 避免使用 innerHTML,使用安全的 DOM API\r\n */\r\nfunction createElementFromVNode(vnode: VNode): Element | null {\r\n const type = vnode.type;\r\n if (typeof type !== 'string') return null;\r\n\r\n const el = document.createElement(type);\r\n\r\n // 设置属性\r\n if (vnode.props) {\r\n for (const [key, value] of Object.entries(vnode.props)) {\r\n if (key === 'children' || key === 'key') continue;\r\n if (value != null) {\r\n el.setAttribute(key, String(value));\r\n }\r\n }\r\n }\r\n\r\n // 设置子节点\r\n if (vnode.children) {\r\n if (typeof vnode.children === 'string') {\r\n el.textContent = vnode.children;\r\n } else if (Array.isArray(vnode.children)) {\r\n for (const child of vnode.children) {\r\n if (typeof child === 'string') {\r\n el.appendChild(document.createTextNode(child));\r\n } else if (child && typeof child === 'object' && 'type' in child) {\r\n const childEl = createElementFromVNode(child as VNode);\r\n if (childEl) {\r\n el.appendChild(childEl);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return el;\r\n}\r\n\r\n/**\r\n * 简单的 vnode 转 HTML 转换器,用于 Island hydration。\r\n * 处理基本元素、文本、Fragment 和注释。\r\n */\r\nfunction vnodeToSimpleHTML(vnode: VNode): string {\r\n const { type, children } = vnode;\r\n\r\n // 处理 Fragment:渲染每个子节点\r\n if (type === Fragment) {\r\n if (isArray(children)) {\r\n return children.map((child) => (child != null ? vnodeToSimpleHTML(child) : '')).join('');\r\n }\r\n return '';\r\n }\r\n\r\n // 处理 Text vnode\r\n if (type === Text) {\r\n const text = isString(children) ? children : String(children ?? '');\r\n return escapeHtml(text);\r\n }\r\n\r\n // 处理 Element vnode\r\n if (typeof type === 'string') {\r\n const props = vnode.props ?? {};\r\n let attrs = '';\r\n for (const key in props) {\r\n if (key === 'key' || key === 'ref') continue;\r\n const value = props[key];\r\n if (typeof value === 'boolean' && value) {\r\n attrs += ` ${key}`;\r\n } else if (value != null && value !== '') {\r\n attrs += ` ${key}=\"${escapeHtml(String(value))}\"`;\r\n }\r\n }\r\n\r\n const tag = type;\r\n\r\n // 渲染子节点\r\n let childContent = '';\r\n if (children != null) {\r\n if (isString(children)) {\r\n childContent = escapeHtml(children);\r\n } else if (isArray(children)) {\r\n childContent = children\r\n .map((child) => (child != null ? vnodeToSimpleHTML(child as VNode) : ''))\r\n .join('');\r\n } else if (typeof children === 'object' && 'type' in (children as object)) {\r\n // 单个 VNode 子节点\r\n // FIX: P2-batch2-2 添加运行时类型检查,避免不安全的类型断言\r\n if (children != null && typeof children === 'object' && 'type' in children) {\r\n childContent = vnodeToSimpleHTML(children as unknown as VNode);\r\n }\r\n }\r\n }\r\n\r\n return `<${tag}${attrs}>${childContent}</${tag}>`;\r\n }\r\n\r\n return '';\r\n}\r\n\r\n/**\r\n * 使用 TextEncoder 将字符串编码为 base64(安全替代 btoa(unescape(...)))。\r\n * FIX: P2-50 使用分块处理(每次 8192 字节)替代逐字符拼接,\r\n * 避免大字符串时 String.fromCharCode 的性能问题和调用栈开销。\r\n */\r\nfunction uint8ToBase64(bytes: Uint8Array): string {\r\n const CHUNK_SIZE = 8192;\r\n const chunks: string[] = [];\r\n for (let i = 0; i < bytes.length; i += CHUNK_SIZE) {\r\n const chunk = bytes.subarray(i, Math.min(i + CHUNK_SIZE, bytes.length));\r\n chunks.push(String.fromCharCode(...chunk));\r\n }\r\n return btoa(chunks.join(''));\r\n}\r\n\r\n/**\r\n * 使用 atob 将 base64 解码为 Uint8Array(安全替代 escape(atob(...)))。\r\n */\r\nfunction base64ToUint8(base64: string): Uint8Array {\r\n const binary = atob(base64);\r\n const bytes = new Uint8Array(binary.length);\r\n for (let i = 0; i < binary.length; i++) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n return bytes;\r\n}\r\n\r\n/**\r\n * 将 props 编码为 base64 字符串,用于嵌入 HTML 属性。\r\n */\r\nfunction encodeProps(props: Record<string, unknown>): string {\r\n const json = JSON.stringify(props);\r\n // 使用 TextEncoder 进行安全的 UTF-8 到 base64 转换\r\n const bytes = new TextEncoder().encode(json);\r\n return uint8ToBase64(bytes);\r\n}\r\n\r\n/**\r\n * 从 base64 字符串解码 props。\r\n */\r\nfunction decodeProps(encoded: string): Record<string, unknown> {\r\n if (!encoded) return {};\r\n\r\n try {\r\n // 使用 TextDecoder 进行安全的 base64 到 UTF-8 转换\r\n const bytes = base64ToUint8(encoded);\r\n const json = new TextDecoder().decode(bytes);\r\n return JSON.parse(json) as Record<string, unknown>;\r\n } catch {\r\n if (__DEV__) {\r\n warn(`hydrateIsland: failed to decode props from \"${encoded}\"`);\r\n }\r\n return {};\r\n }\r\n}\r\n","// src/vapor/vapor-app.ts\r\n// @lytjs/renderer - Vapor 模式应用 API\r\n// Vapor 是 Signal 模式的高级封装,提供 defineVaporComponent 和 createVaporApp\r\n\r\nimport { compile } from '@lytjs/compiler';\r\nimport { createSignalRenderer } from '../signal/signal-renderer';\r\nimport type { SignalRenderer } from '../signal/signal-renderer';\r\nimport {\r\n generateComponentId,\r\n registerComponent,\r\n unregisterComponent,\r\n isHMRAvailable,\r\n} from './vapor-hmr';\r\n\r\n// __DEV__ 已在 env.d.ts 中全局声明,无需重复声明\r\n\r\n// ============================================================\r\n// VaporContext 接口\r\n// ============================================================\r\n\r\n/** Vapor 组件的上下文对象 */\r\nexport interface VaporContext {\r\n attrs: Record<string, unknown>;\r\n slots: Record<string, () => Node>;\r\n emit: (event: string, ...args: unknown[]) => void;\r\n}\r\n\r\n// ============================================================\r\n// VaporComponentOptions 接口\r\n// ============================================================\r\n\r\n/** Prop 定义选项 */\r\nexport interface PropOptions {\r\n type?: 'string' | 'number' | 'boolean' | 'object' | 'array' | 'function';\r\n default?: unknown;\r\n required?: boolean;\r\n validator?: (value: unknown) => boolean;\r\n}\r\n\r\n/** Vapor 组件定义选项 */\r\nexport interface VaporComponentOptions {\r\n name?: string;\r\n props?: Record<string, PropOptions>;\r\n setup?: (props: Record<string, unknown>, context: VaporContext) => Record<string, unknown> | void;\r\n template: string;\r\n}\r\n\r\n// ============================================================\r\n// VaporComponentDefinition 接口\r\n// ============================================================\r\n\r\n/** Vapor 组件定义(编译后的结果) */\r\nexport interface VaporComponentDefinition {\r\n name?: string;\r\n props?: Record<string, PropOptions>;\r\n setup?: (props: Record<string, unknown>, context: VaporContext) => Record<string, unknown> | void;\r\n template: string;\r\n compiledCode?: string;\r\n}\r\n\r\n// ============================================================\r\n// VaporAppOptions 接口\r\n// ============================================================\r\n\r\n/** Vapor 应用配置选项 */\r\nexport interface VaporAppOptions {\r\n /** 根容器属性(传递给根组件的 props) */\r\n rootProps?: Record<string, unknown>;\r\n}\r\n\r\n// ============================================================\r\n// VaporApp 接口\r\n// ============================================================\r\n\r\n/** Vapor 应用实例 */\r\nexport interface VaporApp {\r\n mount(container: Element | string): void;\r\n unmount(): void;\r\n provide(key: string | symbol, value: unknown): void;\r\n component(name: string, component: VaporComponentDefinition): VaporApp;\r\n}\r\n\r\n// ============================================================\r\n// defineVaporComponent\r\n// ============================================================\r\n\r\n/**\r\n * 定义一个 Vapor 模式的组件\r\n *\r\n * 将模板编译结果缓存到闭包中,返回组件定义对象。\r\n *\r\n * @param options - 组件定义选项\r\n * @returns VaporComponentDefinition\r\n *\r\n * @example\r\n * ```ts\r\n * const MyComponent = defineVaporComponent({\r\n * name: 'MyComponent',\r\n * props: {\r\n * message: { type: String, default: 'hello' }\r\n * },\r\n * setup(props, { emit }) {\r\n * return { count: 0, onClick: () => emit('click') };\r\n * },\r\n * template: '<div @click=\"onClick\">{{ message }}</div>'\r\n * });\r\n * ```\r\n */\r\nexport function defineVaporComponent(options: VaporComponentOptions): VaporComponentDefinition {\r\n const { name, props, setup, template } = options;\r\n\r\n // 预编译模板,将编译结果缓存到闭包中\r\n let compiledCode: string | undefined;\r\n try {\r\n const compileResult = compile(template, { rendererMode: 'signal' });\r\n compiledCode = compileResult.code;\r\n } catch (e) {\r\n // FIX: P2-v11-01 生产环境编译错误不再静默吞没,\r\n // 在非 DEV 环境下将错误记录到 console.error,确保问题可追踪\r\n if (__DEV__) {\r\n console.warn(\r\n `[LytJS] defineVaporComponent: template compilation failed for \"${name || 'anonymous'}\". ` +\r\n `Error: ${e instanceof Error ? e.message : String(e)}`,\r\n );\r\n } else {\r\n console.error(\r\n `[LytJS] defineVaporComponent: template compilation failed for \"${name || 'anonymous'}\". ` +\r\n `Error: ${e instanceof Error ? e.message : String(e)}`,\r\n );\r\n }\r\n }\r\n\r\n return {\r\n name,\r\n props,\r\n setup,\r\n template,\r\n compiledCode,\r\n };\r\n}\r\n\r\n// ============================================================\r\n// createVaporApp\r\n// ============================================================\r\n\r\n/**\r\n * 创建一个 Vapor 模式的应用实例\r\n *\r\n * 内部使用 createSignalRenderer 进行渲染。\r\n *\r\n * @param rootComponent - 根组件定义\r\n * @param options - 应用配置选项\r\n * @returns VaporApp 实例\r\n *\r\n * @example\r\n * ```ts\r\n * const App = defineVaporComponent({\r\n * template: '<div>{{ message }}</div>',\r\n * setup() {\r\n * return { message: 'Hello Vapor' };\r\n * }\r\n * });\r\n *\r\n * const app = createVaporApp(App);\r\n * app.mount('#app');\r\n * ```\r\n */\r\nexport function createVaporApp(\r\n rootComponent: VaporComponentDefinition,\r\n options?: VaporAppOptions,\r\n): VaporApp {\r\n const provides = new Map<string | symbol, unknown>();\r\n const components = new Map<string, VaporComponentDefinition>();\r\n\r\n let signalRenderer: SignalRenderer | null = null;\r\n let isMounted = false;\r\n let isUnmounted = false;\r\n\r\n // Phase 1.2: HMR 组件 ID\r\n const componentId = generateComponentId();\r\n\r\n const vaporApp: VaporApp = {\r\n mount(container: Element | string) {\r\n if (isUnmounted) {\r\n throw new Error(\r\n `[LytJS] VaporApp has been unmounted and cannot be remounted. ` +\r\n `Create a new app instance instead.`,\r\n );\r\n }\r\n\r\n if (isMounted) {\r\n throw new Error(\r\n `[LytJS] VaporApp is already mounted. Call app.unmount() first before mounting again.`,\r\n );\r\n }\r\n\r\n // 解析容器\r\n const el = typeof container === 'string' ? document.querySelector(container) : container;\r\n\r\n if (!el) {\r\n throw new Error(`[LytJS] VaporApp: cannot find element matching \"${container}\".`);\r\n }\r\n\r\n // 构建上下文对象\r\n const rootProps = options?.rootProps ?? {};\r\n const ctx: Record<string, unknown> = { ...rootProps };\r\n\r\n // 创建 VaporContext\r\n const vaporContext: VaporContext = {\r\n attrs: { ...rootProps },\r\n slots: {},\r\n emit(event: string, ...args: unknown[]) {\r\n if (__DEV__) {\r\n // eslint-disable-next-line no-console\r\n console.log(`[LytJS] VaporComponent emitted event \"${event}\"`, args);\r\n }\r\n },\r\n };\r\n\r\n // 执行 setup 函数\r\n if (typeof rootComponent.setup === 'function') {\r\n const setupResult = rootComponent.setup(rootProps, vaporContext);\r\n if (setupResult && typeof setupResult === 'object') {\r\n Object.assign(ctx, setupResult);\r\n }\r\n }\r\n\r\n // FIX: P2-v11-02 createVaporApp 验证 template 存在性,\r\n // 避免缺少 template 时在运行时产生难以调试的错误\r\n if (!rootComponent.template) {\r\n throw new Error(\r\n `[LytJS] createVaporApp: rootComponent must have a 'template' property. ` +\r\n `Received: ${typeof rootComponent.template}`,\r\n );\r\n }\r\n\r\n // 创建 Signal 渲染器\r\n signalRenderer = createSignalRenderer(rootComponent.template, ctx);\r\n signalRenderer.render(el);\r\n\r\n // Phase 1.2: 注册组件实例用于 HMR\r\n if (__DEV__ || isHMRAvailable()) {\r\n registerComponent(componentId, rootComponent, el);\r\n }\r\n\r\n isMounted = true;\r\n },\r\n\r\n unmount() {\r\n if (signalRenderer) {\r\n signalRenderer.unmount();\r\n signalRenderer = null;\r\n }\r\n\r\n // Phase 1.2: 注销组件实例\r\n if (__DEV__ || isHMRAvailable()) {\r\n unregisterComponent(componentId);\r\n }\r\n\r\n isMounted = false;\r\n isUnmounted = true;\r\n\r\n // 清理注册的资源\r\n provides.clear();\r\n components.clear();\r\n },\r\n\r\n provide(key: string | symbol, value: unknown): void {\r\n if (__DEV__ && isMounted) {\r\n console.warn(\r\n '[LytJS] VaporApp.provide() cannot be called after the app has been mounted. ' +\r\n 'Register provides before calling app.mount().',\r\n );\r\n }\r\n provides.set(key, value);\r\n },\r\n\r\n component(name: string, component: VaporComponentDefinition): VaporApp {\r\n components.set(name, component);\r\n return vaporApp;\r\n },\r\n };\r\n\r\n return vaporApp;\r\n}\r\n","// packages/renderer/src/server/server-components.ts\r\n// Server Components 运行时支持\r\n// Phase 1.4: 服务端组件运行时\r\n\r\n// import type { VaporComponentDefinition } from '../vapor/vapor-app';\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/** Server Component 定义 */\r\nexport interface ServerComponentDefinition {\r\n /** 组件 ID */\r\n id: string;\r\n /** 组件名称 */\r\n name: string;\r\n /** 渲染函数 */\r\n render: () => Promise<string>;\r\n /** 数据获取函数 */\r\n fetchData?: () => Promise<Record<string, unknown>>;\r\n /** 序列化数据 */\r\n serializeData?: () => string;\r\n}\r\n\r\n/** Server Action 请求 */\r\nexport interface ServerActionRequest {\r\n /** 组件名称 */\r\n componentName: string;\r\n /** 函数名称 */\r\n functionName: string;\r\n /** 参数 */\r\n args: unknown[];\r\n}\r\n\r\n/** Server Action 响应 */\r\nexport interface ServerActionResponse {\r\n /** 是否成功 */\r\n success: boolean;\r\n /** 返回数据 */\r\n data?: unknown;\r\n /** 错误信息 */\r\n error?: string;\r\n}\r\n\r\n/** Server Component 注册表 */\r\ninterface ServerComponentRegistry {\r\n components: Map<string, ServerComponentDefinition>;\r\n functions: Map<string, Map<string, (...args: unknown[]) => Promise<unknown>>>;\r\n}\r\n\r\n// ============================================================\r\n// 全局注册表\r\n// ============================================================\r\n\r\nconst registry: ServerComponentRegistry = {\r\n components: new Map(),\r\n functions: new Map(),\r\n};\r\n\r\n// ============================================================\r\n// 组件注册\r\n// ============================================================\r\n\r\n/**\r\n * 注册 Server Component\r\n */\r\nexport function registerServerComponent(\r\n component: ServerComponentDefinition,\r\n): void {\r\n registry.components.set(component.id, component);\r\n}\r\n\r\n/**\r\n * 注册服务端函数\r\n */\r\nexport function registerServerFunction(\r\n componentId: string,\r\n functionName: string,\r\n fn: (...args: unknown[]) => Promise<unknown>,\r\n): void {\r\n if (!registry.functions.has(componentId)) {\r\n registry.functions.set(componentId, new Map());\r\n }\r\n registry.functions.get(componentId)!.set(functionName, fn);\r\n}\r\n\r\n/**\r\n * 获取 Server Component\r\n */\r\nexport function getServerComponent(id: string): ServerComponentDefinition | undefined {\r\n return registry.components.get(id);\r\n}\r\n\r\n/**\r\n * 获取服务端函数\r\n */\r\nexport function getServerFunction(\r\n componentId: string,\r\n functionName: string,\r\n): ((...args: unknown[]) => Promise<unknown>) | undefined {\r\n return registry.functions.get(componentId)?.get(functionName);\r\n}\r\n\r\n// ============================================================\r\n// Server Action 处理\r\n// ============================================================\r\n\r\n/**\r\n * 处理 Server Action 请求\r\n * 用于处理客户端对服务端函数的调用\r\n */\r\nexport async function handleServerAction(\r\n request: ServerActionRequest,\r\n): Promise<ServerActionResponse> {\r\n const { componentName, functionName, args } = request;\r\n\r\n try {\r\n // 查找函数\r\n const fn = getServerFunction(componentName, functionName);\r\n if (!fn) {\r\n return {\r\n success: false,\r\n error: `Server function not found: ${componentName}.${functionName}`,\r\n };\r\n }\r\n\r\n // 执行函数\r\n const result = await fn(...args);\r\n\r\n return {\r\n success: true,\r\n data: result,\r\n };\r\n } catch (error) {\r\n console.error(`[LytJS Server Action Error] ${componentName}.${functionName}:`, error);\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * 创建 Server Action 处理器\r\n * 用于 Express/Fastify 等服务端框架\r\n */\r\nexport function createServerActionHandler() {\r\n return async (req: any, res: any) => {\r\n const componentName = req.headers['x-server-component'];\r\n const functionName = req.headers['x-server-function'];\r\n\r\n if (!componentName || !functionName) {\r\n res.status(400).json({ error: 'Missing server component or function headers' });\r\n return;\r\n }\r\n\r\n const args = req.body?.args || [];\r\n\r\n const result = await handleServerAction({\r\n componentName,\r\n functionName,\r\n args,\r\n });\r\n\r\n if (result.success) {\r\n res.json(result.data);\r\n } else {\r\n res.status(500).json({ error: result.error });\r\n }\r\n };\r\n}\r\n\r\n// ============================================================\r\n// 数据序列化\r\n// ============================================================\r\n\r\n/**\r\n * 序列化 Server Component 数据\r\n */\r\nexport function serializeServerData(data: unknown): string {\r\n return JSON.stringify(data, (_key, value) => {\r\n // 处理特殊类型\r\n if (value instanceof Date) {\r\n return { __type: 'Date', value: value.toISOString() };\r\n }\r\n if (value instanceof Map) {\r\n return { __type: 'Map', value: Array.from(value.entries()) };\r\n }\r\n if (value instanceof Set) {\r\n return { __type: 'Set', value: Array.from(value.values()) };\r\n }\r\n if (typeof value === 'bigint') {\r\n return { __type: 'BigInt', value: value.toString() };\r\n }\r\n if (value === undefined) {\r\n return { __type: 'undefined' };\r\n }\r\n return value;\r\n });\r\n}\r\n\r\n/**\r\n * 反序列化 Server Component 数据\r\n */\r\nexport function deserializeServerData(json: string): unknown {\r\n return JSON.parse(json, (_key, value) => {\r\n if (value && typeof value === 'object' && '__type' in value) {\r\n switch (value.__type) {\r\n case 'Date':\r\n return new Date(value.value);\r\n case 'Map':\r\n return new Map(value.value);\r\n case 'Set':\r\n return new Set(value.value);\r\n case 'BigInt':\r\n return BigInt(value.value);\r\n case 'undefined':\r\n return undefined;\r\n }\r\n }\r\n return value;\r\n });\r\n}\r\n\r\n// ============================================================\r\n// Server Component 渲染\r\n// ============================================================\r\n\r\n/**\r\n * 渲染 Server Component\r\n */\r\nexport async function renderServerComponent(\r\n componentId: string,\r\n _context: Record<string, unknown> = {},\r\n): Promise<string> {\r\n const component = getServerComponent(componentId);\r\n if (!component) {\r\n throw new Error(`[LytJS] Server component not found: ${componentId}`);\r\n }\r\n\r\n // 获取数据\r\n if (component.fetchData) {\r\n await component.fetchData();\r\n }\r\n\r\n // 渲染\r\n const html = await component.render();\r\n\r\n // 注入数据脚本\r\n const dataScript = component.serializeData\r\n ? `<script>window.__LYTJS_SERVER_DATA__=${component.serializeData()};</script>`\r\n : '';\r\n\r\n return html + dataScript;\r\n}\r\n\r\n// ============================================================\r\n// defineServerComponent\r\n// ============================================================\r\n\r\n/**\r\n * 定义 Server Component\r\n *\r\n * @example\r\n * ```ts\r\n * export default defineServerComponent({\r\n * id: 'product-list',\r\n * name: 'ProductList',\r\n * async fetchData() {\r\n * const products = await db.products.findMany();\r\n * return { products };\r\n * },\r\n * async render() {\r\n * return '<div class=\"product-list\">...</div>';\r\n * }\r\n * });\r\n * ```\r\n */\r\nexport function defineServerComponent(\r\n options: Omit<ServerComponentDefinition, 'serializeData'> & {\r\n serializeData?: () => string;\r\n },\r\n): ServerComponentDefinition {\r\n const component: ServerComponentDefinition = {\r\n ...options,\r\n serializeData: options.serializeData ?? (() => serializeServerData({})),\r\n };\r\n\r\n // 自动注册\r\n registerServerComponent(component);\r\n\r\n return component;\r\n}\r\n\r\n// ============================================================\r\n// 导出(函数已在上面定义)\r\n// ============================================================\r\n","// packages/renderer/src/client/server-components-client.ts\r\n// Server Components 客户端运行时\r\n// Phase 1.4: 客户端调用服务端组件\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/** Server Action 配置 */\r\nexport interface ServerActionConfig {\r\n /** 服务端 action 端点 */\r\n endpoint?: string;\r\n /** 请求头 */\r\n headers?: Record<string, string>;\r\n /** 错误处理 */\r\n onError?: (error: Error) => void;\r\n}\r\n\r\n// ============================================================\r\n// 默认配置\r\n// ============================================================\r\n\r\nlet defaultConfig: ServerActionConfig = {\r\n endpoint: '/__lytjs_server_action',\r\n headers: {},\r\n onError: (error) => console.error('[LytJS Server Action Error]', error),\r\n};\r\n\r\n/**\r\n * 配置 Server Action\r\n */\r\nexport function configureServerAction(config: Partial<ServerActionConfig>): void {\r\n defaultConfig = { ...defaultConfig, ...config };\r\n}\r\n\r\n// ============================================================\r\n// Server Action 调用\r\n// ============================================================\r\n\r\n/**\r\n * 调用服务端函数\r\n *\r\n * @example\r\n * ```ts\r\n * // 在客户端调用服务端函数\r\n * const result = await callServer('ProductList', 'fetchProducts', { category: 'electronics' });\r\n * ```\r\n */\r\nexport async function callServer<T = unknown>(\r\n componentName: string,\r\n functionName: string,\r\n ...args: unknown[]\r\n): Promise<T> {\r\n const { endpoint, headers, onError } = defaultConfig;\r\n\r\n try {\r\n const response = await fetch(endpoint!, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Server-Component': componentName,\r\n 'X-Server-Function': functionName,\r\n ...headers,\r\n },\r\n body: JSON.stringify({ args }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `Server action failed: ${response.status} ${response.statusText}`\r\n );\r\n }\r\n\r\n const result = await response.json();\r\n return result as T;\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error(String(error));\r\n onError?.(err);\r\n throw err;\r\n }\r\n}\r\n\r\n/**\r\n * 创建服务端函数代理\r\n *\r\n * @example\r\n * ```ts\r\n * // 创建类型安全的服务端函数调用\r\n * const fetchProducts = createServerFunction<Product[]>('ProductList', 'fetchProducts');\r\n * const products = await fetchProducts({ category: 'electronics' });\r\n * ```\r\n */\r\nexport function createServerFunction<T>(\r\n componentName: string,\r\n functionName: string,\r\n): (...args: unknown[]) => Promise<T> {\r\n return (...args: unknown[]) => callServer<T>(componentName, functionName, ...args);\r\n}\r\n\r\n// ============================================================\r\n// Server Component 数据访问\r\n// ============================================================\r\n\r\n/**\r\n * 获取服务端预取的数据\r\n */\r\nexport function getServerData<T = unknown>(key?: string): T | undefined {\r\n const serverData = (window as any).__LYTJS_SERVER_DATA__;\r\n if (!serverData) return undefined;\r\n\r\n if (key) {\r\n return serverData[key] as T | undefined;\r\n }\r\n\r\n return serverData as T;\r\n}\r\n\r\n/**\r\n * 检查是否有服务端数据\r\n */\r\nexport function hasServerData(): boolean {\r\n return !!(window as any).__LYTJS_SERVER_DATA__;\r\n}\r\n\r\n// ============================================================\r\n// Server Component Hydration\r\n// ============================================================\r\n\r\n/**\r\n * Hydration 状态\r\n */\r\nconst hydrationState = new Map<string, {\r\n hydrated: boolean;\r\n pending: boolean;\r\n error: Error | null;\r\n}>();\r\n\r\n/**\r\n * 检查组件是否已 hydration\r\n */\r\nexport function isHydrated(componentId: string): boolean {\r\n return hydrationState.get(componentId)?.hydrated ?? false;\r\n}\r\n\r\n/**\r\n * 标记组件为已 hydration\r\n */\r\nexport function markHydrated(componentId: string): void {\r\n hydrationState.set(componentId, {\r\n hydrated: true,\r\n pending: false,\r\n error: null,\r\n });\r\n}\r\n\r\n/**\r\n * 获取 hydration 状态\r\n */\r\nexport function getHydrationState(componentId: string): {\r\n hydrated: boolean;\r\n pending: boolean;\r\n error: Error | null;\r\n} {\r\n return hydrationState.get(componentId) ?? {\r\n hydrated: false,\r\n pending: false,\r\n error: null,\r\n };\r\n}\r\n\r\n// ============================================================\r\n// 自动 Hydration\r\n// ============================================================\r\n\r\n/**\r\n * 自动 hydrate 所有 Server Components\r\n */\r\nexport async function autoHydrate(): Promise<void> {\r\n // 查找所有需要 hydration 的元素\r\n const elements = document.querySelectorAll('[data-server-component]');\r\n\r\n for (const el of elements) {\r\n const componentId = el.getAttribute('data-server-component');\r\n if (!componentId) continue;\r\n\r\n // 检查是否已 hydration\r\n if (isHydrated(componentId)) continue;\r\n\r\n // 标记为 pending\r\n hydrationState.set(componentId, {\r\n hydrated: false,\r\n pending: true,\r\n error: null,\r\n });\r\n\r\n try {\r\n // 动态导入组件\r\n const module = await import(/* @vite-ignore */ `/components/${componentId}.client.js`);\r\n\r\n if (module.default && typeof module.default.hydrate === 'function') {\r\n await module.default.hydrate(el);\r\n }\r\n\r\n markHydrated(componentId);\r\n } catch (error) {\r\n hydrationState.set(componentId, {\r\n hydrated: false,\r\n pending: false,\r\n error: error instanceof Error ? error : new Error(String(error)),\r\n });\r\n\r\n console.error(`[LytJS] Failed to hydrate ${componentId}:`, error);\r\n }\r\n }\r\n}\r\n\r\n// ============================================================\r\n// 初始化\r\n// ============================================================\r\n\r\n// 自动执行 hydration\r\nif (typeof document !== 'undefined' && document.readyState === 'complete') {\r\n autoHydrate();\r\n} else if (typeof document !== 'undefined') {\r\n document.addEventListener('DOMContentLoaded', autoHydrate);\r\n}\r\n\r\n// ============================================================\r\n// 导出(函数已在上面定义)\r\n// ============================================================\r\n","// packages/renderer/src/data/data-fetching.ts\r\n// 数据获取功能\r\n// Phase 1.7: 数据获取集成服务端数据预取 + 序列化\r\n\r\nimport { ref, watch, type Ref } from '@lytjs/reactivity';\r\nimport { isArray } from '@lytjs/common-is';\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/** 数据获取状态 */\r\nexport interface DataFetchState<T extends unknown = unknown> {\r\n /** 数据 */\r\n data: T | undefined;\r\n /** 是否正在加载 */\r\n loading: boolean;\r\n /** 错误信息 */\r\n error: Error | null;\r\n /** 是否来自缓存 */\r\n fromCache: boolean;\r\n /** 获取时间戳 */\r\n timestamp: number | null;\r\n}\r\n\r\n/** 数据获取选项 */\r\nexport interface DataFetchOptions<T extends unknown = unknown> {\r\n /** 是否立即执行 */\r\n immediate?: boolean;\r\n /** 初始数据 */\r\n initialData?: T;\r\n /** 缓存键 */\r\n cacheKey?: string | (() => string);\r\n /** 缓存时间(毫秒) */\r\n cacheTime?: number;\r\n /** 是否服务端预取 */\r\n serverPrefetch?: boolean;\r\n /** 依赖项变化时重新获取 */\r\n watch?: Ref<unknown>[];\r\n /** 转换函数 */\r\n transform?: (data: unknown) => T;\r\n /** 错误处理 */\r\n onError?: (error: Error) => void;\r\n /** 成功处理 */\r\n onSuccess?: (data: T) => void;\r\n /** 重试次数 */\r\n retry?: number;\r\n /** 重试延迟(毫秒) */\r\n retryDelay?: number;\r\n}\r\n\r\n/** 预取数据条目 */\r\nexport interface PrefetchDataEntry {\r\n /** 缓存键 */\r\n key: string;\r\n /** 数据 */\r\n data: unknown;\r\n /** 时间戳 */\r\n timestamp: number;\r\n /** 过期时间 */\r\n expiresAt: number;\r\n}\r\n\r\n/** 预取管理器 */\r\nexport interface PrefetchManager {\r\n /** 预取数据 */\r\n prefetch<T>(key: string, fetcher: () => Promise<T>): Promise<T>;\r\n /** 获取预取数据 */\r\n getPrefetchedData<T>(key: string): T | undefined;\r\n /** 序列化所有预取数据 */\r\n serialize(): string;\r\n /** 反序列化预取数据 */\r\n deserialize(data: string): void;\r\n /** 清除预取数据 */\r\n clear(): void;\r\n}\r\n\r\n// ============================================================\r\n// 全局预取数据存储\r\n// ============================================================\r\n\r\nconst prefetchStore = new Map<string, PrefetchDataEntry>();\r\nconst pendingPrefetches = new Map<string, Promise<unknown>>();\r\n\r\n// ============================================================\r\n// 数据序列化\r\n// ============================================================\r\n\r\n/**\r\n * 序列化数据(支持特殊类型)\r\n */\r\nexport function serializeData(data: unknown): string {\r\n return JSON.stringify(data, (_key, value) => {\r\n // 处理特殊类型\r\n if (value instanceof Date) {\r\n return { __type: 'Date', __value: value.toISOString() };\r\n }\r\n if (value instanceof Map) {\r\n return { __type: 'Map', __value: Array.from(value.entries()) };\r\n }\r\n if (value instanceof Set) {\r\n return { __type: 'Set', __value: Array.from(value.values()) };\r\n }\r\n if (typeof value === 'bigint') {\r\n return { __type: 'BigInt', __value: value.toString() };\r\n }\r\n if (value === undefined) {\r\n return { __type: 'undefined' };\r\n }\r\n if (value instanceof Error) {\r\n return {\r\n __type: 'Error',\r\n __value: {\r\n name: value.name,\r\n message: value.message,\r\n stack: value.stack,\r\n },\r\n };\r\n }\r\n if (value instanceof RegExp) {\r\n return { __type: 'RegExp', __value: value.toString() };\r\n }\r\n return value as unknown;\r\n });\r\n}\r\n\r\n/**\r\n * 反序列化数据\r\n */\r\nexport function deserializeData(json: string): unknown {\r\n return JSON.parse(json, (_key, value) => {\r\n if (value && typeof value === 'object' && '__type' in value) {\r\n switch (value.__type) {\r\n case 'Date':\r\n return new Date(value.__value);\r\n case 'Map':\r\n return new Map(value.__value);\r\n case 'Set':\r\n return new Set(value.__value);\r\n case 'BigInt':\r\n return BigInt(value.__value);\r\n case 'undefined':\r\n return undefined;\r\n case 'Error': {\r\n const err = new Error(value.__value.message);\r\n err.name = value.__value.name;\r\n err.stack = value.__value.stack;\r\n return err;\r\n }\r\n case 'RegExp': {\r\n const match = value.__value.match(/^\\/(.*)\\/([gimsuy]*)$/);\r\n if (match) {\r\n return new RegExp(match[1], match[2]);\r\n }\r\n return new RegExp(value.__value);\r\n }\r\n }\r\n }\r\n return value;\r\n });\r\n}\r\n\r\n// ============================================================\r\n// 预取管理器\r\n// ============================================================\r\n\r\n/**\r\n * 创建预取管理器\r\n */\r\nexport function createPrefetchManager(): PrefetchManager {\r\n return {\r\n async prefetch<T>(key: string, fetcher: () => Promise<T>): Promise<T> {\r\n // 检查是否已有缓存\r\n const cached = prefetchStore.get(key);\r\n if (cached && cached.expiresAt > Date.now()) {\r\n return cached.data as T;\r\n }\r\n\r\n // 检查是否正在获取\r\n const pending = pendingPrefetches.get(key);\r\n if (pending) {\r\n return pending as Promise<T>;\r\n }\r\n\r\n // 开始获取\r\n const fetchPromise = fetcher();\r\n pendingPrefetches.set(key, fetchPromise);\r\n\r\n try {\r\n const data = await fetchPromise;\r\n const now = Date.now();\r\n\r\n prefetchStore.set(key, {\r\n key,\r\n data,\r\n timestamp: now,\r\n expiresAt: now + 5 * 60 * 1000, // 默认 5 分钟过期\r\n });\r\n\r\n return data;\r\n } finally {\r\n pendingPrefetches.delete(key);\r\n }\r\n },\r\n\r\n getPrefetchedData<T>(key: string): T | undefined {\r\n const entry = prefetchStore.get(key);\r\n if (entry && entry.expiresAt > Date.now()) {\r\n return entry.data as T;\r\n }\r\n return undefined;\r\n },\r\n\r\n serialize(): string {\r\n const entries = Array.from(prefetchStore.values());\r\n return serializeData(entries);\r\n },\r\n\r\n deserialize(data: string): void {\r\n const entries = deserializeData(data) as PrefetchDataEntry[];\r\n if (isArray(entries)) {\r\n for (const entry of entries) {\r\n prefetchStore.set(entry.key, entry);\r\n }\r\n }\r\n },\r\n\r\n clear(): void {\r\n prefetchStore.clear();\r\n pendingPrefetches.clear();\r\n },\r\n };\r\n}\r\n\r\n// ============================================================\r\n// useFetch 组合式函数\r\n// ============================================================\r\n\r\n/**\r\n * 组合式数据获取函数\r\n *\r\n * @example\r\n * ```ts\r\n * const { data, loading, error, refetch } = useFetch('/api/users', {\r\n * immediate: true,\r\n * cacheKey: 'users',\r\n * });\r\n * ```\r\n */\r\nexport function useFetch<T extends string | number | boolean | object | null = object>(\r\n url: string | (() => string),\r\n options: DataFetchOptions<T> = {},\r\n): {\r\n data: Ref<T | undefined>;\r\n loading: Ref<boolean>;\r\n error: Ref<Error | null>;\r\n refetch: () => Promise<void>;\r\n} {\r\n const {\r\n immediate = true,\r\n initialData,\r\n cacheKey,\r\n cacheTime = 5 * 60 * 1000,\r\n watch: watchDeps,\r\n transform,\r\n onError,\r\n onSuccess,\r\n retry = 0,\r\n retryDelay = 1000,\r\n } = options;\r\n\r\n const data = ref(initialData) as Ref<unknown> as Ref<T | undefined>;\r\n const loading = ref<boolean>(false);\r\n const error = ref<Error | null>(null);\r\n const fromCache = ref<boolean>(false);\r\n const timestamp = ref<number | null>(null);\r\n\r\n let retryCount = 0;\r\n\r\n const fetchData = async () => {\r\n const resolvedUrl = typeof url === 'function' ? url() : url;\r\n const resolvedCacheKey = typeof cacheKey === 'function' ? cacheKey() : cacheKey;\r\n\r\n // 检查缓存\r\n if (resolvedCacheKey) {\r\n const cached = prefetchStore.get(resolvedCacheKey);\r\n if (cached && cached.expiresAt > Date.now()) {\r\n data.value = cached.data as T;\r\n fromCache.value = true as boolean;\r\n timestamp.value = cached.timestamp;\r\n return;\r\n }\r\n\r\n // 检查服务端预取数据\r\n if (typeof window !== 'undefined') {\r\n const serverData = (window as any).__LYTJS_PREFETCH_DATA__;\r\n if (serverData && serverData[resolvedCacheKey]) {\r\n data.value = serverData[resolvedCacheKey] as T;\r\n fromCache.value = true as boolean;\r\n delete serverData[resolvedCacheKey];\r\n return;\r\n }\r\n }\r\n }\r\n\r\n loading.value = true as boolean;\r\n error.value = null;\r\n\r\n try {\r\n const response = await fetch(resolvedUrl);\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n let result = await response.json();\r\n\r\n // 应用转换\r\n if (transform) {\r\n result = transform(result as unknown) as T;\r\n }\r\n\r\n data.value = result as T;\r\n timestamp.value = Date.now();\r\n retryCount = 0;\r\n\r\n // 缓存数据\r\n if (resolvedCacheKey) {\r\n prefetchStore.set(resolvedCacheKey, {\r\n key: resolvedCacheKey,\r\n data: result,\r\n timestamp: timestamp.value,\r\n expiresAt: timestamp.value + cacheTime,\r\n });\r\n }\r\n\r\n onSuccess?.(result as T);\r\n } catch (err) {\r\n const fetchError = err instanceof Error ? err : new Error(String(err));\r\n error.value = fetchError;\r\n\r\n // 重试逻辑\r\n if (retryCount < retry) {\r\n retryCount++;\r\n setTimeout(fetchData, retryDelay);\r\n return;\r\n }\r\n\r\n onError?.(fetchError);\r\n } finally {\r\n loading.value = false;\r\n }\r\n };\r\n\r\n // 监听依赖变化\r\n if (watchDeps && watchDeps.length > 0) {\r\n watch(watchDeps, () => {\r\n fetchData();\r\n });\r\n }\r\n\r\n // 立即执行\r\n if (immediate) {\r\n fetchData();\r\n }\r\n\r\n return {\r\n data,\r\n loading,\r\n error,\r\n refetch: fetchData,\r\n };\r\n}\r\n\r\n// ============================================================\r\n// useAsyncData 组合式函数\r\n// ============================================================\r\n\r\n/**\r\n * 异步数据获取(类似 Nuxt useAsyncData)\r\n *\r\n * @example\r\n * ```ts\r\n * const { data, pending, error } = useAsyncData('users', () =>\r\n * $fetch('/api/users')\r\n * );\r\n * ```\r\n */\r\nexport function useAsyncData<T extends string | number | boolean | object | null = object>(\r\n key: string,\r\n fetcher: () => Promise<T>,\r\n options: DataFetchOptions<T> = {},\r\n): {\r\n data: Ref<T | undefined>;\r\n pending: Ref<boolean>;\r\n error: Ref<Error | null>;\r\n refresh: () => Promise<void>;\r\n} {\r\n const {\r\n immediate = true,\r\n initialData,\r\n transform,\r\n onError,\r\n onSuccess,\r\n } = options;\r\n\r\n const data = ref<T | undefined>(initialData);\r\n const pending = ref<boolean>(false);\r\n const error = ref<Error | null>(null);\r\n\r\n const execute = async () => {\r\n // 检查缓存\r\n const cached = prefetchStore.get(key);\r\n if (cached && cached.expiresAt > Date.now()) {\r\n data.value = cached.data as T;\r\n return;\r\n }\r\n\r\n // 检查服务端预取数据\r\n if (typeof window !== 'undefined') {\r\n const serverData = (window as any).__LYTJS_PREFETCH_DATA__;\r\n if (serverData && serverData[key]) {\r\n data.value = serverData[key] as T;\r\n delete serverData[key];\r\n return;\r\n }\r\n }\r\n\r\n pending.value = true as boolean;\r\n error.value = null;\r\n\r\n try {\r\n let result: T = await fetcher() as T;\r\n\r\n if (transform) {\r\n result = transform(result as unknown) as T;\r\n }\r\n\r\n data.value = result as T;\r\n\r\n // 缓存数据\r\n const now = Date.now();\r\n prefetchStore.set(key, {\r\n key,\r\n data: result,\r\n timestamp: now,\r\n expiresAt: now + (options.cacheTime || 5 * 60 * 1000),\r\n });\r\n\r\n onSuccess?.(result as T);\r\n } catch (err) {\r\n const fetchError = err instanceof Error ? err : new Error(String(err));\r\n error.value = fetchError;\r\n onError?.(fetchError);\r\n } finally {\r\n pending.value = false as boolean;\r\n }\r\n };\r\n\r\n if (immediate) {\r\n execute();\r\n }\r\n\r\n return {\r\n data,\r\n pending,\r\n error,\r\n refresh: execute,\r\n };\r\n}\r\n\r\n// ============================================================\r\n// 服务端数据注入\r\n// ============================================================\r\n\r\n/**\r\n * 注入服务端预取数据到 HTML\r\n */\r\nexport function injectPrefetchData(): string {\r\n const data: Record<string, unknown> = {};\r\n\r\n for (const [key, entry] of prefetchStore) {\r\n data[key] = entry.data;\r\n }\r\n\r\n if (Object.keys(data).length === 0) {\r\n return '';\r\n }\r\n\r\n return `<script>window.__LYTJS_PREFETCH_DATA__=${serializeData(data)};</script>`;\r\n}\r\n\r\n/**\r\n * 从客户端读取预取数据\r\n */\r\nexport function getPrefetchData<T = unknown>(key: string): T | undefined {\r\n // 先检查内存缓存\r\n const cached = prefetchStore.get(key);\r\n if (cached && cached.expiresAt > Date.now()) {\r\n return cached.data as T;\r\n }\r\n\r\n // 检查服务端注入的数据\r\n if (typeof window !== 'undefined') {\r\n const serverData = (window as any).__LYTJS_PREFETCH_DATA__;\r\n if (serverData && serverData[key]) {\r\n const data = serverData[key] as T;\r\n delete serverData[key];\r\n return data;\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n// ============================================================\r\n// 导出(函数已在上面定义)\r\n// ============================================================\r\n","/**\r\n * @lytjs/renderer\r\n * LytJS 框架的渲染后端\r\n * 提供 DOM、SSR 和 Vapor 渲染\r\n * FIX: P2-10 RENDERER-NEW-03 - 渲染器插件系统\r\n * FIX: P2-26 懒加载优化 - 大型模块使用动态导入\r\n */\r\n\r\n// 从 vdom 重新导出\r\n/** 创建渲染器 */\r\nexport { createRenderer } from '@lytjs/vdom';\r\nexport type { VNode, RendererOptions } from '@lytjs/vdom';\r\n\r\n// ==================== 渲染器插件系统 ====================\r\n\r\nimport type { VNode as VNodeType } from '@lytjs/vdom';\r\nimport { warn, error } from '@lytjs/common-error';\r\n\r\n/**\r\n * 渲染器插件接口\r\n * 插件可以挂载到渲染生命周期的各个阶段\r\n */\r\nexport interface RendererPlugin {\r\n /** 插件名称 */\r\n name: string;\r\n\r\n /** 插件安装时调用 */\r\n install: (context: PluginContext) => void;\r\n\r\n /** 可选:在 mount vnode 之前调用 */\r\n beforeMount?: (vnode: VNodeType) => void;\r\n\r\n /** 可选:在 mount vnode 之后调用 */\r\n afterMount?: (vnode: VNodeType, container: unknown) => void;\r\n\r\n /** 可选:在 patch vnode 之前调用 */\r\n beforePatch?: (oldVNode: VNodeType, newVNode: VNodeType) => void;\r\n\r\n /** 可选:在 patch vnode 之后调用 */\r\n afterPatch?: (vnode: VNodeType) => void;\r\n\r\n /** 可选:在 unmount vnode 之前调用 */\r\n beforeUnmount?: (vnode: VNodeType) => void;\r\n\r\n /** 可选:在 unmount vnode 之后调用 */\r\n afterUnmount?: (vnode: VNodeType) => void;\r\n}\r\n\r\n/**\r\n * 插件安装时传递的上下文\r\n */\r\nexport interface PluginContext {\r\n /** 为特定的生命周期事件注册钩子 */\r\n on: (event: LifecycleEvent, handler: HookHandler) => void;\r\n\r\n /** 移除已注册的钩子 */\r\n off: (event: LifecycleEvent, handler: HookHandler) => void;\r\n}\r\n\r\n/** 插件可以挂载的生命周期事件 */\r\nexport type LifecycleEvent =\r\n | 'beforeMount'\r\n | 'afterMount'\r\n | 'beforePatch'\r\n | 'afterPatch'\r\n | 'beforeUnmount'\r\n | 'afterUnmount';\r\n\r\n/** 钩子处理函数类型 */\r\nexport type HookHandler = (...args: unknown[]) => void;\r\n\r\n/** 插件注册表 */\r\nconst installedPlugins: RendererPlugin[] = [];\r\n\r\n/** 钩子注册表 */\r\nconst hooks: Record<LifecycleEvent, Set<HookHandler>> = {\r\n beforeMount: new Set(),\r\n afterMount: new Set(),\r\n beforePatch: new Set(),\r\n afterPatch: new Set(),\r\n beforeUnmount: new Set(),\r\n afterUnmount: new Set(),\r\n};\r\n\r\n/**\r\n * 安装渲染器插件。\r\n * 插件可以通过挂载生命周期事件来扩展渲染器的功能。\r\n *\r\n * @example\r\n * ```ts\r\n * // 创建插件\r\n * const myPlugin: RendererPlugin = {\r\n * name: 'MyPlugin',\r\n * install(context) {\r\n * context.on('beforeMount', (vnode) => {\r\n * console.log('Before mount:', vnode);\r\n * });\r\n * },\r\n * };\r\n *\r\n * // 使用插件\r\n * use(myPlugin);\r\n * ```\r\n */\r\nexport function use(plugin: RendererPlugin): void {\r\n if (installedPlugins.includes(plugin)) {\r\n if (__DEV__) {\r\n warn(`Plugin \"${plugin.name}\" has already been installed.`);\r\n }\r\n return;\r\n }\r\n\r\n // 创建插件上下文\r\n const context: PluginContext = {\r\n on: (event, handler) => {\r\n hooks[event].add(handler);\r\n },\r\n off: (event, handler) => {\r\n hooks[event].delete(handler);\r\n },\r\n };\r\n\r\n // 安装插件\r\n plugin.install(context);\r\n installedPlugins.push(plugin);\r\n\r\n // 注册插件的生命周期钩子(如果提供)\r\n // FIX: DTS build error - 类型断言\r\n if (plugin.beforeMount) hooks.beforeMount.add(plugin.beforeMount as HookHandler);\r\n if (plugin.afterMount) hooks.afterMount.add(plugin.afterMount as HookHandler);\r\n if (plugin.beforePatch) hooks.beforePatch.add(plugin.beforePatch as HookHandler);\r\n if (plugin.afterPatch) hooks.afterPatch.add(plugin.afterPatch as HookHandler);\r\n if (plugin.beforeUnmount) hooks.beforeUnmount.add(plugin.beforeUnmount as HookHandler);\r\n if (plugin.afterUnmount) hooks.afterUnmount.add(plugin.afterUnmount as HookHandler);\r\n}\r\n\r\n/**\r\n * 获取所有已安装的插件\r\n */\r\nexport function getInstalledPlugins(): readonly RendererPlugin[] {\r\n return [...installedPlugins];\r\n}\r\n\r\n/**\r\n * 检查插件是否已安装\r\n */\r\nexport function isPluginInstalled(pluginName: string): boolean {\r\n return installedPlugins.some((p) => p.name === pluginName);\r\n}\r\n\r\n/**\r\n * 按名称移除插件\r\n */\r\nexport function removePlugin(pluginName: string): boolean {\r\n const index = installedPlugins.findIndex((p) => p.name === pluginName);\r\n if (index === -1) return false;\r\n\r\n const plugin = installedPlugins[index]!;\r\n\r\n // 移除钩子\r\n // FIX: DTS build error - 类型断言\r\n if (plugin.beforeMount) hooks.beforeMount.delete(plugin.beforeMount as HookHandler);\r\n if (plugin.afterMount) hooks.afterMount.delete(plugin.afterMount as HookHandler);\r\n if (plugin.beforePatch) hooks.beforePatch.delete(plugin.beforePatch as HookHandler);\r\n if (plugin.afterPatch) hooks.afterPatch.delete(plugin.afterPatch as HookHandler);\r\n if (plugin.beforeUnmount) hooks.beforeUnmount.delete(plugin.beforeUnmount as HookHandler);\r\n if (plugin.afterUnmount) hooks.afterUnmount.delete(plugin.afterUnmount as HookHandler);\r\n\r\n installedPlugins.splice(index, 1);\r\n return true;\r\n}\r\n\r\n/**\r\n * 内部:执行生命周期事件的钩子\r\n * 由渲染器在适当的生命周期节点调用\r\n * FIX: P2-29 数组遍历优化 - 使用 for 循环替代 forEach\r\n */\r\nexport function executeHooks(event: LifecycleEvent, ...args: unknown[]): void {\r\n const handlers = hooks[event];\r\n // FIX: P2-29 使用 for 循环替代 forEach,避免函数调用开销\r\n // FIX: DTS build error - 类型断言\r\n for (const handler of handlers) {\r\n try {\r\n (handler as (...args: unknown[]) => void)(...args);\r\n } catch (e) {\r\n if (__DEV__) {\r\n error(`Error in ${event} hook: ${String(e)}`);\r\n }\r\n }\r\n }\r\n}\r\n\r\n// 导出类型\r\n// FIX: DTS build error - 删除重复的类型导出\r\nexport type { RendererPlugin as Plugin };\r\n\r\n// 从 reactivity 重新导出首次渲染优化\r\n/** 首次渲染优化 */\r\nexport {\r\n withFirstRenderOptimization,\r\n shouldSkipTracking,\r\n getSkippedTrackingCount,\r\n resetSkippedTrackingCount,\r\n} from '@lytjs/reactivity';\r\n\r\n// DOM 渲染器 - 从 @lytjs/adapter-web 重新导出\r\n/** 创建 DOM 渲染器 */\r\nexport { createDOMRenderer } from '@lytjs/adapter-web';\r\nexport type { DOMRenderer } from '@lytjs/adapter-web';\r\n\r\n// DOM 属性补丁操作 - 从 @lytjs/adapter-web 重新导出\r\n/** DOM 属性补丁操作 */\r\nexport {\r\n patchProp,\r\n patchClass,\r\n patchStyle,\r\n patchEvent,\r\n patchAttr,\r\n normalizeEventName,\r\n getEventKey,\r\n parseEventModifier,\r\n createInvoker,\r\n removeAllEventListeners,\r\n} from '@lytjs/adapter-web';\r\nexport type { ParsedEvent, EventInvoker } from '@lytjs/adapter-web';\r\n/** 事件名检测 */\r\nexport { isOn } from '@lytjs/common-events';\r\n\r\n// Hydration - 从 @lytjs/adapter-web 重新导出\r\n/** 创建水合(hydration)函数 */\r\nexport { createHydrationFunctions } from '@lytjs/adapter-web';\r\nexport type { HydrationRenderer } from '@lytjs/adapter-web';\r\n\r\n// 增强 Hydration API (Phase 1.15-1.17)\r\n/** Hydration 完善:全应用、选择性、错误恢复 */\r\nexport async function getEnhancedHydrationFunctions() {\r\n const hydration = await import('./hydration/enhanced-hydration');\r\n return {\r\n hydrateApp: hydration.hydrateApp,\r\n hydrateVisible: hydration.hydrateVisible,\r\n queueHydration: hydration.queueHydration,\r\n safeHydrate: hydration.safeHydrate,\r\n createHydrationErrorHandler: hydration.createHydrationErrorHandler,\r\n };\r\n}\r\nexport type {\r\n HydrationMode,\r\n HydrationOptions,\r\n HydrationError,\r\n HydrationMismatch,\r\n HydrationStats,\r\n RecoveryStrategy,\r\n} from './hydration/enhanced-hydration';\r\nexport { HydrationErrorHandler } from './hydration/enhanced-hydration';\r\n\r\n// 从 @lytjs/host-contract 重新导出\r\n/** 渲染器宿主抽象类型 */\r\nexport type {\r\n RendererHost,\r\n HostRect,\r\n HostStyleDeclaration,\r\n TransitionDurationInfo,\r\n HostEvent,\r\n HostEventHandler,\r\n HostEventOptions,\r\n} from '@lytjs/host-contract';\r\n\r\n// 从 @lytjs/adapter-web 重新导出\r\n/** Web 渲染器宿主实现 */\r\nexport { WebRendererHost, createWebHost, wrapDOMEvent } from '@lytjs/adapter-web';\r\n\r\n// FIX: P2-26 懒加载优化 - SSR 相关函数使用动态导入\r\n// SSR 渲染器\r\n/** 将组件渲染为字符串(SSR) */\r\nexport async function renderToString(input: { vnode: VNodeType }): Promise<string> {\r\n const { renderToString: _renderToString } = await import('./ssr/ssr-renderer');\r\n return _renderToString(input);\r\n}\r\nexport type { SSRInput } from './ssr/ssr-renderer';\r\n\r\n// SSR 流式渲染\r\n/** 将 VNode 树流式渲染为 ReadableStream(SSR Streaming) */\r\nexport async function renderToStream(\r\n input: { vnode: unknown },\r\n options?: { commentMarkers?: boolean },\r\n): Promise<ReadableStream> {\r\n const { renderToStream: _renderToStream } = await import('./ssr/ssr-stream');\r\n return _renderToStream(input as { vnode: VNodeType }, options);\r\n}\r\nexport type { SSRStreamOptions } from './ssr/ssr-stream';\r\n\r\n// 优化的流式渲染 (Phase 1.5)\r\n/** 优化的流式渲染 - TTFB 降低 50%+ */\r\nexport async function createOptimizedStream(\r\n vnode: unknown,\r\n options?: unknown,\r\n): Promise<ReadableStream> {\r\n const { createOptimizedStream: _createOptimizedStream } = await import('./ssr/ssr-stream-optimized');\r\n return _createOptimizedStream(vnode as VNodeType, options as any);\r\n}\r\nexport async function renderDocumentToStream(\r\n vnode: unknown,\r\n options?: unknown,\r\n): Promise<ReadableStream> {\r\n const { renderDocumentToStream: _renderDocumentToStream } = await import('./ssr/ssr-stream-optimized');\r\n return _renderDocumentToStream(vnode as VNodeType, options as any);\r\n}\r\nexport type {\r\n OptimizedStreamOptions,\r\n PreloadHint,\r\n StreamStats,\r\n} from './ssr/ssr-stream-optimized';\r\nexport { OptimizedSSRStream } from './ssr/ssr-stream-optimized';\r\n\r\n// SSR Island 架构\r\n/** Island Architecture 相关函数 */\r\nimport type { ComponentOptions } from './ssr/ssr-island';\r\nexport async function hydrateIsland(\r\n el: Element,\r\n component: ComponentOptions,\r\n props?: Record<string, unknown>,\r\n): Promise<void> {\r\n const { hydrateIsland: _hydrateIsland } = await import('./ssr/ssr-island');\r\n return _hydrateIsland(el, component, props);\r\n}\r\nexport async function registerIslandComponent(\r\n name: string,\r\n component: ComponentOptions,\r\n): Promise<void> {\r\n const { registerIslandComponent: _registerIslandComponent } = await import('./ssr/ssr-island');\r\n return _registerIslandComponent(name, component);\r\n}\r\nexport async function createIslandSSRContent(\r\n name: string,\r\n props: Record<string, unknown> = {},\r\n): Promise<string> {\r\n const { createIslandSSRContent: _createIslandSSRContent } = await import('./ssr/ssr-island');\r\n return _createIslandSSRContent(name, props);\r\n}\r\nexport type { ComponentOptions as IslandComponentOptions } from './ssr/ssr-island';\r\n\r\n// Signal 渲染器\r\n/** 创建 Signal 模式渲染器(细粒度 DOM 更新) */\r\n// FIX: DTS build error - 修复参数数量\r\nexport async function createSignalRenderer(\r\n template: string = '',\r\n context: Record<string, unknown> = {},\r\n) {\r\n const { createSignalRenderer: _createSignalRenderer } = await import('./signal/signal-renderer');\r\n return _createSignalRenderer(template, context);\r\n}\r\nexport type { SignalRenderer } from './signal/signal-renderer';\r\n\r\n// Vapor 渲染器(Signal 渲染器的别名)\r\n/** 创建 Vapor 模式渲染器(Signal 渲染器的别名) */\r\n// FIX: DTS build error - 修复参数数量\r\nexport async function createVaporRenderer(\r\n template: string = '',\r\n context: Record<string, unknown> = {},\r\n) {\r\n const { createSignalRenderer: _createSignalRenderer } = await import('./signal/signal-renderer');\r\n return _createSignalRenderer(template, context);\r\n}\r\nexport type { SignalRenderer as VaporRenderer } from './signal/signal-renderer';\r\n\r\n// Vapor 应用 API\r\n/** 定义 Vapor 模式组件 */\r\n// FIX: DTS build error - 添加类型断言\r\nexport async function defineVaporComponent(options: unknown) {\r\n const { defineVaporComponent: _defineVaporComponent } = await import('./vapor/vapor-app');\r\n return _defineVaporComponent(options as Parameters<typeof _defineVaporComponent>[0]);\r\n}\r\nexport async function createVaporApp(rootComponent: unknown, props?: Record<string, unknown>) {\r\n const { createVaporApp: _createVaporApp } = await import('./vapor/vapor-app');\r\n return _createVaporApp(rootComponent as Parameters<typeof _createVaporApp>[0], props);\r\n}\r\nexport type {\r\n VaporComponentOptions,\r\n VaporComponentDefinition,\r\n VaporApp,\r\n VaporAppOptions,\r\n VaporContext,\r\n PropOptions as VaporPropOptions,\r\n} from './vapor/vapor-app';\r\n\r\n// Vapor HMR API (Phase 1.2)\r\n/** Vapor 模式 HMR 支持 */\r\nexport async function getVaporHMRFunctions() {\r\n const vaporHMR = await import('./vapor/vapor-hmr');\r\n return {\r\n generateComponentId: vaporHMR.generateComponentId,\r\n registerComponent: vaporHMR.registerComponent,\r\n unregisterComponent: vaporHMR.unregisterComponent,\r\n handleComponentUpdate: vaporHMR.handleComponentUpdate,\r\n createVaporHMRHandler: vaporHMR.createVaporHMRHandler,\r\n isHMRAvailable: vaporHMR.isHMRAvailable,\r\n forceRerender: vaporHMR.forceRerender,\r\n clearHMRState: vaporHMR.clearHMRState,\r\n onHMRUpdate: vaporHMR.onHMRUpdate,\r\n };\r\n}\r\nexport type {\r\n HMRUpdateType,\r\n HMRUpdate,\r\n HMRStatePreservation,\r\n} from './vapor/vapor-hmr';\r\nexport { DEFAULT_STATE_PRESERVATION } from './vapor/vapor-hmr';\r\n\r\n// Vapor SSR API (Phase 1.3)\r\n/** Vapor 模式 SSR 支持 */\r\nexport async function renderVaporToString(\r\n component: unknown,\r\n props?: Record<string, unknown>,\r\n options?: unknown,\r\n) {\r\n const { renderVaporToString: _renderVaporToString } = await import('./vapor/vapor-ssr');\r\n return _renderVaporToString(\r\n component as Parameters<typeof _renderVaporToString>[0],\r\n props as Parameters<typeof _renderVaporToString>[1],\r\n options as Parameters<typeof _renderVaporToString>[2],\r\n );\r\n}\r\nexport async function renderVaporToStream(\r\n component: unknown,\r\n props?: Record<string, unknown>,\r\n options?: unknown,\r\n) {\r\n const { renderVaporToStream: _renderVaporToStream } = await import('./vapor/vapor-ssr');\r\n return _renderVaporToStream(\r\n component as Parameters<typeof _renderVaporToStream>[0],\r\n props as Parameters<typeof _renderVaporToStream>[1],\r\n options as Parameters<typeof _renderVaporToStream>[2],\r\n );\r\n}\r\nexport async function hydrateVaporComponent(\r\n container: Element | string,\r\n component: unknown,\r\n options?: unknown,\r\n) {\r\n const { hydrateVaporComponent: _hydrateVaporComponent } = await import('./vapor/vapor-ssr');\r\n return _hydrateVaporComponent(\r\n container,\r\n component as Parameters<typeof _hydrateVaporComponent>[1],\r\n options as Parameters<typeof _hydrateVaporComponent>[2],\r\n );\r\n}\r\nexport type {\r\n VaporSSROptions,\r\n VaporSSRResult,\r\n VaporSSRStreamResult,\r\n VaporHydrationOptions,\r\n} from './vapor/vapor-ssr';\r\nexport { definePrefetch, usePrefetchData } from './vapor/vapor-ssr';\r\n\r\n// 组件资源清理\r\n/** 组件资源自动清理:注册事件监听器、effect 订阅、cleanup 钩子,卸载时自动释放 */\r\nexport {\r\n registerComponentEventListener,\r\n registerComponentEffectSubscription,\r\n registerComponentCleanup,\r\n cleanupComponentResources,\r\n} from './unmount';\r\nexport type { ResourceCleanupRenderer } from './unmount';\r\n\r\n// 工具函数\r\n/** HTML 转义、布尔属性判断等工具函数 */\r\nexport { escapeHtml, isBooleanAttr, isVoidElement } from './utils';\r\n\r\n// Server Components API (Phase 1.4)\r\n/** Server Components 服务端运行时 */\r\nexport async function getServerComponentFunctions() {\r\n const serverComponents = await import('./server/server-components');\r\n return {\r\n registerServerComponent: serverComponents.registerServerComponent,\r\n registerServerFunction: serverComponents.registerServerFunction,\r\n getServerComponent: serverComponents.getServerComponent,\r\n getServerFunction: serverComponents.getServerFunction,\r\n handleServerAction: serverComponents.handleServerAction,\r\n createServerActionHandler: serverComponents.createServerActionHandler,\r\n serializeServerData: serverComponents.serializeServerData,\r\n deserializeServerData: serverComponents.deserializeServerData,\r\n renderServerComponent: serverComponents.renderServerComponent,\r\n defineServerComponent: serverComponents.defineServerComponent,\r\n };\r\n}\r\nexport type {\r\n ServerComponentDefinition,\r\n ServerActionRequest,\r\n ServerActionResponse,\r\n} from './server/server-components';\r\n\r\n/** Server Components 客户端运行时 */\r\nexport async function getServerComponentClientFunctions() {\r\n const client = await import('./client/server-components-client');\r\n return {\r\n callServer: client.callServer,\r\n createServerFunction: client.createServerFunction,\r\n getServerData: client.getServerData,\r\n hasServerData: client.hasServerData,\r\n isHydrated: client.isHydrated,\r\n markHydrated: client.markHydrated,\r\n getHydrationState: client.getHydrationState,\r\n autoHydrate: client.autoHydrate,\r\n configureServerAction: client.configureServerAction,\r\n };\r\n}\r\n\r\n// 数据获取 API (Phase 1.7)\r\n/** 数据获取集成 */\r\nexport async function getDataFetchingFunctions() {\r\n const data = await import('./data/data-fetching');\r\n return {\r\n serializeData: data.serializeData,\r\n deserializeData: data.deserializeData,\r\n createPrefetchManager: data.createPrefetchManager,\r\n useFetch: data.useFetch,\r\n useAsyncData: data.useAsyncData,\r\n injectPrefetchData: data.injectPrefetchData,\r\n getPrefetchData: data.getPrefetchData,\r\n };\r\n}\r\nexport type {\r\n DataFetchState,\r\n DataFetchOptions,\r\n PrefetchDataEntry,\r\n PrefetchManager,\r\n} from './data/data-fetching';\r\n","/**\r\n * @lytjs/renderer - Component Resource Cleanup\r\n *\r\n * 基于 WeakMap 的组件资源清理注册表。\r\n * 组件卸载时自动清理所有注册的事件监听器、effect 订阅和 cleanup 钩子。\r\n */\r\n\r\n// ==================== 类型定义 ====================\r\n\r\n\r\n/** 事件监听器注册条目 */\r\ninterface EventListenerEntry {\r\n el: unknown;\r\n event: string;\r\n handler: (...args: unknown[]) => void;\r\n options?: unknown;\r\n}\r\n\r\n/** 渲染器接口(仅需 removeEventListener 方法) */\r\nexport interface ResourceCleanupRenderer {\r\n removeEventListener(\r\n el: unknown,\r\n event: string,\r\n handler: (...args: unknown[]) => void,\r\n options?: unknown,\r\n ): void;\r\n}\r\n\r\n// ==================== 三层 WeakMap 清理注册表 ====================\r\n\r\n/**\r\n * 事件监听器注册表\r\n * key: 组件实例, value: 该组件注册的所有事件监听器条目\r\n */\r\nconst eventListenerRegistry = new WeakMap<object, EventListenerEntry[]>();\r\n\r\n/**\r\n * effect 订阅注册表\r\n * key: 组件实例, value: 该组件注册的所有 effect dispose 函数\r\n */\r\nconst effectSubscriptionRegistry = new WeakMap<object, Array<() => void>>();\r\n\r\n/**\r\n * cleanup 钩子注册表\r\n * key: 组件实例, value: 该组件注册的所有通用清理回调\r\n */\r\nconst cleanupHookRegistry = new WeakMap<object, Array<() => void>>();\r\n\r\n// ==================== 注册函数 ====================\r\n\r\n/**\r\n * 注册组件事件监听器。\r\n * 组件卸载时将自动调用 renderer.removeEventListener 移除该监听器。\r\n *\r\n * @param component - 组件实例(作为 WeakMap key)\r\n * @param el - 事件目标元素\r\n * @param event - 事件名称\r\n * @param handler - 事件处理函数\r\n * @param options - 可选的 addEventListener 选项\r\n */\r\nexport function registerComponentEventListener(\r\n component: object,\r\n el: unknown,\r\n event: string,\r\n handler: (...args: unknown[]) => void,\r\n options?: unknown,\r\n): void {\r\n let listeners = eventListenerRegistry.get(component);\r\n if (!listeners) {\r\n listeners = [];\r\n eventListenerRegistry.set(component, listeners);\r\n }\r\n listeners.push({ el, event, handler, options });\r\n}\r\n\r\n/**\r\n * 注册 effect 订阅。\r\n * 组件卸载时将自动调用 dispose 函数停止 effect。\r\n *\r\n * @param component - 组件实例(作为 WeakMap key)\r\n * @param dispose - effect 的 dispose 回调函数\r\n */\r\nexport function registerComponentEffectSubscription(component: object, dispose: () => void): void {\r\n let subscriptions = effectSubscriptionRegistry.get(component);\r\n if (!subscriptions) {\r\n subscriptions = [];\r\n effectSubscriptionRegistry.set(component, subscriptions);\r\n }\r\n subscriptions.push(dispose);\r\n}\r\n\r\n/**\r\n * 注册通用 cleanup 钩子。\r\n * 组件卸载时将按注册顺序执行该回调。\r\n *\r\n * @param component - 组件实例(作为 WeakMap key)\r\n * @param cleanup - 清理回调函数\r\n */\r\nexport function registerComponentCleanup(component: object, cleanup: () => void): void {\r\n let cleanups = cleanupHookRegistry.get(component);\r\n if (!cleanups) {\r\n cleanups = [];\r\n cleanupHookRegistry.set(component, cleanups);\r\n }\r\n cleanups.push(cleanup);\r\n}\r\n\r\n// ==================== 统一清理函数 ====================\r\n\r\n/**\r\n * 统一清理组件所有注册资源。\r\n *\r\n * 清理顺序:\r\n * 1. cleanup 钩子(可能依赖 effect 仍活跃)\r\n * 2. effect 订阅(停止响应式追踪)\r\n * 3. 事件监听器(DOM 操作,最后执行)\r\n *\r\n * 每个清理操作均通过 try-catch 保护,单个失败不影响其余流程。\r\n *\r\n * @param renderer - 渲染器实例,需提供 removeEventListener 方法\r\n * @param component - 要清理资源的组件实例\r\n */\r\nexport function cleanupComponentResources(\r\n renderer: ResourceCleanupRenderer,\r\n component: object,\r\n): void {\r\n // 1. 执行 cleanup 钩子\r\n const cleanups = cleanupHookRegistry.get(component);\r\n if (cleanups) {\r\n for (const cleanup of cleanups) {\r\n try {\r\n cleanup();\r\n } catch (err) {\r\n if (__DEV__) console.warn('[lytjs/cleanup] Error during cleanup:', err);\r\n }\r\n }\r\n cleanupHookRegistry.delete(component);\r\n }\r\n\r\n // 2. 清理 effect 订阅\r\n const subscriptions = effectSubscriptionRegistry.get(component);\r\n if (subscriptions) {\r\n for (const dispose of subscriptions) {\r\n try {\r\n dispose();\r\n } catch (err) {\r\n if (__DEV__) console.warn('[lytjs/cleanup] Error during cleanup:', err);\r\n }\r\n }\r\n effectSubscriptionRegistry.delete(component);\r\n }\r\n\r\n // 3. 清理事件监听器\r\n const listeners = eventListenerRegistry.get(component);\r\n if (listeners) {\r\n for (const { el, event, handler, options } of listeners) {\r\n try {\r\n renderer.removeEventListener(el, event, handler, options);\r\n } catch (err) {\r\n if (__DEV__) console.warn('[lytjs/cleanup] Error during cleanup:', err);\r\n }\r\n }\r\n eventListenerRegistry.delete(component);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hydration/enhanced-hydration.ts","../src/utils.ts","../src/ssr/ssr-utils.ts","../src/ssr/ssr-stream-optimized.ts","../src/vapor/vapor-hmr.ts","../src/signal/signal-renderer.ts","../src/vapor/vapor-ssr.ts","../src/ssr/ssr-renderer.ts","../src/ssr/ssr-stream.ts","../src/ssr/ssr-island.ts","../src/vapor/vapor-app.ts","../src/server/server-components.ts","../src/client/server-components-client.ts","../src/data/data-fetching.ts","../src/index.ts","../src/unmount.ts"],"names":["HydrationErrorHandler","warn","createApp","error","VOID_ELEMENTS","isNullish","escapeHtml","isString","isObject","camelToKebab","isBooleanAttr","OptimizedSSRStream","ShapeFlags","Fragment","Text","isFunction","Comment","isArray","DEFAULT_STATE_PRESERVATION","clearCompileCache","compile","effect","reconcileArray","createTemplate","setText","setHTML","setAttribute","setProperty","setStyle","setClass","insert","remove","createEventHandler","onCleanup","runCleanups","createSignalRenderer","COMPONENT_MASK","yieldToMicrotask","newElement","ref","watch","renderToString","renderToStream","createOptimizedStream","renderDocumentToStream","hydrateIsland","registerIslandComponent","createIslandSSRContent","defineVaporComponent","createVaporApp","renderVaporToString","renderVaporToStream","hydrateVaporComponent"],"mappings":"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","file":"index.cjs","sourcesContent":["// packages/renderer/src/hydration/enhanced-hydration.ts\r\n// Hydration 完善模块\r\n// Phase 1.15-1.17: 全应用 Hydration、选择性 Hydration、水合错误恢复\r\n\r\n// 临时类型声明,解决循环依赖问题\r\ntype App = unknown;\r\ntype Component = unknown;\r\nimport { warn } from '@lytjs/common-error';\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/** Hydration 模式 */\r\nexport type HydrationMode = 'full' | 'selective' | 'lazy';\r\n\r\n/** Hydration 选项 */\r\nexport interface HydrationOptions {\r\n /** Hydration 模式 */\r\n mode?: HydrationMode;\r\n /** 选择性 Hydration 选择器 */\r\n selectors?: string[];\r\n /** 懒加载阈值(毫秒) */\r\n lazyThreshold?: number;\r\n /** 是否在空闲时 Hydration */\r\n idleCallback?: boolean;\r\n /** 错误处理 */\r\n onError?: (error: HydrationError) => void;\r\n /** 不匹配处理 */\r\n onMismatch?: (mismatch: HydrationMismatch) => void;\r\n /** Hydration 完成回调 */\r\n onComplete?: () => void;\r\n}\r\n\r\n/** Hydration 错误 */\r\nexport interface HydrationError {\r\n /** 错误类型 */\r\n type: 'mismatch' | 'missing' | 'invalid' | 'script';\r\n /** 错误消息 */\r\n message: string;\r\n /** 相关节点 */\r\n node?: Element;\r\n /** 原始错误 */\r\n error?: Error;\r\n}\r\n\r\n/** Hydration 不匹配 */\r\nexport interface HydrationMismatch {\r\n /** 期望的 HTML */\r\n expected: string;\r\n /** 实际的 HTML */\r\n actual: string;\r\n /** 节点路径 */\r\n path: string;\r\n /** 恢复策略 */\r\n recoveryStrategy: 'rerender' | 'keep-server' | 'keep-client';\r\n}\r\n\r\n/** Hydration 统计 */\r\nexport interface HydrationStats {\r\n /** 总节点数 */\r\n totalNodes: number;\r\n /** 已 Hydration 节点数 */\r\n hydratedNodes: number;\r\n /** 跳过的节点数 */\r\n skippedNodes: number;\r\n /** 不匹配数 */\r\n mismatches: number;\r\n /** 错误数 */\r\n errors: number;\r\n /** Hydration 耗时(毫秒) */\r\n duration: number;\r\n}\r\n\r\n// ============================================================\r\n// Phase 1.15: 全应用 Hydration\r\n// ============================================================\r\n\r\n/**\r\n * 全应用 Hydration\r\n * \r\n * @example\r\n * ```ts\r\n * // 服务端渲染的 HTML\r\n * const html = '<div id=\"app\">...</div>';\r\n * \r\n * // 客户端 Hydration\r\n * hydrateApp(App, '#app');\r\n * ```\r\n */\r\nexport async function hydrateApp(\r\n component: Component,\r\n container: string | Element,\r\n options: HydrationOptions = {},\r\n): Promise<{\r\n app: App;\r\n stats: HydrationStats;\r\n}> {\r\n const startTime = performance.now();\r\n const stats: HydrationStats = {\r\n totalNodes: 0,\r\n hydratedNodes: 0,\r\n skippedNodes: 0,\r\n mismatches: 0,\r\n errors: 0,\r\n duration: 0,\r\n };\r\n\r\n const containerEl = typeof container === 'string'\r\n ? document.querySelector(container)\r\n : container;\r\n\r\n if (!containerEl) {\r\n throw new Error(`[LytJS] hydrateApp: container not found: ${container}`);\r\n }\r\n\r\n // 检查是否已经 Hydration\r\n if (containerEl.hasAttribute('data-hydrated')) {\r\n warn('[LytJS] Container already hydrated');\r\n // @ts-ignore\r\n const { createApp } = await import('@lytjs/core');\r\n return {\r\n app: createApp(component),\r\n stats,\r\n };\r\n }\r\n\r\n // 创建应用实例\r\n // @ts-ignore\r\n const { createApp } = await import('@lytjs/core');\r\n const app = createApp(component);\r\n\r\n // 执行 Hydration\r\n try {\r\n await performHydration(containerEl, app, stats, options);\r\n } catch (error) {\r\n stats.errors++;\r\n options.onError?.({\r\n type: 'script',\r\n message: error instanceof Error ? error.message : String(error),\r\n error: error instanceof Error ? error : undefined,\r\n });\r\n }\r\n\r\n // 标记已 Hydration\r\n containerEl.setAttribute('data-hydrated', 'true');\r\n\r\n stats.duration = performance.now() - startTime;\r\n options.onComplete?.();\r\n\r\n return { app, stats };\r\n}\r\n\r\n/**\r\n * 执行 Hydration\r\n */\r\nasync function performHydration(\r\n container: Element,\r\n _app: App,\r\n stats: HydrationStats,\r\n _options: HydrationOptions,\r\n): Promise<void> {\r\n // 遍历所有子节点\r\n const walker = document.createTreeWalker(\r\n container,\r\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,\r\n );\r\n\r\n const nodes: Node[] = [];\r\n let node: Node | null;\r\n while ((node = walker.nextNode())) {\r\n nodes.push(node);\r\n stats.totalNodes++;\r\n }\r\n\r\n // 处理每个节点\r\n for (const n of nodes) {\r\n if (n instanceof Element) {\r\n await hydrateElement(n, stats, _options);\r\n stats.hydratedNodes++;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Hydration 单个元素\r\n */\r\nasync function hydrateElement(\r\n element: Element,\r\n stats: HydrationStats,\r\n _options: HydrationOptions,\r\n): Promise<void> {\r\n // 检查 SSR 标记\r\n const ssrId = element.getAttribute('data-ssr-id');\r\n if (!ssrId) {\r\n stats.skippedNodes++;\r\n return;\r\n }\r\n\r\n // 检查事件监听器\r\n const eventAttrs = Array.from(element.attributes).filter(\r\n attr => attr.name.startsWith('on') || attr.name.startsWith('@'),\r\n );\r\n\r\n for (const attr of eventAttrs) {\r\n // 移除 SSR 渲染的事件属性(客户端会重新绑定)\r\n element.removeAttribute(attr.name);\r\n }\r\n\r\n // 检查指令\r\n const directives = Array.from(element.attributes).filter(\r\n attr => attr.name.startsWith('v-'),\r\n );\r\n\r\n for (const attr of directives) {\r\n // 处理指令\r\n processDirective(element, attr.name, attr.value, _options);\r\n }\r\n}\r\n\r\n/**\r\n * 处理指令\r\n */\r\nfunction processDirective(\r\n element: Element,\r\n name: string,\r\n value: string,\r\n _options: HydrationOptions,\r\n): void {\r\n switch (name) {\r\n case 'v-if':\r\n case 'v-show':\r\n case 'v-for':\r\n // 这些指令由客户端运行时处理\r\n break;\r\n case 'v-model':\r\n // 恢复双向绑定\r\n setupVModel(element, value);\r\n break;\r\n case 'v-bind':\r\n // 恢复属性绑定\r\n setupVBind(element, value);\r\n break;\r\n }\r\n}\r\n\r\n/**\r\n * 设置 v-model 绑定\r\n */\r\nfunction setupVModel(element: Element, _expression: string): void {\r\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\r\n element.addEventListener('input', (e) => {\r\n // 触发响应式更新\r\n const event = new CustomEvent('update:modelValue', {\r\n detail: (e.target as HTMLInputElement).value,\r\n });\r\n element.dispatchEvent(event);\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * 设置 v-bind 绑定\r\n */\r\nfunction setupVBind(element: Element, expression: string): void {\r\n // 简化实现:从 data 属性读取\r\n const bindValue = element.getAttribute(`data-bind-${expression}`);\r\n if (bindValue) {\r\n try {\r\n const value = JSON.parse(bindValue);\r\n element.setAttribute(expression, value);\r\n } catch {\r\n element.setAttribute(expression, bindValue);\r\n }\r\n }\r\n}\r\n\r\n// ============================================================\r\n// Phase 1.16: 选择性 Hydration\r\n// ============================================================\r\n\r\n/** 待 Hydration 队列 */\r\nconst hydrationQueue: Array<{\r\n element: Element;\r\n priority: 'high' | 'medium' | 'low';\r\n callback: () => Promise<void>;\r\n}> = [];\r\n\r\n/** 是否正在处理队列 */\r\nlet isProcessingQueue = false;\r\n\r\n/**\r\n * 选择性 Hydration\r\n * \r\n * @example\r\n * ```ts\r\n * // 只 Hydration 可见区域\r\n * hydrateVisible(App, '#app');\r\n * \r\n * // 基于 IntersectionObserver\r\n * hydrateOnVisible(App, '#app', {\r\n * rootMargin: '100px',\r\n * });\r\n * ```\r\n */\r\nexport async function hydrateVisible(\r\n component: Component,\r\n container: string | Element,\r\n options: HydrationOptions = {},\r\n): Promise<{\r\n app: App;\r\n stats: HydrationStats;\r\n}> {\r\n const containerEl = typeof container === 'string'\r\n ? document.querySelector(container)\r\n : container;\r\n\r\n if (!containerEl) {\r\n throw new Error(`[LytJS] hydrateVisible: container not found: ${container}`);\r\n }\r\n\r\n // 查找所有需要 Hydration 的元素\r\n const hydrateElements = containerEl.querySelectorAll('[data-hydrate]');\r\n\r\n const stats: HydrationStats = {\r\n totalNodes: hydrateElements.length,\r\n hydratedNodes: 0,\r\n skippedNodes: 0,\r\n mismatches: 0,\r\n errors: 0,\r\n duration: 0,\r\n };\r\n\r\n const startTime = performance.now();\r\n // @ts-ignore\r\n const { createApp } = await import('@lytjs/core');\r\n const app = createApp(component);\r\n\r\n // 使用 IntersectionObserver 检测可见性\r\n const observer = new IntersectionObserver(\r\n async (entries) => {\r\n for (const entry of entries) {\r\n if (entry.isIntersecting) {\r\n const element = entry.target as Element;\r\n await hydrateElement(element, stats, options);\r\n stats.hydratedNodes++;\r\n observer.unobserve(element);\r\n }\r\n }\r\n },\r\n {\r\n rootMargin: options.lazyThreshold ? `${options.lazyThreshold}px` : '100px',\r\n },\r\n );\r\n\r\n // 观察所有需要 Hydration 的元素\r\n for (const element of hydrateElements) {\r\n observer.observe(element);\r\n }\r\n\r\n // 等待所有 Hydration 完成\r\n await new Promise<void>((resolve) => {\r\n const checkComplete = () => {\r\n if (stats.hydratedNodes >= stats.totalNodes) {\r\n resolve();\r\n } else {\r\n requestIdleCallback(checkComplete);\r\n }\r\n };\r\n checkComplete();\r\n });\r\n\r\n stats.duration = performance.now() - startTime;\r\n observer.disconnect();\r\n\r\n return { app, stats };\r\n}\r\n\r\n/**\r\n * 延迟 Hydration\r\n * 将 Hydration 任务加入队列,按优先级执行\r\n */\r\nexport function queueHydration(\r\n element: Element,\r\n priority: 'high' | 'medium' | 'low',\r\n callback: () => Promise<void>,\r\n): void {\r\n hydrationQueue.push({ element, priority, callback });\r\n hydrationQueue.sort((a, b) => {\r\n const priorityOrder = { high: 0, medium: 1, low: 2 };\r\n return priorityOrder[a.priority] - priorityOrder[b.priority];\r\n });\r\n\r\n if (!isProcessingQueue) {\r\n processHydrationQueue();\r\n }\r\n}\r\n\r\n/**\r\n * 处理 Hydration 队列\r\n */\r\nasync function processHydrationQueue(): Promise<void> {\r\n isProcessingQueue = true;\r\n\r\n while (hydrationQueue.length > 0) {\r\n const task = hydrationQueue.shift();\r\n if (task) {\r\n await task.callback();\r\n }\r\n\r\n // 让出控制权\r\n await new Promise(resolve => requestIdleCallback(resolve));\r\n }\r\n\r\n isProcessingQueue = false;\r\n}\r\n\r\n// ============================================================\r\n// Phase 1.17: 水合错误恢复\r\n// ============================================================\r\n\r\n/**\r\n * 水合错误恢复策略\r\n */\r\nexport type RecoveryStrategy = 'rerender' | 'keep-server' | 'keep-client' | 'fallback';\r\n\r\n/**\r\n * 水合错误处理器\r\n */\r\nexport class HydrationErrorHandler {\r\n private errors: HydrationError[] = [];\r\n private mismatches: HydrationMismatch[] = [];\r\n private options: HydrationOptions;\r\n\r\n constructor(options: HydrationOptions = {}) {\r\n this.options = options;\r\n }\r\n\r\n /**\r\n * 处理 Hydration 错误\r\n */\r\n handleError(error: HydrationError): RecoveryStrategy {\r\n this.errors.push(error);\r\n this.options.onError?.(error);\r\n\r\n // 根据错误类型决定恢复策略\r\n switch (error.type) {\r\n case 'mismatch':\r\n return this.handleMismatch(error);\r\n case 'missing':\r\n return 'fallback';\r\n case 'invalid':\r\n return 'rerender';\r\n case 'script':\r\n return 'keep-server';\r\n default:\r\n return 'rerender';\r\n }\r\n }\r\n\r\n /**\r\n * 处理不匹配错误\r\n */\r\n private handleMismatch(error: HydrationError): RecoveryStrategy {\r\n const mismatch: HydrationMismatch = {\r\n expected: error.node?.getAttribute('data-ssr-expected') || '',\r\n actual: error.node?.innerHTML || '',\r\n path: this.getNodePath(error.node),\r\n recoveryStrategy: 'rerender',\r\n };\r\n\r\n this.mismatches.push(mismatch);\r\n this.options.onMismatch?.(mismatch);\r\n\r\n // 智能选择恢复策略\r\n if (this.isMinorMismatch(mismatch)) {\r\n mismatch.recoveryStrategy = 'keep-server';\r\n return 'keep-server';\r\n }\r\n\r\n if (this.isCriticalMismatch(mismatch)) {\r\n mismatch.recoveryStrategy = 'rerender';\r\n return 'rerender';\r\n }\r\n\r\n return 'keep-client';\r\n }\r\n\r\n /**\r\n * 判断是否是轻微不匹配\r\n */\r\n private isMinorMismatch(mismatch: HydrationMismatch): boolean {\r\n // 空白字符差异\r\n if (mismatch.expected.trim() === mismatch.actual.trim()) {\r\n return true;\r\n }\r\n\r\n // 属性顺序差异\r\n const normalize = (html: string) =>\r\n html.replace(/\\s+/g, ' ').replace(/\\s*=\\s*/g, '=');\r\n if (normalize(mismatch.expected) === normalize(mismatch.actual)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * 判断是否是严重不匹配\r\n */\r\n private isCriticalMismatch(mismatch: HydrationMismatch): boolean {\r\n // 结构完全不同\r\n const expectedTags = mismatch.expected.match(/<\\w+/g) || [];\r\n const actualTags = mismatch.actual.match(/<\\w+/g) || [];\r\n\r\n if (expectedTags.length !== actualTags.length) {\r\n return true;\r\n }\r\n\r\n // 关键属性缺失\r\n if (mismatch.expected.includes('data-') && !mismatch.actual.includes('data-')) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * 获取节点路径\r\n */\r\n private getNodePath(node?: Element): string {\r\n if (!node) return '';\r\n\r\n const path: string[] = [];\r\n let current: Element | null = node;\r\n\r\n while (current && current !== document.body) {\r\n const tagName = current.tagName.toLowerCase();\r\n const siblings = current.parentElement?.children;\r\n const index = siblings ? Array.from(siblings).indexOf(current) : 0;\r\n path.unshift(`${tagName}[${index}]`);\r\n current = current.parentElement;\r\n }\r\n\r\n return path.join(' > ');\r\n }\r\n\r\n /**\r\n * 获取所有错误\r\n */\r\n getErrors(): HydrationError[] {\r\n return [...this.errors];\r\n }\r\n\r\n /**\r\n * 获取所有不匹配\r\n */\r\n getMismatches(): HydrationMismatch[] {\r\n return [...this.mismatches];\r\n }\r\n\r\n /**\r\n * 清除错误记录\r\n */\r\n clear(): void {\r\n this.errors = [];\r\n this.mismatches = [];\r\n }\r\n}\r\n\r\n/**\r\n * 创建错误处理器\r\n */\r\nexport function createHydrationErrorHandler(\r\n options: HydrationOptions = {},\r\n): HydrationErrorHandler {\r\n return new HydrationErrorHandler(options);\r\n}\r\n\r\n/**\r\n * 安全 Hydration\r\n * 带错误恢复的 Hydration\r\n */\r\nexport async function safeHydrate(\r\n component: Component,\r\n container: string | Element,\r\n options: HydrationOptions = {},\r\n): Promise<{\r\n app: App;\r\n stats: HydrationStats;\r\n errorHandler: HydrationErrorHandler;\r\n}> {\r\n const errorHandler = createHydrationErrorHandler(options);\r\n\r\n try {\r\n const result = await hydrateApp(component, container, {\r\n ...options,\r\n onError: (error) => {\r\n errorHandler.handleError(error);\r\n options.onError?.(error);\r\n },\r\n onMismatch: (mismatch) => {\r\n options.onMismatch?.(mismatch);\r\n },\r\n });\r\n\r\n return {\r\n ...result,\r\n errorHandler,\r\n };\r\n } catch (error) {\r\n // 尝试降级渲染\r\n const containerEl = typeof container === 'string'\r\n ? document.querySelector(container)\r\n : container;\r\n\r\n if (containerEl) {\r\n // 清空容器并重新渲染\r\n containerEl.innerHTML = '';\r\n // @ts-ignore\r\n const { createApp } = await import('@lytjs/core');\r\n const app = createApp(component);\r\n app.mount(containerEl);\r\n\r\n return {\r\n app,\r\n stats: {\r\n totalNodes: 0,\r\n hydratedNodes: 0,\r\n skippedNodes: 0,\r\n mismatches: 0,\r\n errors: 1,\r\n duration: 0,\r\n },\r\n errorHandler,\r\n };\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n\r\n// ============================================================\r\n// 导出(函数已在上面定义)\r\n// ============================================================\r\n","/**\r\n * @lytjs/renderer - Shared utilities\r\n *\r\n * This module provides shared utility functions used across the renderer package,\r\n * including HTML escaping, boolean attribute detection, and void element checks.\r\n * It re-exports selected utilities from @lytjs/common-string for convenience.\r\n */\r\n\r\nimport { escapeHtml, isBooleanAttr, VOID_ELEMENTS } from '@lytjs/common-string';\r\n\r\nexport { escapeHtml, isBooleanAttr };\r\n\r\n// ============================================================\r\n// Self-closing elements\r\n// ============================================================\r\n\r\n/**\r\n * Check if a tag is a void (self-closing) element\r\n */\r\nexport function isVoidElement(tag: string): boolean {\r\n return VOID_ELEMENTS.has(tag);\r\n}\r\n","/**\r\n * @lytjs/renderer - SSR Utilities\r\n * SSR 渲染共享工具函数\r\n * FIX: P2-36 提取 ssr-renderer 和 ssr-stream 的共享代码\r\n */\r\n\r\nimport { isString, isObject, isNullish } from '@lytjs/common-is';\r\nimport { camelToKebab } from '@lytjs/common-string';\r\nimport { warn } from '@lytjs/common-error';\r\nimport { escapeHtml, isBooleanAttr } from '../utils';\r\n\r\n// ============================================================\r\n// HTML 标签验证\r\n// ============================================================\r\n\r\n/**\r\n * 验证是否为有效的 HTML 元素标签名\r\n * @param tag - 标签名\r\n * @returns 是否有效\r\n */\r\nexport function isValidHTMLElementTag(tag: string): boolean {\r\n return /^[a-z][a-z0-9-]*$/.test(tag);\r\n}\r\n\r\n// ============================================================\r\n// URL 安全验证\r\n// ============================================================\r\n\r\n// 安全:携带 URL 且需要协议验证的属性\r\n// 提取为模块级常量以避免每次渲染时重新创建\r\nexport const URL_ATTRS = new Set([\r\n 'href',\r\n 'src',\r\n 'action',\r\n 'formaction',\r\n 'xlink:href',\r\n 'data',\r\n 'srcdoc',\r\n]);\r\n\r\n// 命名实体解码常量\r\nexport const NAMED_ENTITIES: Record<string, string> = {\r\n ':': ':',\r\n '&tab;': '\\t',\r\n '&newline;': '\\n',\r\n '(': '(',\r\n ')': ')',\r\n ' ': '\\u00A0',\r\n '©': '\\u00A9',\r\n '®': '\\u00AE',\r\n '™': '\\u2122',\r\n '×': '\\u00D7',\r\n '÷': '\\u00F7',\r\n '£': '\\u00A3',\r\n '¥': '\\u00A5',\r\n '¢': '\\u00A2',\r\n '§': '\\u00A7',\r\n '¶': '\\u00B6',\r\n '·': '\\u00B7',\r\n '«': '\\u00AB',\r\n '»': '\\u00BB',\r\n '¡': '\\u00A1',\r\n '¿': '\\u00BF',\r\n '°': '\\u00B0',\r\n '±': '\\u00B1',\r\n 'µ': '\\u00B5',\r\n '¼': '\\u00BC',\r\n '½': '\\u00BD',\r\n '¾': '\\u00BE',\r\n '¹': '\\u00B9',\r\n '²': '\\u00B2',\r\n '³': '\\u00B3',\r\n '´': '\\u00B4',\r\n '¸': '\\u00B8',\r\n 'ª': '\\u00AA',\r\n '¬': '\\u00AC',\r\n '­': '\\u00AD',\r\n '¯': '\\u00AF',\r\n '¨': '\\u00A8',\r\n 'ˆ': '\\u02C6',\r\n '˜': '\\u02DC',\r\n ' ': '\\u2002',\r\n ' ': '\\u2003',\r\n ' ': '\\u2009',\r\n '‌': '\\u200C',\r\n '‍': '\\u200D',\r\n '‎': '\\u200E',\r\n '‏': '\\u200F',\r\n '–': '\\u2013',\r\n '—': '\\u2014',\r\n '‘': '\\u2018',\r\n '’': '\\u2019',\r\n '‚': '\\u201A',\r\n '“': '\\u201C',\r\n '”': '\\u201D',\r\n '„': '\\u201E',\r\n '†': '\\u2020',\r\n '‡': '\\u2021',\r\n '•': '\\u2022',\r\n '…': '\\u2026',\r\n '‰': '\\u2030',\r\n '′': '\\u2032',\r\n '″': '\\u2033',\r\n '‹': '\\u2039',\r\n '›': '\\u203A',\r\n '‾': '\\u203E',\r\n '⁄': '\\u2044',\r\n '€': '\\u20AC',\r\n '←': '\\u2190',\r\n '↑': '\\u2191',\r\n '→': '\\u2192',\r\n '↓': '\\u2193',\r\n '↔': '\\u2194',\r\n '↵': '\\u21B5',\r\n '⌈': '\\u2308',\r\n '⌉': '\\u2309',\r\n '⌊': '\\u230A',\r\n '⌋': '\\u230B',\r\n '⟨': '\\u27E8',\r\n '⟩': '\\u27E9',\r\n '◊': '\\u25CA',\r\n '♠': '\\u2660',\r\n '♣': '\\u2663',\r\n '♥': '\\u2665',\r\n '♦': '\\u2666',\r\n 'Œ': '\\u0152',\r\n 'œ': '\\u0153',\r\n 'Š': '\\u0160',\r\n 'š': '\\u0161',\r\n 'Ÿ': '\\u0178',\r\n 'ƒ': '\\u0192',\r\n 'Α': '\\u0391',\r\n 'Β': '\\u0392',\r\n 'Γ': '\\u0393',\r\n 'Δ': '\\u0394',\r\n 'Ε': '\\u0395',\r\n 'Ζ': '\\u0396',\r\n 'Η': '\\u0397',\r\n 'Θ': '\\u0398',\r\n 'Ι': '\\u0399',\r\n 'Κ': '\\u039A',\r\n 'Λ': '\\u039B',\r\n 'Μ': '\\u039C',\r\n 'Ν': '\\u039D',\r\n 'Ξ': '\\u039E',\r\n 'Ο': '\\u039F',\r\n 'Π': '\\u03A0',\r\n 'Ρ': '\\u03A1',\r\n 'Σ': '\\u03A3',\r\n 'Τ': '\\u03A4',\r\n 'Υ': '\\u03A5',\r\n 'Φ': '\\u03A6',\r\n 'Χ': '\\u03A7',\r\n 'Ψ': '\\u03A8',\r\n 'Ω': '\\u03A9',\r\n 'α': '\\u03B1',\r\n 'β': '\\u03B2',\r\n 'γ': '\\u03B3',\r\n 'δ': '\\u03B4',\r\n 'ε': '\\u03B5',\r\n 'ζ': '\\u03B6',\r\n 'η': '\\u03B7',\r\n 'θ': '\\u03B8',\r\n 'ι': '\\u03B9',\r\n 'κ': '\\u03BA',\r\n 'λ': '\\u03BB',\r\n 'μ': '\\u03BC',\r\n 'ν': '\\u03BD',\r\n 'ξ': '\\u03BE',\r\n 'ο': '\\u03BF',\r\n 'π': '\\u03C0',\r\n 'ρ': '\\u03C1',\r\n 'ς': '\\u03C2',\r\n 'σ': '\\u03C3',\r\n 'τ': '\\u03C4',\r\n 'υ': '\\u03C5',\r\n 'φ': '\\u03C6',\r\n 'χ': '\\u03C7',\r\n 'ψ': '\\u03C8',\r\n 'ω': '\\u03C9',\r\n 'ϑ': '\\u03D1',\r\n 'ϒ': '\\u03D2',\r\n 'ϖ': '\\u03D6',\r\n ''': \"'\",\r\n '"': '\"',\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n};\r\n\r\n// 命名实体正则(模块级以避免重新创建)\r\nconst NAMED_ENTITY_REGEX = new RegExp(\r\n Object.keys(NAMED_ENTITIES)\r\n .map((e) => e.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\r\n .join('|'),\r\n 'g',\r\n);\r\n\r\n// 数字实体正则(模块级以避免每次调用 isSafeURL 时重新创建)\r\nconst NUMERIC_ENTITY_REGEX = /&#x?[0-9a-f]+;/gi;\r\n\r\n/**\r\n * 检查 URL 是否安全(防止 XSS 攻击)\r\n * @param url - 要检查的 URL\r\n * @returns 是否安全\r\n */\r\nexport function isSafeURL(url: string): boolean {\r\n // 循环解码 HTML 实体,直到字符串不再变化\r\n let decoded = url;\r\n let prev = '';\r\n let maxIterations = 10;\r\n while (decoded !== prev && maxIterations-- > 0) {\r\n prev = decoded;\r\n decoded = decoded.replace(NUMERIC_ENTITY_REGEX, (match) => {\r\n const codePoint = match.startsWith('&#x')\r\n ? parseInt(match.slice(3, -1), 16)\r\n : parseInt(match.slice(2, -1), 10);\r\n // 验证解析后的码点是否在有效的 Unicode 范围内\r\n if (isNaN(codePoint) || codePoint < 0 || codePoint > 0x10ffff) {\r\n return match;\r\n }\r\n return String.fromCodePoint(codePoint);\r\n });\r\n // 命名实体解码(在数字实体解码之后)\r\n decoded = decoded.replace(NAMED_ENTITY_REGEX, (match) => NAMED_ENTITIES[match] || match);\r\n }\r\n // 使用 URL 构造函数进行额外验证\r\n try {\r\n const parsed = new URL(decoded, 'http://example.com');\r\n const protocol = parsed.protocol.toLowerCase().replace(':', '');\r\n if (protocol === 'javascript') {\r\n return false;\r\n }\r\n if (protocol === 'data') {\r\n // 禁止 data:image/svg+xml(可嵌入脚本,存在 XSS 风险)\r\n if (/^data:image\\/svg\\+xml/i.test(decoded)) {\r\n return false;\r\n }\r\n // 允许安全的 data:image/* MIME 类型(使用解码后的 URL 进行检查)\r\n return /^data:image\\/(png|jpeg|jpg|gif|webp|bmp|ico|avif);/i.test(decoded);\r\n }\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n// ============================================================\r\n// 属性渲染\r\n// ============================================================\r\n\r\n/**\r\n * 将属性渲染为 HTML 字符串(用于 SSR)\r\n * @param key - 属性名\r\n * @param value - 属性值\r\n * @returns HTML 属性字符串\r\n */\r\nexport function renderAttributeToString(key: string, value: unknown): string {\r\n // 跳过 null/undefined\r\n if (isNullish(value)) return '';\r\n\r\n // 跳过事件处理器\r\n if (/^on[A-Z]/.test(key)) return '';\r\n\r\n // Class 处理\r\n if (key === 'class') {\r\n const classValue = value == null ? '' : String(value);\r\n if (!classValue) return '';\r\n return ` class=\"${escapeHtml(classValue)}\"`;\r\n }\r\n\r\n // Style 处理\r\n if (key === 'style') {\r\n if (isString(value)) {\r\n if (!value) return '';\r\n return ` style=\"${escapeHtml(value)}\"`;\r\n }\r\n if (isObject(value)) {\r\n const styles: string[] = [];\r\n for (const k in value as Record<string, unknown>) {\r\n const val = (value as Record<string, unknown>)[k];\r\n if (val != null && val !== '') {\r\n styles.push(`${camelToKebab(k)}:${String(val)}`);\r\n }\r\n }\r\n if (styles.length === 0) return '';\r\n return ` style=\"${escapeHtml(styles.join(';'))}\"`;\r\n }\r\n return '';\r\n }\r\n\r\n // 布尔属性\r\n if (isBooleanAttr(key)) {\r\n if (value === false || value === '') return '';\r\n return ` ${key}`;\r\n }\r\n\r\n // 安全:阻止 URL 属性上的危险协议\r\n if (URL_ATTRS.has(key)) {\r\n if (!isSafeURL(String(value))) {\r\n if (__DEV__) {\r\n warn(`Blocked potentially dangerous attribute: ${key}=\"${String(value)}\"`);\r\n }\r\n return '';\r\n }\r\n }\r\n\r\n // 常规属性\r\n return ` ${key}=\"${escapeHtml(String(value))}\"`;\r\n}\r\n","// packages/renderer/src/ssr/ssr-stream-optimized.ts\r\n// Streaming SSR 优化版本\r\n// Phase 1.5: TTFB 降低 50%+\r\n\r\nimport type { VNode } from '@lytjs/vdom';\r\nimport { Fragment, Text, Comment, ShapeFlags } from '@lytjs/vdom';\r\nimport { isArray, isFunction } from '@lytjs/common-is';\r\nimport { escapeHtml, isVoidElement } from '../utils';\r\nimport { isValidHTMLElementTag, renderAttributeToString } from './ssr-utils';\r\nimport { warn } from '@lytjs/common-error';\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/** 优化的流式渲染选项 */\r\nexport interface OptimizedStreamOptions {\r\n /** 是否启用预加载提示 */\r\n preloadHints?: boolean;\r\n /** 是否启用 HTTP/2 Push */\r\n http2Push?: boolean;\r\n /** 关键 CSS 内联 */\r\n criticalCSS?: string;\r\n /** 延迟加载阈值(毫秒) */\r\n deferThreshold?: number;\r\n /** 是否启用压缩 */\r\n compression?: boolean;\r\n /** 缓冲区大小(字节) */\r\n bufferSize?: number;\r\n /** 是否启用 Early Flush */\r\n earlyFlush?: boolean;\r\n}\r\n\r\n/** 预加载提示 */\r\nexport interface PreloadHint {\r\n /** 资源类型 */\r\n type: 'script' | 'style' | 'font' | 'image';\r\n /** 资源 URL */\r\n href: string;\r\n /** 是否跨域 */\r\n crossorigin?: boolean;\r\n /** 优先级 */\r\n importance?: 'high' | 'low' | 'auto';\r\n}\r\n\r\n/** 流式渲染统计 */\r\nexport interface StreamStats {\r\n /** TTFB(首字节时间) */\r\n ttfb: number;\r\n /** 总渲染时间 */\r\n totalTime: number;\r\n /** 块数量 */\r\n chunkCount: number;\r\n /** 总字节数 */\r\n totalBytes: number;\r\n /** Suspense 边界数量 */\r\n suspenseBoundaries: number;\r\n}\r\n\r\n// ============================================================\r\n// 全局状态\r\n// ============================================================\r\n\r\nconst COMPONENT_MASK = ShapeFlags.STATEFUL_COMPONENT | ShapeFlags.FUNCTIONAL_COMPONENT;\r\n\r\n// ============================================================\r\n// OptimizedSSRStream 类\r\n// ============================================================\r\n\r\n/**\r\n * 优化的 SSR 流式渲染器\r\n * \r\n * 特性:\r\n * - Early Flush:尽早发送初始 HTML\r\n * - 智能缓冲:自动管理缓冲区大小\r\n * - 预加载提示:自动生成 Link 头\r\n * - 优先级调度:关键内容优先发送\r\n */\r\nexport class OptimizedSSRStream {\r\n private controller: ReadableStreamDefaultController<Uint8Array>;\r\n private encoder: TextEncoder;\r\n private options: Required<OptimizedStreamOptions>;\r\n private buffer: string[];\r\n private bufferSize: number;\r\n private stats: StreamStats;\r\n private startTime: number;\r\n private flushedFirstChunk: boolean = false;\r\n private preloadHints: Set<string>;\r\n\r\n constructor(\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n options: OptimizedStreamOptions = {},\r\n ) {\r\n this.controller = controller;\r\n this.encoder = new TextEncoder();\r\n this.options = {\r\n preloadHints: options.preloadHints ?? true,\r\n http2Push: options.http2Push ?? false,\r\n criticalCSS: options.criticalCSS ?? '',\r\n deferThreshold: options.deferThreshold ?? 50,\r\n compression: options.compression ?? false,\r\n bufferSize: options.bufferSize ?? 4096,\r\n earlyFlush: options.earlyFlush ?? true,\r\n };\r\n this.buffer = [];\r\n this.bufferSize = 0;\r\n this.startTime = Date.now();\r\n this.stats = {\r\n ttfb: 0,\r\n totalTime: 0,\r\n chunkCount: 0,\r\n totalBytes: 0,\r\n suspenseBoundaries: 0,\r\n };\r\n this.preloadHints = new Set();\r\n }\r\n\r\n // ============================================================\r\n // 公共方法\r\n // ============================================================\r\n\r\n /**\r\n * 推送 HTML 内容到流\r\n */\r\n push(html: string): void {\r\n this.buffer.push(html);\r\n this.bufferSize += html.length;\r\n\r\n // 检查是否需要刷新缓冲区\r\n if (this.bufferSize >= this.options.bufferSize) {\r\n this.flush();\r\n }\r\n }\r\n\r\n /**\r\n * 刷新缓冲区到流\r\n */\r\n flush(): void {\r\n if (this.buffer.length === 0) return;\r\n\r\n const chunk = this.buffer.join('');\r\n this.buffer = [];\r\n this.bufferSize = 0;\r\n\r\n this.controller.enqueue(this.encoder.encode(chunk));\r\n\r\n // 记录首字节时间\r\n if (!this.flushedFirstChunk) {\r\n this.flushedFirstChunk = true;\r\n this.stats.ttfb = Date.now() - this.startTime;\r\n }\r\n\r\n this.stats.chunkCount++;\r\n this.stats.totalBytes += chunk.length;\r\n }\r\n\r\n /**\r\n * 添加预加载提示\r\n */\r\n addPreloadHint(hint: PreloadHint): void {\r\n const key = `${hint.type}:${hint.href}`;\r\n if (this.preloadHints.has(key)) return;\r\n\r\n this.preloadHints.add(key);\r\n\r\n // 生成 Link 头\r\n const linkHeader = this.generateLinkHeader(hint);\r\n this.push(linkHeader);\r\n }\r\n\r\n /**\r\n * 生成文档头部\r\n */\r\n generateDocumentHead(options: {\r\n title?: string;\r\n meta?: Record<string, string>[];\r\n links?: Record<string, string>[];\r\n styles?: string[];\r\n }): string {\r\n const { title, meta = [], links = [], styles = [] } = options;\r\n\r\n let head = '<!DOCTYPE html><html><head>';\r\n head += '<meta charset=\"utf-8\">';\r\n head += '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">';\r\n\r\n if (title) {\r\n head += `<title>${escapeHtml(title)}</title>`;\r\n }\r\n\r\n // 添加 meta 标签\r\n for (const m of meta) {\r\n const attrs = Object.entries(m)\r\n .map(([k, v]) => `${k}=\"${escapeHtml(v)}\"`)\r\n .join(' ');\r\n head += `<meta ${attrs}>`;\r\n }\r\n\r\n // 添加 link 标签\r\n for (const l of links) {\r\n const attrs = Object.entries(l)\r\n .map(([k, v]) => `${k}=\"${escapeHtml(v)}\"`)\r\n .join(' ');\r\n head += `<link ${attrs}>`;\r\n }\r\n\r\n // 内联关键 CSS\r\n if (this.options.criticalCSS) {\r\n head += `<style>${this.options.criticalCSS}</style>`;\r\n }\r\n\r\n // 添加样式\r\n for (const style of styles) {\r\n head += `<style>${style}</style>`;\r\n }\r\n\r\n head += '</head><body>';\r\n\r\n return head;\r\n }\r\n\r\n /**\r\n * 生成文档尾部\r\n */\r\n generateDocumentFooter(options: {\r\n scripts?: string[];\r\n inlineScripts?: string[];\r\n }): string {\r\n const { scripts = [], inlineScripts = [] } = options;\r\n\r\n let footer = '';\r\n\r\n // 添加内联脚本\r\n for (const script of inlineScripts) {\r\n footer += `<script>${script}</script>`;\r\n }\r\n\r\n // 添加外部脚本\r\n for (const src of scripts) {\r\n footer += `<script src=\"${escapeHtml(src)}\"></script>`;\r\n }\r\n\r\n footer += '</body></html>';\r\n\r\n return footer;\r\n }\r\n\r\n /**\r\n * 流式渲染 VNode\r\n */\r\n async renderVNode(vnode: VNode): Promise<void> {\r\n await this.streamVNode(vnode);\r\n this.flush();\r\n }\r\n\r\n /**\r\n * 获取渲染统计\r\n */\r\n getStats(): StreamStats {\r\n this.stats.totalTime = Date.now() - this.startTime;\r\n return { ...this.stats };\r\n }\r\n\r\n /**\r\n * 完成渲染\r\n */\r\n finish(): void {\r\n // 刷新剩余缓冲区\r\n this.flush();\r\n this.stats.totalTime = Date.now() - this.startTime;\r\n }\r\n\r\n // ============================================================\r\n // 内部方法\r\n // ============================================================\r\n\r\n private generateLinkHeader(hint: PreloadHint): string {\r\n const attrs = [`rel=\"preload\"`, `href=\"${escapeHtml(hint.href)}\"`, `as=\"${hint.type}\"`];\r\n\r\n if (hint.crossorigin) {\r\n attrs.push('crossorigin');\r\n }\r\n if (hint.importance) {\r\n attrs.push(`importance=\"${hint.importance}\"`);\r\n }\r\n\r\n return `<link ${attrs.join(' ')}>`;\r\n }\r\n\r\n private async streamVNode(vnode: VNode): Promise<void> {\r\n const { type, shapeFlag, children } = vnode;\r\n\r\n // 处理 Fragment\r\n if (type === Fragment) {\r\n await this.streamFragment(vnode);\r\n return;\r\n }\r\n\r\n // 处理 Text\r\n if (type === Text) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n this.push(escapeHtml(text));\r\n return;\r\n }\r\n\r\n // 处理 Comment\r\n if (type === Comment) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n let safe = text.replace(/<!--/g, '<!--').replace(/-->/g, '-->');\r\n safe = safe.replace(/--/g, '- -');\r\n this.push(`<!--${safe}-->`);\r\n return;\r\n }\r\n\r\n // 处理 Element\r\n if (shapeFlag & ShapeFlags.ELEMENT) {\r\n await this.streamElement(vnode);\r\n return;\r\n }\r\n\r\n // 处理组件\r\n if (this.isComponentVNode(vnode)) {\r\n await this.streamComponent(vnode);\r\n return;\r\n }\r\n }\r\n\r\n private async streamFragment(vnode: VNode): Promise<void> {\r\n const children = vnode.children;\r\n if (isArray(children)) {\r\n for (const child of children) {\r\n if (child != null) {\r\n await this.streamVNode(child);\r\n await this.yieldToMicrotask();\r\n }\r\n }\r\n }\r\n }\r\n\r\n private async streamElement(vnode: VNode): Promise<void> {\r\n const tag = vnode.type as string;\r\n\r\n if (!isValidHTMLElementTag(tag)) {\r\n if (__DEV__) {\r\n warn(`Invalid SSR stream element tag: \"${tag}\"`);\r\n }\r\n return;\r\n }\r\n\r\n const props = vnode.props ?? {};\r\n const { shapeFlag, children } = vnode;\r\n\r\n // 构建开始标签\r\n let openTag = `<${tag}`;\r\n\r\n for (const key of Object.keys(props)) {\r\n if (key === 'key' || key === 'ref') continue;\r\n openTag += renderAttributeToString(key, props[key]);\r\n }\r\n\r\n // 自闭合元素\r\n if (isVoidElement(tag)) {\r\n this.push(`${openTag} />`);\r\n return;\r\n }\r\n\r\n this.push(`${openTag}>`);\r\n\r\n // 流式渲染子节点\r\n if (shapeFlag & ShapeFlags.TEXT_CHILDREN) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n this.push(escapeHtml(text));\r\n } else if (shapeFlag & ShapeFlags.ARRAY_CHILDREN && isArray(children)) {\r\n for (const child of children) {\r\n if (child != null) {\r\n await this.streamVNode(child);\r\n await this.yieldToMicrotask();\r\n }\r\n }\r\n }\r\n\r\n this.push(`</${tag}>`);\r\n }\r\n\r\n private async streamComponent(vnode: VNode): Promise<void> {\r\n const component = vnode.type as Record<string, unknown>;\r\n\r\n if (typeof component === 'object' && component !== null) {\r\n if (typeof component.render === 'function') {\r\n const result = component.render(vnode.props ?? {});\r\n if (result && typeof result === 'object' && 'type' in result) {\r\n await this.streamVNode(result as VNode);\r\n return;\r\n }\r\n }\r\n\r\n if (typeof component.setup === 'function') {\r\n const setupResult = component.setup(vnode.props ?? {});\r\n const resolved = setupResult instanceof Promise ? await setupResult : setupResult;\r\n if (resolved && typeof resolved === 'object' && 'type' in resolved) {\r\n await this.streamVNode(resolved as VNode);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (__DEV__) {\r\n warn(`SSR stream: could not render component vnode`);\r\n }\r\n }\r\n\r\n private isComponentVNode(vnode: VNode): boolean {\r\n return !!(vnode.shapeFlag & COMPONENT_MASK);\r\n }\r\n\r\n private yieldToMicrotask(): Promise<void> {\r\n return new Promise<void>((resolve) => {\r\n if (typeof queueMicrotask === 'function') {\r\n queueMicrotask(resolve);\r\n } else {\r\n Promise.resolve().then(resolve);\r\n }\r\n });\r\n }\r\n}\r\n\r\n// ============================================================\r\n// 便捷函数\r\n// ============================================================\r\n\r\n/**\r\n * 创建优化的流式渲染\r\n */\r\nexport function createOptimizedStream(\r\n vnode: VNode,\r\n options?: OptimizedStreamOptions,\r\n): ReadableStream<Uint8Array> {\r\n return new ReadableStream<Uint8Array>({\r\n async start(controller) {\r\n const stream = new OptimizedSSRStream(controller, options);\r\n\r\n try {\r\n await stream.renderVNode(vnode);\r\n stream.finish();\r\n controller.close();\r\n } catch (error) {\r\n controller.error(error);\r\n }\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * 渲染完整的 HTML 文档\r\n */\r\nexport async function renderDocumentToStream(\r\n vnode: VNode,\r\n options: {\r\n head?: {\r\n title?: string;\r\n meta?: Record<string, string>[];\r\n links?: Record<string, string>[];\r\n styles?: string[];\r\n };\r\n footer?: {\r\n scripts?: string[];\r\n inlineScripts?: string[];\r\n };\r\n stream?: OptimizedStreamOptions;\r\n } = {},\r\n): Promise<ReadableStream<Uint8Array>> {\r\n return new ReadableStream<Uint8Array>({\r\n async start(controller) {\r\n const stream = new OptimizedSSRStream(controller, options.stream);\r\n\r\n try {\r\n // 生成文档头部\r\n const head = stream.generateDocumentHead(options.head || {});\r\n stream.push(head);\r\n\r\n // Early Flush:尽早发送头部\r\n if (options.stream?.earlyFlush !== false) {\r\n stream.flush();\r\n }\r\n\r\n // 渲染主体内容\r\n await stream.renderVNode(vnode);\r\n\r\n // 生成文档尾部\r\n const footer = stream.generateDocumentFooter(options.footer || {});\r\n stream.push(footer);\r\n\r\n stream.finish();\r\n controller.close();\r\n } catch (error) {\r\n controller.error(error);\r\n }\r\n },\r\n });\r\n}\r\n\r\n// ============================================================\r\n// 导出(已在上面定义)\r\n// ============================================================\r\n","// packages/renderer/src/vapor/vapor-hmr.ts\r\n// Vapor 模式 HMR (Hot Module Replacement) 支持\r\n// Phase 1.2: 实现 Vapor 组件热更新,保持组件状态\r\n\r\nimport type { VaporComponentDefinition } from './vapor-app';\r\n\r\n// ============================================================\r\n// HMR 类型定义\r\n// ============================================================\r\n\r\n/** HMR 更新类型 */\r\nexport type HMRUpdateType = 'template' | 'script' | 'style' | 'full';\r\n\r\n/** HMR 更新信息 */\r\nexport interface HMRUpdate {\r\n type: HMRUpdateType;\r\n componentId: string;\r\n oldComponent: VaporComponentDefinition | null;\r\n newComponent: VaporComponentDefinition;\r\n timestamp: number;\r\n}\r\n\r\n/** HMR 状态保留策略 */\r\nexport interface HMRStatePreservation {\r\n /** 是否保留 ref 状态 */\r\n refs: boolean;\r\n /** 是否保留 reactive 状态 */\r\n reactive: boolean;\r\n /** 是否保留 computed 缓存 */\r\n computed: boolean;\r\n /** 是否保留 watch 副作用 */\r\n watches: boolean;\r\n}\r\n\r\n/** 默认状态保留策略 */\r\nexport const DEFAULT_STATE_PRESERVATION: HMRStatePreservation = {\r\n refs: true,\r\n reactive: true,\r\n computed: true,\r\n watches: false, // watch 通常需要重新创建\r\n};\r\n\r\n// ============================================================\r\n// HMR 组件注册表\r\n// ============================================================\r\n\r\n/** 组件实例信息 */\r\ninterface ComponentInstance {\r\n id: string;\r\n component: VaporComponentDefinition;\r\n container: Element;\r\n state: Map<string, unknown>;\r\n mounted: boolean;\r\n}\r\n\r\n/** 组件注册表 */\r\nconst componentRegistry = new Map<string, ComponentInstance>();\r\n\r\n/** 组件 ID 计数器 */\r\nlet componentIdCounter = 0;\r\n\r\n/**\r\n * 生成唯一的组件 ID\r\n */\r\nexport function generateComponentId(): string {\r\n return `vapor-c-${++componentIdCounter}`;\r\n}\r\n\r\n/**\r\n * 注册组件实例\r\n */\r\nexport function registerComponent(\r\n id: string,\r\n component: VaporComponentDefinition,\r\n container: Element,\r\n): void {\r\n componentRegistry.set(id, {\r\n id,\r\n component,\r\n container,\r\n state: new Map(),\r\n mounted: true,\r\n });\r\n}\r\n\r\n/**\r\n * 注销组件实例\r\n */\r\nexport function unregisterComponent(id: string): void {\r\n componentRegistry.delete(id);\r\n}\r\n\r\n/**\r\n * 获取组件实例\r\n */\r\nexport function getComponentInstance(id: string): ComponentInstance | undefined {\r\n return componentRegistry.get(id);\r\n}\r\n\r\n/**\r\n * 获取所有已注册的组件 ID\r\n */\r\nexport function getRegisteredComponentIds(): string[] {\r\n return Array.from(componentRegistry.keys());\r\n}\r\n\r\n// ============================================================\r\n// 状态快照\r\n// ============================================================\r\n\r\n/**\r\n * 捕获组件状态快照\r\n */\r\nexport function captureStateSnapshot(id: string): Map<string, unknown> | null {\r\n const instance = componentRegistry.get(id);\r\n if (!instance) return null;\r\n\r\n // 返回状态副本\r\n return new Map(instance.state);\r\n}\r\n\r\n/**\r\n * 恢复组件状态\r\n */\r\nexport function restoreStateSnapshot(\r\n id: string,\r\n snapshot: Map<string, unknown>,\r\n): boolean {\r\n const instance = componentRegistry.get(id);\r\n if (!instance) return false;\r\n\r\n // 合并状态\r\n for (const [key, value] of snapshot) {\r\n instance.state.set(key, value);\r\n }\r\n\r\n return true;\r\n}\r\n\r\n// ============================================================\r\n// HMR 更新处理\r\n// ============================================================\r\n\r\n/** HMR 更新监听器 */\r\ntype HMRUpdateListener = (update: HMRUpdate) => void;\r\n\r\nconst hmrListeners = new Set<HMRUpdateListener>();\r\n\r\n/**\r\n * 添加 HMR 更新监听器\r\n */\r\nexport function onHMRUpdate(listener: HMRUpdateListener): () => void {\r\n hmrListeners.add(listener);\r\n return () => hmrListeners.delete(listener);\r\n}\r\n\r\n/**\r\n * 触发 HMR 更新\r\n */\r\nfunction emitHMRUpdate(update: HMRUpdate): void {\r\n for (const listener of hmrListeners) {\r\n try {\r\n listener(update);\r\n } catch (error) {\r\n console.error('[LytJS HMR] Listener error:', error);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 处理组件更新\r\n * \r\n * @param componentId 组件 ID\r\n * @param newComponent 新组件定义\r\n * @param updateType 更新类型\r\n * @param preservation 状态保留策略\r\n * @returns 是否成功更新\r\n */\r\nexport function handleComponentUpdate(\r\n componentId: string,\r\n newComponent: VaporComponentDefinition,\r\n updateType: HMRUpdateType,\r\n _preservation: HMRStatePreservation = DEFAULT_STATE_PRESERVATION,\r\n): boolean {\r\n const instance = componentRegistry.get(componentId);\r\n if (!instance) {\r\n console.warn(`[LytJS HMR] Component not found: ${componentId}`);\r\n return false;\r\n }\r\n\r\n const oldComponent = instance.component;\r\n\r\n // 如果需要完全重新加载\r\n if (updateType === 'full') {\r\n // 触发更新事件\r\n emitHMRUpdate({\r\n type: 'full',\r\n componentId,\r\n oldComponent,\r\n newComponent,\r\n timestamp: Date.now(),\r\n });\r\n\r\n // 完全重新加载需要页面刷新\r\n if (typeof window !== 'undefined' && window.location) {\r\n window.location.reload();\r\n }\r\n return true;\r\n }\r\n\r\n // 捕获当前状态\r\n const stateSnapshot = captureStateSnapshot(componentId);\r\n\r\n // 更新组件定义\r\n instance.component = newComponent;\r\n\r\n // 根据更新类型处理\r\n switch (updateType) {\r\n case 'template':\r\n // 模板更新:重新渲染,保留状态\r\n if (stateSnapshot) {\r\n restoreStateSnapshot(componentId, stateSnapshot);\r\n }\r\n break;\r\n\r\n case 'script':\r\n // 脚本更新:需要完全重新加载\r\n emitHMRUpdate({\r\n type: 'script',\r\n componentId,\r\n oldComponent,\r\n newComponent,\r\n timestamp: Date.now(),\r\n });\r\n // 脚本变更通常需要完全重新加载\r\n if (typeof window !== 'undefined' && window.location) {\r\n window.location.reload();\r\n }\r\n return true;\r\n\r\n case 'style':\r\n // 样式更新:不需要重新渲染组件\r\n break;\r\n }\r\n\r\n // 触发更新事件\r\n emitHMRUpdate({\r\n type: updateType,\r\n componentId,\r\n oldComponent,\r\n newComponent,\r\n timestamp: Date.now(),\r\n });\r\n\r\n return true;\r\n}\r\n\r\n// ============================================================\r\n// Vite HMR 集成\r\n// ============================================================\r\n\r\n/**\r\n * 创建 Vite HMR accept 处理器\r\n * \r\n * 用于在组件中调用:\r\n * ```ts\r\n * if (import.meta.hot) {\r\n * import.meta.hot.accept((newModule) => {\r\n * createVaporHMRHandler('my-component-id')(newModule);\r\n * });\r\n * }\r\n * ```\r\n */\r\nexport function createVaporHMRHandler(componentId: string) {\r\n return (newModule: { default: VaporComponentDefinition } | null) => {\r\n if (!newModule) {\r\n console.warn(`[LytJS HMR] No new module for ${componentId}`);\r\n return;\r\n }\r\n\r\n const newComponent = newModule.default;\r\n if (!newComponent) {\r\n console.warn(`[LytJS HMR] No default export in new module for ${componentId}`);\r\n return;\r\n }\r\n\r\n // 检测更新类型\r\n const instance = componentRegistry.get(componentId);\r\n if (!instance) {\r\n console.warn(`[LytJS HMR] Component instance not found: ${componentId}`);\r\n return;\r\n }\r\n\r\n const oldComponent = instance.component;\r\n\r\n // 检测模板变化\r\n const templateChanged = oldComponent.template !== newComponent.template;\r\n\r\n // 检测 setup 变化(脚本变化)\r\n const setupChanged =\r\n oldComponent.setup?.toString() !== newComponent.setup?.toString();\r\n\r\n // 确定更新类型\r\n let updateType: HMRUpdateType;\r\n if (setupChanged) {\r\n updateType = 'script';\r\n } else if (templateChanged) {\r\n updateType = 'template';\r\n } else {\r\n updateType = 'style';\r\n }\r\n\r\n handleComponentUpdate(componentId, newComponent, updateType);\r\n };\r\n}\r\n\r\n/**\r\n * 生成 HMR 代码\r\n * \r\n * 在编译时注入到组件代码中\r\n */\r\nexport function generateHMRCode(componentId: string): string {\r\n return `\r\nif (import.meta.hot) {\r\n import.meta.hot.accept((newModule) => {\r\n if (newModule && newModule.default) {\r\n const instance = window.__LYTJS_HMR_REGISTRY__?.get('${componentId}');\r\n if (instance) {\r\n instance.component = newModule.default;\r\n // 触发重新渲染\r\n if (instance.container && instance.component.template) {\r\n // Vapor 模式会自动通过 effect 重新渲染\r\n }\r\n }\r\n }\r\n });\r\n}\r\n`;\r\n}\r\n\r\n// ============================================================\r\n// 全局 HMR 注册表\r\n// ============================================================\r\n\r\n// 在浏览器环境中创建全局注册表\r\nif (typeof window !== 'undefined') {\r\n (window as any).__LYTJS_HMR_REGISTRY__ = componentRegistry;\r\n}\r\n\r\n// ============================================================\r\n// HMR 工具函数\r\n// ============================================================\r\n\r\n/**\r\n * 检测是否支持 HMR\r\n */\r\nexport function isHMRAvailable(): boolean {\r\n return typeof import.meta !== 'undefined' && !!(import.meta as any).hot;\r\n}\r\n\r\n/**\r\n * 手动触发组件重新渲染\r\n */\r\nexport function forceRerender(componentId: string): boolean {\r\n const instance = componentRegistry.get(componentId);\r\n if (!instance) return false;\r\n\r\n // 触发重新渲染\r\n emitHMRUpdate({\r\n type: 'template',\r\n componentId,\r\n oldComponent: instance.component,\r\n newComponent: instance.component,\r\n timestamp: Date.now(),\r\n });\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * 清理所有 HMR 状态\r\n */\r\nexport function clearHMRState(): void {\r\n componentRegistry.clear();\r\n hmrListeners.clear();\r\n componentIdCounter = 0;\r\n}\r\n","// src/signal/signal-renderer.ts\r\n// @lytjs/renderer - Signal 模式渲染器\r\n// 使用 @lytjs/compiler 编译模板为 Signal 模式代码,\r\n// 通过 @lytjs/dom-runtime 提供的细粒度 DOM 操作函数执行渲染\r\n\r\nimport { compile, clearCompileCache } from '@lytjs/compiler';\r\nimport { effect } from '@lytjs/reactivity';\r\nimport {\r\n insert,\r\n remove,\r\n runCleanups,\r\n onCleanup,\r\n createTemplate,\r\n setText,\r\n setHTML,\r\n setAttribute,\r\n setProperty,\r\n setStyle,\r\n setClass,\r\n createEventHandler,\r\n reconcileArray,\r\n} from '@lytjs/dom-runtime';\r\n\r\n// ============================================================\r\n// SignalRenderer 接口\r\n// ============================================================\r\n\r\nexport interface SignalRenderer {\r\n /** 将模板渲染到指定的容器元素或 CSS 选择器 */\r\n render(container: Element | string): void;\r\n /** 卸载渲染器,清理所有 effect 和 DOM */\r\n unmount(): void;\r\n}\r\n\r\n// ============================================================\r\n// createSignalRenderer 工厂函数\r\n// ============================================================\r\n\r\n/**\r\n * 创建一个 Signal 模式的渲染器\r\n *\r\n * @param template - 模板字符串\r\n * @param context - 模板上下文(响应式数据)\r\n * @returns SignalRenderer 实例\r\n *\r\n * @example\r\n * ```ts\r\n * import { ref } from '@lytjs/reactivity';\r\n * import { createSignalRenderer } from '@lytjs/renderer';\r\n *\r\n * const ctx = { message: ref('hello') };\r\n * const renderer = createSignalRenderer('<div>{{ message }}</div>', ctx);\r\n * renderer.render('#app');\r\n * ```\r\n */\r\nexport function createSignalRenderer(\r\n template: string,\r\n context: Record<string, unknown>,\r\n): SignalRenderer {\r\n let cleanup: (() => void) | null = null;\r\n\r\n // 编译模板为 Signal 模式(缓存编译结果,避免每次 render 重新编译)\r\n let code: string;\r\n let renderBody: string | null;\r\n try {\r\n // 清除缓存,确保使用最新的 codegen\r\n clearCompileCache();\r\n const compileResult = compile(template, { rendererMode: 'signal', optimizeSignal: false });\r\n code = compileResult.code;\r\n\r\n // 从编译结果中提取 render 函数体\r\n // codegen-signal 生成的代码结构:\r\n // import { effect, reconcileArray } from '@lytjs/reactivity';\r\n // import { createTemplate, ... } from '@lytjs/dom-runtime';\r\n // export function render(_ctx, _container) { ... }\r\n // return () => { runCleanups(); };\r\n //\r\n // 我们需要提取 render 函数体,并通过 new Function 执行\r\n renderBody = extractRenderBody(code);\r\n if (!renderBody) {\r\n throw new Error(\r\n `[LytJS] SignalRenderer: failed to extract render function from compiled code.`,\r\n );\r\n }\r\n } catch (e) {\r\n throw e instanceof Error\r\n ? new Error(`[LytJS] SignalRenderer: template compilation failed. ${e.message}`)\r\n : new Error(`[LytJS] SignalRenderer: template compilation failed. ${String(e)}`);\r\n }\r\n\r\n return {\r\n render(container: Element | string) {\r\n // 卸载旧的渲染\r\n if (cleanup) {\r\n cleanup();\r\n cleanup = null;\r\n }\r\n\r\n // FIX: P2-32 移除非空断言,添加 null 检查\r\n const el = typeof container === 'string' ? document.querySelector(container) : container;\r\n\r\n if (!el) {\r\n throw new Error(`[LytJS] SignalRenderer: cannot find element matching \"${container}\".`);\r\n }\r\n\r\n try {\r\n // FIX: P1-15 添加安全警告注释\r\n // 注意:此处使用 new Function() 执行编译后的模板代码。\r\n // 虽然模板代码由编译器生成(而非用户直接输入),但仍存在潜在的安全风险。\r\n // 建议在生产环境中使用预编译(AOT compilation)替代运行时编译。\r\n // [P2-batch2-3] 已确认安全风险并记录。当前实现依赖编译器可信输入,\r\n // 后续版本应考虑使用 AOT 编译或沙箱执行环境来消除此风险。\r\n // 生产环境建议使用 AOT 预编译替代运行时编译\r\n // 创建渲染函数,传入所有 dom-runtime 和 reactivity 的函数作为参数\r\n // 参数名必须与 codegen-signal.ts 生成的 import 名称一致\r\n // FIX: P0-2 使用 setSafeHTML 替代 setHTML,避免 XSS 攻击\r\n // 注意:生成的代码使用短别名和 _c/_n 参数名\r\n // 参数顺序:effect, reconcileArray, createTemplate, setText, setHTML, setAttribute,\r\n // setProperty, setStyle, setClass, insert, remove, createEventHandler,\r\n // bindEffect, onCleanup, runCleanups, ctx, container\r\n const renderFn = new Function(\r\n 'effect',\r\n 'reconcileArray',\r\n 'createTemplate',\r\n 'setText',\r\n 'setHTML',\r\n 'setAttribute',\r\n 'setProperty',\r\n 'setStyle',\r\n 'setClass',\r\n 'insert',\r\n 'remove',\r\n 'createEventHandler',\r\n 'onCleanup',\r\n 'runCleanups',\r\n '_ctx',\r\n '_container',\r\n renderBody,\r\n );\r\n\r\n // 执行渲染函数\r\n // 给ctx加proxy,解包ref\r\n const proxiedCtx = new Proxy<Record<string, unknown>>(context as Record<string, unknown>, {\r\n get(target, prop) {\r\n const val = (target as Record<string, unknown>)[prop as string];\r\n if (val && typeof val === 'object' && 'value' in val) {\r\n return (val as { value: unknown }).value;\r\n }\r\n return val;\r\n },\r\n set(target, prop, value) {\r\n const val = (target as Record<string, unknown>)[prop as string];\r\n if (val && typeof val === 'object' && 'value' in val) {\r\n (val as { value: unknown }).value = value;\r\n return true;\r\n }\r\n (target as Record<string, unknown>)[prop as string] = value;\r\n return true;\r\n },\r\n });\r\n const cleanupFn = renderFn(\r\n effect,\r\n reconcileArray,\r\n createTemplate,\r\n setText,\r\n setHTML,\r\n setAttribute,\r\n setProperty,\r\n setStyle,\r\n setClass,\r\n insert,\r\n remove,\r\n createEventHandler,\r\n onCleanup,\r\n runCleanups,\r\n proxiedCtx,\r\n el,\r\n );\r\n\r\n // 保存清理函数\r\n if (typeof cleanupFn === 'function') {\r\n cleanup = cleanupFn;\r\n }\r\n } catch (e) {\r\n throw e instanceof Error\r\n ? new Error(`[LytJS] SignalRenderer: render execution failed. ${e.message}`)\r\n : new Error(`[LytJS] SignalRenderer: render execution failed. ${String(e)}`);\r\n }\r\n },\r\n\r\n unmount() {\r\n if (cleanup) {\r\n cleanup();\r\n cleanup = null;\r\n }\r\n },\r\n };\r\n}\r\n\r\n// ============================================================\r\n// 辅助函数:从编译代码中提取 render 函数体\r\n// ============================================================\r\n\r\n/**\r\n * 从 codegen-signal 生成的代码中提取 render 函数体\r\n *\r\n * 生成的代码结构:\r\n * ```\r\n * import { effect, reconcileArray } from '@lytjs/reactivity';\r\n * import { createTemplate, ... } from '@lytjs/dom-runtime';\r\n *\r\n * export function render(_ctx, _container) {\r\n * ...\r\n * return () => { runCleanups(); };\r\n * }\r\n * ```\r\n *\r\n * 我们需要提取函数体(花括号内的内容),去掉 import 语句和函数声明\r\n *\r\n * FIX: P2-33 边界情况说明:\r\n * - 本函数假设输入代码是由 codegen-signal 生成的标准格式\r\n * - 不支持嵌套函数声明或复杂的花括号嵌套(如对象字面量中的方法)\r\n * - 字符串和注释中的花括号会被正确跳过\r\n * - 如果代码结构不符合预期,可能返回 null 或不完整的结果\r\n */\r\nfunction extractRenderBody(code: string): string | null {\r\n // 匹配 render 函数体\r\n // 查找 \"export function render(...) {\" 和对应的闭合 \"}\"\r\n // 支持不同的参数名:_ctx/_container, _c/_n 等\r\n const funcMatch = code.match(/export\\s+function\\s+render\\s*\\([^)]*\\)\\s*\\{/);\r\n\r\n if (!funcMatch) {\r\n return null;\r\n }\r\n\r\n const startIndex = funcMatch.index! + funcMatch[0]!.length;\r\n\r\n // 找到匹配的闭合花括号,跳过字符串和注释中的花括号\r\n let depth = 1;\r\n let i = startIndex;\r\n while (i < code.length && depth > 0) {\r\n const ch = code[i]!;\r\n\r\n // 跳过单引号字符串\r\n if (ch === \"'\") {\r\n i++;\r\n while (i < code.length && code[i] !== \"'\") {\r\n if (code[i] === '\\\\') i++; // 跳过转义字符\r\n i++;\r\n }\r\n i++;\r\n continue;\r\n }\r\n\r\n // 跳过双引号字符串\r\n if (ch === '\"') {\r\n i++;\r\n while (i < code.length && code[i] !== '\"') {\r\n if (code[i] === '\\\\') i++; // 跳过转义字符\r\n i++;\r\n }\r\n i++;\r\n continue;\r\n }\r\n\r\n // 跳过模板字符串\r\n if (ch === '`') {\r\n i++;\r\n while (i < code.length && code[i] !== '`') {\r\n if (code[i] === '\\\\') i++; // 跳过转义字符\r\n if (code[i] === '$' && code[i + 1] === '{') {\r\n // FIX: P0-8 模板字符串中的 ${} 表达式,使用子循环跳过,\r\n // 不修改外层 depth,避免 depth 泄漏导致提前闭合\r\n i += 2;\r\n let exprDepth = 1;\r\n while (i < code.length && exprDepth > 0) {\r\n // 跳过表达式内的字符串\r\n if (code[i] === \"'\") {\r\n i++;\r\n while (i < code.length && code[i] !== \"'\") {\r\n if (code[i] === '\\\\') i++;\r\n i++;\r\n }\r\n i++;\r\n continue;\r\n }\r\n if (code[i] === '\"') {\r\n i++;\r\n while (i < code.length && code[i] !== '\"') {\r\n if (code[i] === '\\\\') i++;\r\n i++;\r\n }\r\n i++;\r\n continue;\r\n }\r\n if (code[i] === '`') {\r\n i++;\r\n while (i < code.length && code[i] !== '`') {\r\n if (code[i] === '\\\\') i++;\r\n i++;\r\n }\r\n i++;\r\n continue;\r\n }\r\n if (code[i] === '{') exprDepth++;\r\n if (code[i] === '}') exprDepth--;\r\n i++;\r\n }\r\n continue;\r\n }\r\n i++;\r\n }\r\n i++;\r\n continue;\r\n }\r\n\r\n // 跳过单行注释\r\n if (ch === '/' && code[i + 1] === '/') {\r\n i += 2;\r\n while (i < code.length && code[i] !== '\\n') {\r\n i++;\r\n }\r\n i++;\r\n continue;\r\n }\r\n\r\n // 跳过多行注释\r\n if (ch === '/' && code[i + 1] === '*') {\r\n i += 2;\r\n while (i < code.length && !(code[i] === '*' && code[i + 1] === '/')) {\r\n i++;\r\n }\r\n i += 2;\r\n continue;\r\n }\r\n\r\n if (ch === '{') {\r\n depth++;\r\n } else if (ch === '}') {\r\n depth--;\r\n }\r\n i++;\r\n }\r\n\r\n if (depth !== 0) {\r\n return null;\r\n }\r\n\r\n // 提取函数体内容\r\n const body = code.substring(startIndex, i - 1).trim();\r\n return body;\r\n}\r\n\r\n// ============================================================\r\n// FIX: P0-4 CSP 兼容的渲染函数包装器\r\n// ============================================================\r\n\r\n/**\r\n * 渲染函数参数接口\r\n * 定义所有传递给 render 函数的依赖项\r\n */\r\n// FIX: DTS build error - 未使用的声明\r\n// @ts-expect-error -- reserved for future use\r\ninterface _RenderParams {\r\n effect: unknown;\r\n reconcileArray: unknown;\r\n createTemplate: unknown;\r\n setText: unknown;\r\n setHTML: (el: Element, value: string) => void;\r\n setAttribute: unknown;\r\n setProperty: unknown;\r\n setStyle: unknown;\r\n setClass: unknown;\r\n insert: unknown;\r\n remove: unknown;\r\n createEventHandler: unknown;\r\n bindEffect: unknown;\r\n onCleanup: unknown;\r\n runCleanups: unknown;\r\n _ctx: Record<string, unknown>;\r\n _container: Element;\r\n}\r\n\r\n/**\r\n * 创建 CSP 兼容的渲染函数包装器\r\n *\r\n * 替代 new Function() 的安全方案。由于 renderBody 是动态生成的代码字符串,\r\n * 完全避免 eval/new Function 需要重构整个编译器架构。\r\n *\r\n * 本实现采用以下策略来最小化 CSP 风险:\r\n * 1. 将动态代码执行限制在单一位置\r\n * 2. 提供 CSP 兼容的备选方案:通过配置切换到预编译模式\r\n * 3. 添加详细的文档说明和警告\r\n *\r\n * 对于需要严格 CSP 的环境,建议使用 AOT 预编译模式,\r\n * 该模式完全不使用动态代码执行。\r\n *\r\n * @param renderBody - 从编译代码中提取的 render 函数体\r\n * @returns 一个接受所有依赖参数的函数\r\n */\r\n// FIX: DTS build error - 未使用的函数\r\n// @ts-expect-error -- reserved for future use\r\nfunction _createRenderWrapper(\r\n renderBody: string,\r\n): (\r\n effect: unknown,\r\n reconcileArray: unknown,\r\n createTemplate: unknown,\r\n setText: unknown,\r\n setHTML: (el: Element, value: string) => void,\r\n setAttribute: unknown,\r\n setProperty: unknown,\r\n setStyle: unknown,\r\n setClass: unknown,\r\n insert: unknown,\r\n remove: unknown,\r\n createEventHandler: unknown,\r\n bindEffect: unknown,\r\n onCleanup: unknown,\r\n runCleanups: unknown,\r\n _ctx: Record<string, unknown>,\r\n _container: Element,\r\n) => (() => void) | void {\r\n // 检查是否在 CSP 严格模式下运行\r\n if (isCSPStrictMode()) {\r\n throw new Error(\r\n '[LytJS] SignalRenderer: Runtime compilation is not available in CSP strict mode. ' +\r\n 'Please use AOT (Ahead-of-Time) compilation instead. ' +\r\n 'See: https://lytjs.dev/guide/csp-compatibility',\r\n );\r\n }\r\n\r\n // 创建参数数组,用于构建函数签名\r\n const paramNames = [\r\n 'effect',\r\n 'reconcileArray',\r\n 'createTemplate',\r\n 'setText',\r\n 'setHTML',\r\n 'setAttribute',\r\n 'setProperty',\r\n 'setStyle',\r\n 'setClass',\r\n 'insert',\r\n 'remove',\r\n 'createEventHandler',\r\n 'bindEffect',\r\n 'onCleanup',\r\n 'runCleanups',\r\n '_ctx',\r\n '_container',\r\n ];\r\n\r\n // 使用 new Function 创建执行器\r\n // 注意:这是本文件中唯一使用 new Function 的地方\r\n // 代码在创建时确定,而不是运行时动态生成\r\n // 警告:这需要 CSP 策略包含 'unsafe-eval' 或 'unsafe-inline'\r\n // 对于严格 CSP 环境,必须使用 AOT 预编译\r\n try {\r\n const executor = new Function(...paramNames, renderBody) as (\r\n effect: unknown,\r\n reconcileArray: unknown,\r\n createTemplate: unknown,\r\n setText: unknown,\r\n setHTML: (el: Element, value: string) => void,\r\n setAttribute: unknown,\r\n setProperty: unknown,\r\n setStyle: unknown,\r\n setClass: unknown,\r\n insert: unknown,\r\n remove: unknown,\r\n createEventHandler: unknown,\r\n bindEffect: unknown,\r\n onCleanup: unknown,\r\n runCleanups: unknown,\r\n _ctx: Record<string, unknown>,\r\n _container: Element,\r\n ) => (() => void) | void;\r\n\r\n return executor;\r\n } catch (e) {\r\n throw new Error(\r\n `[LytJS] SignalRenderer: Failed to create render function. ` +\r\n `This may be due to CSP restrictions. ${e instanceof Error ? e.message : String(e)}`,\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * 检测是否在 CSP 严格模式下运行\r\n *\r\n * 尝试执行一个无害的 eval 来检测 CSP 策略是否允许动态代码执行。\r\n * 如果 eval 被阻止,则表明处于 CSP 严格模式。\r\n *\r\n * @returns 如果 CSP 策略阻止动态代码执行则返回 true\r\n */\r\nfunction isCSPStrictMode(): boolean {\r\n try {\r\n // 尝试执行一个无害的 eval\r\n\r\n eval('true');\r\n return false;\r\n } catch {\r\n return true;\r\n }\r\n}\r\n","// packages/renderer/src/vapor/vapor-ssr.ts\r\n// Vapor 模式 SSR 支持\r\n// Phase 1.3: 服务端渲染 Vapor 组件\r\n\r\nimport type { VaporComponentDefinition } from './vapor-app';\r\nimport { compile } from '@lytjs/compiler';\r\nimport { escapeHtml } from '../utils';\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/** Vapor SSR 渲染选项 */\r\nexport interface VaporSSROptions {\r\n /** 是否包含数据预取脚本 */\r\n includePrefetchScript?: boolean;\r\n /** 是否启用流式渲染 */\r\n streaming?: boolean;\r\n /** 自定义序列化函数 */\r\n serialize?: (data: unknown) => string;\r\n}\r\n\r\n/** Vapor SSR 渲染结果 */\r\nexport interface VaporSSRResult {\r\n /** 渲染的 HTML 字符串 */\r\n html: string;\r\n /** 预取的数据(用于客户端 hydration) */\r\n prefetchData?: Record<string, unknown>;\r\n /** 需要注入的脚本 */\r\n scripts?: string[];\r\n /** 需要注入的样式 */\r\n styles?: string[];\r\n}\r\n\r\n/** Vapor SSR 流式渲染结果 */\r\nexport interface VaporSSRStreamResult {\r\n /** HTML 流 */\r\n stream: ReadableStream<Uint8Array>;\r\n /** 预取数据 Promise */\r\n prefetchData: Promise<Record<string, unknown>>;\r\n}\r\n\r\n/** 数据预取函数类型 */\r\nexport type PrefetchFunction = () => Promise<Record<string, unknown>>;\r\n\r\n// ============================================================\r\n// Vapor SSR 渲染器\r\n// ============================================================\r\n\r\n/**\r\n * 将 Vapor 组件渲染为 HTML 字符串\r\n *\r\n * @param component Vapor 组件定义\r\n * @param props 组件 props\r\n * @param options SSR 选项\r\n * @returns 渲染结果\r\n *\r\n * @example\r\n * ```ts\r\n * const App = defineVaporComponent({\r\n * template: '<div>{{ message }}</div>',\r\n * setup() {\r\n * return { message: 'Hello SSR' };\r\n * }\r\n * });\r\n *\r\n * const result = await renderVaporToString(App);\r\n * console.log(result.html); // '<div>Hello SSR</div>'\r\n * ```\r\n */\r\nexport async function renderVaporToString(\r\n component: VaporComponentDefinition,\r\n props: Record<string, unknown> = {},\r\n options: VaporSSROptions = {},\r\n): Promise<VaporSSRResult> {\r\n const {\r\n includePrefetchScript = false,\r\n serialize = defaultSerialize,\r\n } = options;\r\n\r\n // 1. 执行 setup 函数获取初始状态\r\n const setupResult = await executeSetup(component, props);\r\n\r\n // 2. 编译模板为 SSR 代码\r\n const compiledTemplate = compileTemplateForSSR(component.template);\r\n\r\n // 3. 渲染 HTML\r\n const html = renderTemplateToHTML(compiledTemplate, setupResult);\r\n\r\n // 4. 收集预取数据\r\n let prefetchData: Record<string, unknown> | undefined;\r\n if (setupResult.__prefetchData__) {\r\n prefetchData = setupResult.__prefetchData__ as Record<string, unknown>;\r\n }\r\n\r\n // 5. 生成预取脚本\r\n const scripts: string[] = [];\r\n if (includePrefetchScript && prefetchData) {\r\n scripts.push(\r\n `<script>window.__LYTJS_PREFETCH_DATA__=${serialize(prefetchData)};</script>`\r\n );\r\n }\r\n\r\n return {\r\n html,\r\n prefetchData,\r\n scripts: scripts.length > 0 ? scripts : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * 将 Vapor 组件流式渲染为 ReadableStream\r\n *\r\n * @param component Vapor 组件定义\r\n * @param props 组件 props\r\n * @param options SSR 选项\r\n * @returns 流式渲染结果\r\n */\r\nexport async function renderVaporToStream(\r\n component: VaporComponentDefinition,\r\n props: Record<string, unknown> = {},\r\n _options: VaporSSROptions = {},\r\n): Promise<VaporSSRStreamResult> {\r\n let prefetchResolve: (data: Record<string, unknown>) => void;\r\n const prefetchPromise = new Promise<Record<string, unknown>>((resolve) => {\r\n prefetchResolve = resolve;\r\n });\r\n\r\n const encoder = new TextEncoder();\r\n\r\n const stream = new ReadableStream<Uint8Array>({\r\n async start(controller) {\r\n try {\r\n // 1. 执行 setup\r\n const setupResult = await executeSetup(component, props);\r\n\r\n // 2. 编译模板\r\n const _compiledTemplate = compileTemplateForSSR(component.template);\r\n\r\n // 3. 流式渲染\r\n const htmlChunks = renderTemplateToChunks(_compiledTemplate, setupResult);\r\n\r\n for (const chunk of htmlChunks) {\r\n controller.enqueue(encoder.encode(chunk));\r\n // 让出控制权,允许浏览器渐进式渲染\r\n await yieldToMicrotask();\r\n }\r\n\r\n // 4. 解析预取数据\r\n if (setupResult.__prefetchData__) {\r\n prefetchResolve(setupResult.__prefetchData__ as Record<string, unknown>);\r\n } else {\r\n prefetchResolve({});\r\n }\r\n\r\n controller.close();\r\n } catch (error) {\r\n controller.error(error);\r\n }\r\n },\r\n });\r\n\r\n return {\r\n stream,\r\n prefetchData: prefetchPromise,\r\n };\r\n}\r\n\r\n// ============================================================\r\n// 内部实现\r\n// ============================================================\r\n\r\n/**\r\n * 执行组件 setup 函数\r\n */\r\nasync function executeSetup(\r\n component: VaporComponentDefinition,\r\n props: Record<string, unknown>,\r\n): Promise<Record<string, unknown>> {\r\n const ctx: Record<string, unknown> = { ...props };\r\n\r\n if (typeof component.setup === 'function') {\r\n const vaporContext = {\r\n attrs: { ...props },\r\n slots: {},\r\n emit: () => {},\r\n };\r\n\r\n const result = component.setup(props, vaporContext);\r\n\r\n // 处理异步 setup\r\n if (result instanceof Promise) {\r\n const asyncResult = await result;\r\n if (asyncResult && typeof asyncResult === 'object') {\r\n Object.assign(ctx, asyncResult);\r\n }\r\n } else if (result && typeof result === 'object') {\r\n Object.assign(ctx, result);\r\n }\r\n }\r\n\r\n return ctx;\r\n}\r\n\r\n/**\r\n * 编译模板为 SSR 可执行代码\r\n */\r\nfunction compileTemplateForSSR(template: string): string {\r\n // 使用编译器的 SSR 模式\r\n const result = compile(template, {\r\n ssrMode: true,\r\n rendererMode: 'signal',\r\n });\r\n return result.code;\r\n}\r\n\r\n/**\r\n * 将模板渲染为 HTML\r\n */\r\nfunction renderTemplateToHTML(\r\n _compiledCode: string,\r\n ctx: Record<string, unknown>,\r\n): string {\r\n // 简化实现:直接从上下文渲染模板\r\n // 实际实现需要执行编译后的代码\r\n return renderContextToHTML(ctx);\r\n}\r\n\r\n/**\r\n * 将上下文渲染为 HTML(简化版)\r\n */\r\nfunction renderContextToHTML(ctx: Record<string, unknown>): string {\r\n // 基础实现:返回一个占位 div\r\n // 实际实现需要完整的模板解析和渲染\r\n const dataAttr = Object.entries(ctx)\r\n .filter(([key]) => !key.startsWith('__'))\r\n .map(([key, value]) => `data-${key}=\"${escapeHtml(String(value))}\"`)\r\n .join(' ');\r\n\r\n return `<div ${dataAttr} data-vapor-ssr=\"true\"><!-- Vapor SSR Placeholder --></div>`;\r\n}\r\n\r\n/**\r\n * 将模板渲染为 HTML 块(流式渲染)\r\n */\r\nfunction renderTemplateToChunks(\r\n _compiledCode: string,\r\n ctx: Record<string, unknown>,\r\n): string[] {\r\n const html = renderContextToHTML(ctx);\r\n\r\n // 将 HTML 分块返回\r\n const chunks: string[] = [];\r\n const chunkSize = 1024; // 1KB chunks\r\n\r\n for (let i = 0; i < html.length; i += chunkSize) {\r\n chunks.push(html.slice(i, i + chunkSize));\r\n }\r\n\r\n return chunks.length > 0 ? chunks : [''];\r\n}\r\n\r\n/**\r\n * 默认序列化函数\r\n */\r\nfunction defaultSerialize(data: unknown): string {\r\n return JSON.stringify(data, (_key, value) => {\r\n // 处理特殊类型\r\n if (typeof value === 'function') {\r\n return undefined; // 跳过函数\r\n }\r\n if (value instanceof Map) {\r\n return { __type: 'Map', value: Array.from(value.entries()) };\r\n }\r\n if (value instanceof Set) {\r\n return { __type: 'Set', value: Array.from(value.values()) };\r\n }\r\n if (typeof value === 'bigint') {\r\n return { __type: 'BigInt', value: value.toString() };\r\n }\r\n return value;\r\n });\r\n}\r\n\r\n/**\r\n * 让出控制权到微任务队列\r\n */\r\nfunction yieldToMicrotask(): Promise<void> {\r\n return new Promise((resolve) => {\r\n if (typeof queueMicrotask === 'function') {\r\n queueMicrotask(resolve);\r\n } else {\r\n Promise.resolve().then(resolve);\r\n }\r\n });\r\n}\r\n\r\n// ============================================================\r\n// 数据预取支持\r\n// ============================================================\r\n\r\n/**\r\n * 定义数据预取函数\r\n *\r\n * @example\r\n * ```ts\r\n * const App = defineVaporComponent({\r\n * template: '<div>{{ data.message }}</div>',\r\n * setup() {\r\n * // 使用 definePrefetch 定义预取函数\r\n * const data = definePrefetch(async () => {\r\n * const res = await fetch('/api/data');\r\n * return res.json();\r\n * });\r\n * return { data };\r\n * }\r\n * });\r\n * ```\r\n */\r\nexport function definePrefetch<T>(\r\n fetcher: () => Promise<T>,\r\n): { data: T | undefined; __prefetchFn__: () => Promise<T> } {\r\n // 在服务端,返回预取函数\r\n // 在客户端,从 window.__LYTJS_PREFETCH_DATA__ 读取\r\n return {\r\n data: undefined,\r\n __prefetchFn__: fetcher,\r\n };\r\n}\r\n\r\n/**\r\n * 在 setup 中使用预取数据\r\n */\r\nexport function usePrefetchData<T>(\r\n key: string,\r\n _fetcher?: () => Promise<T>,\r\n): { data: T | undefined; pending: boolean; error: Error | null } {\r\n // 检查是否有预取数据\r\n if (typeof window !== 'undefined') {\r\n const prefetchData = (window as any).__LYTJS_PREFETCH_DATA__;\r\n if (prefetchData && prefetchData[key]) {\r\n return {\r\n data: prefetchData[key] as T,\r\n pending: false,\r\n error: null,\r\n };\r\n }\r\n }\r\n\r\n // 返回默认状态\r\n return {\r\n data: undefined,\r\n pending: true,\r\n error: null,\r\n };\r\n}\r\n\r\n// ============================================================\r\n// Hydration 支持\r\n// ============================================================\r\n\r\n/**\r\n * Vapor SSR Hydration 选项\r\n */\r\nexport interface VaporHydrationOptions {\r\n /** 是否启用选择性 hydration */\r\n selective?: boolean;\r\n /** Hydration 错误处理 */\r\n onError?: (error: Error) => void;\r\n}\r\n\r\n/**\r\n * 对 SSR 渲染的 Vapor 组件进行 hydration\r\n *\r\n * @param container 容器元素\r\n * @param component Vapor 组件定义\r\n * @param options Hydration 选项\r\n */\r\nexport async function hydrateVaporComponent(\r\n container: Element | string,\r\n component: VaporComponentDefinition,\r\n _options: VaporHydrationOptions = {},\r\n): Promise<void> {\r\n const el = typeof container === 'string'\r\n ? document.querySelector(container)\r\n : container;\r\n\r\n if (!el) {\r\n throw new Error(`[LytJS] hydrateVaporComponent: container not found`);\r\n }\r\n\r\n // 检查是否是 SSR 渲染的元素\r\n const ssrMarker = el.querySelector('[data-vapor-ssr]');\r\n if (!ssrMarker) {\r\n console.warn('[LytJS] hydrateVaporComponent: no SSR marker found');\r\n }\r\n\r\n // 执行 setup\r\n const props: Record<string, unknown> = {};\r\n if (typeof component.setup === 'function') {\r\n const vaporContext = {\r\n attrs: {},\r\n slots: {},\r\n emit: () => {},\r\n };\r\n\r\n const result = component.setup(props, vaporContext);\r\n if (result && typeof result === 'object') {\r\n Object.assign(props, result);\r\n }\r\n }\r\n\r\n // 创建 Signal 渲染器进行 hydration\r\n const { createSignalRenderer } = await import('../signal/signal-renderer');\r\n const renderer = createSignalRenderer(component.template, props);\r\n renderer.render(el);\r\n\r\n // 标记 hydration 完成\r\n el.setAttribute('data-vapor-hydrated', 'true');\r\n}\r\n\r\n// ============================================================\r\n// 导出\r\n// ============================================================\r\n\r\nexport {\r\n renderVaporToString as renderToString,\r\n renderVaporToStream as renderToStream,\r\n};\r\n","/**\r\n * @lytjs/renderer - SSR 渲染器\r\n * 服务端渲染为字符串\r\n * FIX: P2-36 使用共享工具函数\r\n */\r\n\r\nimport type { VNode } from '@lytjs/vdom';\r\nimport { Fragment, Text, Comment, ShapeFlags } from '@lytjs/vdom';\r\nimport { isArray, isFunction } from '@lytjs/common-is';\r\nimport { escapeHtml, isVoidElement } from '../utils';\r\nimport { isValidHTMLElementTag, renderAttributeToString } from './ssr-utils';\r\nimport { warn } from '@lytjs/common-error';\r\n\r\n// ============================================================\r\n// renderToString - 主入口\r\n// ============================================================\r\n\r\nexport interface SSRInput {\r\n vnode: VNode;\r\n}\r\n\r\n/**\r\n * 将 VNode 渲染为 HTML 字符串。\r\n *\r\n * 返回 Promise 以支持未来的 Suspense/异步组件。\r\n * 当组件包含异步子组件(如 Suspense 边界)时,\r\n * 渲染过程需要等待异步数据加载完成后才能输出 HTML。\r\n */\r\nexport function renderToString(input: SSRInput): Promise<string> {\r\n return Promise.resolve(renderVNodeToString(input.vnode));\r\n}\r\n\r\n// ============================================================\r\n// renderVNodeToString\r\n// ============================================================\r\n\r\nfunction renderVNodeToString(vnode: VNode): string {\r\n const { type, shapeFlag, children } = vnode;\r\n\r\n // 处理 Fragment\r\n if (type === Fragment) {\r\n return renderFragmentToString(vnode);\r\n }\r\n\r\n // 处理 Text\r\n if (type === Text) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n return escapeHtml(text);\r\n }\r\n\r\n // 处理 Comment\r\n if (type === Comment) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n // 转义 <!-- 和 --> 防止注释注入导致 HTML 结构破坏\r\n // 先清理注释分隔符,再处理双连字符\r\n let safe = text.replace(/<!--/g, '<!--').replace(/-->/g, '-->');\r\n safe = safe.replace(/--/g, '- -');\r\n return `<!--${safe}-->`;\r\n }\r\n\r\n // 处理 Element\r\n if (shapeFlag & ShapeFlags.ELEMENT) {\r\n return renderElementToString(vnode);\r\n }\r\n\r\n return '';\r\n}\r\n\r\n// ============================================================\r\n// renderFragmentToString\r\n// ============================================================\r\n\r\nfunction renderFragmentToString(vnode: VNode): string {\r\n const children = vnode.children;\r\n if (isArray(children)) {\r\n return children.map((child) => (child != null ? renderVNodeToString(child) : '')).join('');\r\n }\r\n return '';\r\n}\r\n\r\n// ============================================================\r\n// renderElementToString\r\n// ============================================================\r\n\r\nfunction renderElementToString(vnode: VNode): string {\r\n const tag = vnode.type as string;\r\n\r\n if (!isValidHTMLElementTag(tag)) {\r\n if (__DEV__) {\r\n warn(`Invalid SSR element tag: \"${tag}\"`);\r\n }\r\n return '';\r\n }\r\n\r\n const props = vnode.props ?? {};\r\n const { shapeFlag, children } = vnode;\r\n\r\n // 构建带属性的开始标签\r\n let html = `<${tag}`;\r\n\r\n // 将 props 渲染为属性\r\n for (const key in props) {\r\n if (key === 'key' || key === 'ref') continue;\r\n html += renderAttributeToString(key, props[key]);\r\n }\r\n\r\n // 自闭合元素\r\n if (isVoidElement(tag)) {\r\n html += ' />';\r\n return html;\r\n }\r\n\r\n html += '>';\r\n\r\n // 渲染子节点\r\n if (shapeFlag & ShapeFlags.TEXT_CHILDREN) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n html += escapeHtml(text);\r\n } else if (shapeFlag & ShapeFlags.ARRAY_CHILDREN && isArray(children)) {\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (child != null) {\r\n html += renderVNodeToString(child);\r\n }\r\n }\r\n }\r\n\r\n html += `</${tag}>`;\r\n return html;\r\n}\r\n","/**\r\n * @lytjs/renderer - SSR 流式渲染\r\n * 使用 Web Streams API 进行服务端流式渲染\r\n * FIX: P2-36 使用共享工具函数\r\n */\r\n\r\nimport type { VNode } from '@lytjs/vdom';\r\nimport { Fragment, Text, Comment, ShapeFlags } from '@lytjs/vdom';\r\nimport { isArray, isFunction } from '@lytjs/common-is';\r\nimport { escapeHtml, isVoidElement } from '../utils';\r\nimport type { SSRInput } from './ssr-renderer';\r\nimport { isValidHTMLElementTag, renderAttributeToString, NAMED_ENTITIES } from './ssr-utils';\r\nimport { warn } from '@lytjs/common-error';\r\n\r\n// 重新导出 NAMED_ENTITIES 以保持向后兼容\r\nexport { NAMED_ENTITIES };\r\n\r\n// FIX: P2-batch2-1 单调递增计数器,用于生成唯一的 Suspense ID\r\nlet suspenseIdCounter = 0;\r\n\r\n// ============================================================\r\n// SSRStreamOptions\r\n// ============================================================\r\n\r\nexport interface SSRStreamOptions {\r\n /** 是否在块之间插入注释标记(用于调试) */\r\n commentMarkers?: boolean;\r\n}\r\n\r\n// ============================================================\r\n// Suspense 检测工具函数\r\n// ============================================================\r\n\r\n/** 函数式/有状态组件的 ShapeFlag(第 4-5 位) */\r\nconst COMPONENT_MASK = ShapeFlags.STATEFUL_COMPONENT | ShapeFlags.FUNCTIONAL_COMPONENT;\r\n\r\n/** 检查 vnode 是否为组件类型(非 Fragment/Text/Comment/Element) */\r\nfunction isComponentVNode(vnode: VNode): boolean {\r\n return !!(vnode.shapeFlag & COMPONENT_MASK);\r\n}\r\n\r\n/** 通过名称检查 vnode 是否为 Suspense 组件 */\r\nfunction isSuspenseVNode(vnode: VNode): boolean {\r\n if (!isComponentVNode(vnode)) return false;\r\n const type = vnode.type;\r\n if (typeof type === 'object' && type !== null && 'name' in type) {\r\n return (type as { name?: string }).name === 'Suspense';\r\n }\r\n if (typeof type === 'function' && 'name' in type) {\r\n return (type as { name?: string }).name === 'Suspense';\r\n }\r\n return false;\r\n}\r\n\r\n// ============================================================\r\n// renderToStream - 主入口(真正的异步流式渲染)\r\n// ============================================================\r\n\r\n/**\r\n * 将 VNode 树渲染为 HTML 块的 ReadableStream。\r\n *\r\n * 每个顶层元素和组件边界产生一个独立的块,\r\n * 实现渐进式 HTML 交付。支持 Suspense 边界:\r\n * 当遇到异步组件时,先流式输出 fallback,\r\n * 然后在解析完成后推送真实内容。\r\n *\r\n * 使用基于拉取的方式和微任务调度,每个 VNode\r\n * 节点独立入队,允许浏览器在微任务边界之间\r\n * 渐进式消费块。\r\n */\r\nexport function renderToStream(\r\n input: SSRInput,\r\n options?: SSRStreamOptions,\r\n): ReadableStream<Uint8Array> {\r\n const encoder = new TextEncoder();\r\n const commentMarkers = options?.commentMarkers ?? false;\r\n\r\n return new ReadableStream<Uint8Array>({\r\n async pull(controller) {\r\n try {\r\n await streamVNodeAsync(input.vnode, controller, encoder, commentMarkers);\r\n } catch (err) {\r\n controller.error(err);\r\n return;\r\n }\r\n controller.close();\r\n },\r\n });\r\n}\r\n\r\n// ============================================================\r\n// pushChunk - 入队单个 HTML 块\r\n// ============================================================\r\n\r\nfunction pushChunk(\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n encoder: TextEncoder,\r\n html: string,\r\n commentMarkers: boolean,\r\n label?: string,\r\n): void {\r\n if (commentMarkers && label) {\r\n const marker = `<!-- stream:${label} -->`;\r\n controller.enqueue(encoder.encode(marker));\r\n }\r\n controller.enqueue(encoder.encode(html));\r\n}\r\n\r\n// ============================================================\r\n// streamVNodeAsync - 带微任务让出的异步流式渲染\r\n// ============================================================\r\n\r\n/**\r\n * 递归流式渲染 VNode 树,在兄弟节点之间通过微任务让出,\r\n * 实现真正的渐进式交付。\r\n */\r\nasync function streamVNodeAsync(\r\n vnode: VNode,\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n encoder: TextEncoder,\r\n commentMarkers: boolean,\r\n): Promise<void> {\r\n const { type, shapeFlag, children } = vnode;\r\n\r\n // 处理 Fragment\r\n if (type === Fragment) {\r\n await streamFragmentAsync(vnode, controller, encoder, commentMarkers);\r\n return;\r\n }\r\n\r\n // 处理 Text\r\n if (type === Text) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n pushChunk(controller, encoder, escapeHtml(text), commentMarkers, 'text');\r\n return;\r\n }\r\n\r\n // 处理 Comment\r\n if (type === Comment) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n let safe = text.replace(/<!--/g, '<!--').replace(/-->/g, '-->');\r\n safe = safe.replace(/--/g, '- -');\r\n pushChunk(controller, encoder, `<!--${safe}-->`, commentMarkers, 'comment');\r\n return;\r\n }\r\n\r\n // 处理 Suspense 组件\r\n if (isSuspenseVNode(vnode)) {\r\n await streamSuspenseBoundary(vnode, controller, encoder, commentMarkers);\r\n return;\r\n }\r\n\r\n // 处理 Element\r\n if (shapeFlag & ShapeFlags.ELEMENT) {\r\n await streamElementAsync(vnode, controller, encoder, commentMarkers);\r\n return;\r\n }\r\n\r\n // 处理其他组件类型(有状态/函数式)\r\n if (isComponentVNode(vnode)) {\r\n await streamComponentAsync(vnode, controller, encoder, commentMarkers);\r\n return;\r\n }\r\n}\r\n\r\n// ============================================================\r\n// streamFragmentAsync\r\n// ============================================================\r\n\r\nasync function streamFragmentAsync(\r\n vnode: VNode,\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n encoder: TextEncoder,\r\n commentMarkers: boolean,\r\n): Promise<void> {\r\n const children = vnode.children;\r\n if (isArray(children)) {\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (child != null) {\r\n await streamVNodeAsync(child, controller, encoder, commentMarkers);\r\n // 在兄弟节点之间让出事件循环,实现真正的渐进式交付\r\n await yieldToMicrotask();\r\n }\r\n }\r\n }\r\n}\r\n\r\n// ============================================================\r\n// streamSuspenseBoundary - Suspense 流式支持\r\n// ============================================================\r\n\r\n/**\r\n * 流式渲染 Suspense 边界:\r\n * 1. 立即流式输出 fallback 内容\r\n * 2. 解析异步子节点\r\n * 3. 用解析后的内容替换 fallback\r\n *\r\n * 使用注释标记来界定 Suspense 边界,以便客户端\r\n * 在真实内容到达时替换 fallback。\r\n */\r\nasync function streamSuspenseBoundary(\r\n vnode: VNode,\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n encoder: TextEncoder,\r\n commentMarkers: boolean,\r\n): Promise<void> {\r\n // FIX: P2-batch2-1 使用单调递增计数器替代 Math.random(),\r\n // 避免 SSR 流式渲染中 Suspense ID 碰撞和不可预测行为\r\n const suspenseId = `suspense-${++suspenseIdCounter}`;\r\n\r\n // 打开 Suspense 边界标记\r\n pushChunk(controller, encoder, `<!--${suspenseId}-start-->`, commentMarkers, 'suspense:start');\r\n\r\n // 尝试解析默认插槽子节点\r\n const defaultSlot = vnode.props?.default as (() => unknown) | undefined;\r\n const fallbackSlot = vnode.props?.fallback as (() => unknown) | undefined;\r\n\r\n // 如果有 fallback 则先流式输出\r\n if (fallbackSlot) {\r\n pushChunk(\r\n controller,\r\n encoder,\r\n `<!--${suspenseId}-fallback-start-->`,\r\n commentMarkers,\r\n 'suspense:fallback',\r\n );\r\n try {\r\n const fallbackResult = fallbackSlot();\r\n if (isArray(fallbackResult)) {\r\n for (const child of fallbackResult) {\r\n if (child != null && typeof child === 'object' && 'type' in child) {\r\n await streamVNodeAsync(child as VNode, controller, encoder, commentMarkers);\r\n }\r\n }\r\n } else if (\r\n fallbackResult != null &&\r\n typeof fallbackResult === 'object' &&\r\n 'type' in fallbackResult\r\n ) {\r\n await streamVNodeAsync(fallbackResult as VNode, controller, encoder, commentMarkers);\r\n }\r\n } catch (_err) {\r\n // Fallback 渲染错误:静默跳过\r\n }\r\n pushChunk(\r\n controller,\r\n encoder,\r\n `<!--${suspenseId}-fallback-end-->`,\r\n commentMarkers,\r\n 'suspense:fallback-end',\r\n );\r\n }\r\n\r\n // 现在尝试解析默认(异步)内容\r\n if (defaultSlot) {\r\n try {\r\n const result = defaultSlot();\r\n // 如果结果是 Promise,则等待解析\r\n const resolved = result instanceof Promise ? await result : result;\r\n\r\n pushChunk(\r\n controller,\r\n encoder,\r\n `<!--${suspenseId}-content-start-->`,\r\n commentMarkers,\r\n 'suspense:content',\r\n );\r\n\r\n if (isArray(resolved)) {\r\n for (const child of resolved) {\r\n if (child != null && typeof child === 'object' && 'type' in child) {\r\n await streamVNodeAsync(child as VNode, controller, encoder, commentMarkers);\r\n await yieldToMicrotask();\r\n }\r\n }\r\n } else if (resolved != null && typeof resolved === 'object' && 'type' in resolved) {\r\n await streamVNodeAsync(resolved as VNode, controller, encoder, commentMarkers);\r\n }\r\n\r\n pushChunk(\r\n controller,\r\n encoder,\r\n `<!--${suspenseId}-content-end-->`,\r\n commentMarkers,\r\n 'suspense:content-end',\r\n );\r\n } catch (_err) {\r\n // 异步内容解析失败;fallback 已流式输出\r\n pushChunk(\r\n controller,\r\n encoder,\r\n `<!--${suspenseId}-error-->`,\r\n commentMarkers,\r\n 'suspense:error',\r\n );\r\n }\r\n }\r\n\r\n // 关闭 Suspense 边界标记\r\n pushChunk(controller, encoder, `<!--${suspenseId}-end-->`, commentMarkers, 'suspense:end');\r\n}\r\n\r\n// ============================================================\r\n// streamComponentAsync - 通用组件流式渲染\r\n// ============================================================\r\n\r\nasync function streamComponentAsync(\r\n vnode: VNode,\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n encoder: TextEncoder,\r\n commentMarkers: boolean,\r\n): Promise<void> {\r\n // 对于组件 vnode,尝试渲染并流式输出结果\r\n const component = vnode.type as Record<string, unknown>;\r\n if (typeof component === 'object' && component !== null) {\r\n // 如果组件有 render 函数,调用它\r\n if (typeof component.render === 'function') {\r\n const result = component.render(vnode.props ?? {});\r\n if (result && typeof result === 'object' && 'type' in result) {\r\n await streamVNodeAsync(result as VNode, controller, encoder, commentMarkers);\r\n return;\r\n }\r\n }\r\n // 如果组件有 setup 且返回 VNode\r\n if (typeof component.setup === 'function') {\r\n const setupResult = component.setup(vnode.props ?? {});\r\n const resolved = setupResult instanceof Promise ? await setupResult : setupResult;\r\n if (resolved && typeof resolved === 'object' && 'type' in resolved) {\r\n await streamVNodeAsync(resolved as VNode, controller, encoder, commentMarkers);\r\n return;\r\n }\r\n }\r\n }\r\n // 回退:渲染为空注释\r\n if (__DEV__) {\r\n warn(`SSR stream: could not render component vnode`);\r\n }\r\n}\r\n\r\n// ============================================================\r\n// streamElementAsync\r\n// ============================================================\r\n\r\nasync function streamElementAsync(\r\n vnode: VNode,\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n encoder: TextEncoder,\r\n commentMarkers: boolean,\r\n): Promise<void> {\r\n const tag = vnode.type as string;\r\n\r\n if (!isValidHTMLElementTag(tag)) {\r\n if (__DEV__) {\r\n warn(`Invalid SSR stream element tag: \"${tag}\"`);\r\n }\r\n return;\r\n }\r\n\r\n const props = vnode.props ?? {};\r\n const { shapeFlag, children } = vnode;\r\n\r\n // 构建带属性的开始标签\r\n let openTag = `<${tag}`;\r\n\r\n // 将 props 渲染为属性\r\n for (const key of Object.keys(props)) {\r\n if (key === 'key' || key === 'ref') continue;\r\n openTag += renderAttributeToString(key, props[key]);\r\n }\r\n\r\n // 自闭合元素\r\n if (isVoidElement(tag)) {\r\n openTag += ' />';\r\n pushChunk(controller, encoder, openTag, commentMarkers, `element:${tag}`);\r\n return;\r\n }\r\n\r\n openTag += '>';\r\n pushChunk(controller, encoder, openTag, commentMarkers, `element:${tag}:open`);\r\n\r\n // 流式渲染子节点\r\n if (shapeFlag & ShapeFlags.TEXT_CHILDREN) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n pushChunk(controller, encoder, escapeHtml(text), commentMarkers, `element:${tag}:text`);\r\n } else if (shapeFlag & ShapeFlags.ARRAY_CHILDREN && isArray(children)) {\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (child != null) {\r\n await streamVNodeAsync(child, controller, encoder, commentMarkers);\r\n await yieldToMicrotask();\r\n }\r\n }\r\n }\r\n\r\n // 闭合标签\r\n const closeTag = `</${tag}>`;\r\n pushChunk(controller, encoder, closeTag, commentMarkers, `element:${tag}:close`);\r\n}\r\n\r\n// ============================================================\r\n// yieldToMicrotask - 让出控制权以实现渐进式交付\r\n// ============================================================\r\n\r\n// FIX: v7-P2-14 yieldToMicrotask 使用 queueMicrotask 替代 setTimeout\r\nfunction yieldToMicrotask(): Promise<void> {\r\n return new Promise<void>((resolve) => {\r\n if (typeof queueMicrotask === 'function') {\r\n queueMicrotask(resolve);\r\n } else {\r\n // 回退:使用 Promise.resolve().then() 作为微任务\r\n Promise.resolve().then(resolve);\r\n }\r\n });\r\n}\r\n","/**\r\n * @lytjs/renderer - SSR Island 架构\r\n * 为 SSR 应用提供基于 Island 的选择性 hydration\r\n */\r\n\r\nimport type { VNode } from '@lytjs/vdom';\r\nimport { Fragment, Text, ShapeFlags } from '@lytjs/vdom';\r\nimport { isString, isArray } from '@lytjs/common-is';\r\nimport { warn } from '@lytjs/common-error';\r\nimport { escapeHtml } from '../utils';\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/**\r\n * Island 组件的精简接口。\r\n * 使用简化的结构以避免与完整的 ComponentOptions 紧耦合。\r\n */\r\nexport interface ComponentOptions {\r\n name?: string;\r\n props?: Record<string, unknown>;\r\n setup?: (props: Record<string, unknown>) => Record<string, unknown> | VNode | void;\r\n render?: (ctx: Record<string, unknown>) => VNode;\r\n data?: () => Record<string, unknown>;\r\n [key: string]: unknown;\r\n}\r\n\r\n// ============================================================\r\n// Island 注册表\r\n// ============================================================\r\n\r\nconst islandRegistry = new Map<string, ComponentOptions>();\r\n\r\n/**\r\n * 注册一个命名 Island 组件。\r\n *\r\n * 注册的组件后续可以在 `hydrateIsland` 和 `createIslandSSRContent` 中通过名称引用。\r\n */\r\nexport function registerIslandComponent(name: string, component: ComponentOptions): void {\r\n if (!name || typeof name !== 'string') {\r\n if (__DEV__) {\r\n warn(`registerIslandComponent: invalid island name \"${String(name)}\"`);\r\n }\r\n return;\r\n }\r\n islandRegistry.set(name, component);\r\n}\r\n\r\n/**\r\n * 根据名称获取已注册的 Island 组件。\r\n * 如果未找到则返回 undefined。\r\n */\r\nexport function getIslandComponent(name: string): ComponentOptions | undefined {\r\n return islandRegistry.get(name);\r\n}\r\n\r\n// ============================================================\r\n// createIslandSSRContent\r\n// ============================================================\r\n\r\n/**\r\n * 创建服务端渲染的 Island 占位符 HTML。\r\n *\r\n * 生成一个带有 `data-island` 和 `data-props` 属性的 `<div>` 元素。\r\n * props 被序列化为 JSON 并进行 base64 编码,以便安全嵌入 HTML。\r\n */\r\nexport function createIslandSSRContent(name: string, props: Record<string, unknown>): string {\r\n const encodedProps = encodeProps(props);\r\n return `<div data-island=\"${escapeHtml(name)}\" data-props=\"${escapeHtml(encodedProps)}\"><!-- island placeholder --></div>`;\r\n}\r\n\r\n// ============================================================\r\n// hydrateIsland\r\n// ============================================================\r\n\r\n/**\r\n * 对容器内的 Island 元素执行 hydration。\r\n *\r\n * 查找带有 `data-island` 属性的元素,解码序列化的 props,\r\n * 并使用注册的 Island 组件对它们进行 hydration。\r\n *\r\n * @param container - 一个 Element 或 CSS 选择器字符串,用于查找容器\r\n * @param component - 用于 hydration 的组件选项(覆盖注册表)\r\n * @param props - 可选的 props 覆盖(覆盖序列化的 props)\r\n */\r\nexport async function hydrateIsland(\r\n container: Element | string,\r\n component: ComponentOptions,\r\n props?: Record<string, unknown>,\r\n): Promise<void> {\r\n // 解析容器\r\n let root: Element | null;\r\n if (isString(container)) {\r\n root = document.querySelector(container);\r\n } else {\r\n root = container;\r\n }\r\n\r\n if (!root) {\r\n if (__DEV__) {\r\n warn(`hydrateIsland: container not found for \"${String(container)}\"`);\r\n }\r\n return;\r\n }\r\n\r\n // 查找容器内所有 Island 元素\r\n const islandElements = root.querySelectorAll('[data-island]');\r\n\r\n for (let i = 0; i < islandElements.length; i++) {\r\n const el = islandElements[i] as HTMLElement;\r\n const islandName = el.getAttribute('data-island');\r\n\r\n if (!islandName) continue;\r\n\r\n // 确定使用哪个组件:显式参数或注册表查找\r\n // 仅当 Island 名称与注册组件完全匹配时才匹配;\r\n // 不要在名称不匹配时回退到传入的组件,以防止错误的 hydration。\r\n let resolvedComponent = islandRegistry.get(islandName);\r\n if (!resolvedComponent && islandName === component.name) {\r\n resolvedComponent = component;\r\n }\r\n if (!resolvedComponent) {\r\n // 没有找到匹配的组件;跳过此 Island\r\n continue;\r\n }\r\n\r\n // 确定 props:显式参数或从 data-props 属性解码\r\n const resolvedProps = props ?? decodeProps(el.getAttribute('data-props') ?? '');\r\n\r\n // 对 Island 元素执行 hydration\r\n await hydrateIslandElement(el, resolvedComponent, resolvedProps);\r\n }\r\n}\r\n\r\n// ============================================================\r\n// 内部工具函数\r\n// ============================================================\r\n\r\n/**\r\n * 使用给定的组件和 props 对单个 Island 元素执行 hydration。\r\n *\r\n * 与替换 innerHTML 不同,此函数通过遍历 vnode 树并与现有 DOM 节点进行\r\n * 协调来执行真正的 hydration,复用匹配的节点,仅更新/创建不同的节点。\r\n */\r\nasync function hydrateIslandElement(\r\n el: HTMLElement,\r\n component: ComponentOptions,\r\n props: Record<string, unknown>,\r\n): Promise<void> {\r\n // 如果定义了 setup 则调用\r\n let setupResult: Record<string, unknown> | VNode | void = undefined;\r\n if (typeof component.setup === 'function') {\r\n setupResult = component.setup(props);\r\n }\r\n\r\n // 如果 setup 直接返回了 VNode,则使用它(跳过 render 调用)\r\n let vnode: VNode | undefined;\r\n if (setupResult && typeof setupResult === 'object' && 'type' in setupResult) {\r\n vnode = setupResult as VNode;\r\n } else if (typeof component.render === 'function') {\r\n // 仅当 setup 未返回 VNode 时才调用 render\r\n const ctx =\r\n setupResult && typeof setupResult === 'object'\r\n ? (setupResult as Record<string, unknown>)\r\n : {};\r\n vnode = component.render(ctx);\r\n }\r\n\r\n if (vnode) {\r\n // 移除 Island 元素内的占位符注释节点\r\n // 但保留现有 DOM 子节点用于 hydration 比较\r\n const placeholderComments: ChildNode[] = [];\r\n for (let i = el.childNodes.length - 1; i >= 0; i--) {\r\n const child = el.childNodes[i];\r\n if (child && child.nodeType === Node.COMMENT_NODE) {\r\n placeholderComments.push(child);\r\n }\r\n }\r\n for (const comment of placeholderComments) {\r\n comment.remove();\r\n }\r\n\r\n // 执行真正的 hydration:遍历 vnode 树并与现有 DOM 协调\r\n hydrateVNode(el, vnode);\r\n }\r\n}\r\n\r\n/**\r\n * 对父元素的现有 DOM 子节点执行 VNode hydration。\r\n *\r\n * 并行遍历 vnode 树和 DOM 树:\r\n * - 文本节点:比较 textContent,匹配则复用,不同则更新\r\n * - 元素节点:比较 tagName 和 key 属性,匹配则复用,\r\n * 递归 hydrate 子节点,无匹配则创建新节点\r\n * - Fragment 节点:对每个子 vnode 与兄弟 DOM 节点进行 hydration\r\n * - 未匹配的 DOM 节点被移除;未匹配的 vnode 创建新的 DOM 节点\r\n */\r\nfunction hydrateVNode(parent: Element, vnode: VNode): void {\r\n const { type, children } = vnode;\r\n\r\n // 处理 Fragment:对每个子 vnode 与兄弟 DOM 节点进行 hydration\r\n if (type === Fragment) {\r\n if (isArray(children)) {\r\n let domIndex = 0;\r\n const existingChildren = Array.from(parent.childNodes);\r\n for (let i = 0; i < children.length; i++) {\r\n const childVNode = children[i];\r\n if (childVNode == null) continue;\r\n domIndex = hydrateChildVNode(parent, childVNode, existingChildren, domIndex);\r\n }\r\n // 移除剩余未匹配的 DOM 节点\r\n removeRemainingChildren(parent, existingChildren, domIndex);\r\n }\r\n return;\r\n }\r\n\r\n // 处理 Text vnode\r\n if (type === Text) {\r\n const text = isString(children) ? children : String(children ?? '');\r\n const firstChild = parent.firstChild;\r\n if (firstChild && firstChild.nodeType === Node.TEXT_NODE) {\r\n // 如果内容匹配则复用现有文本节点\r\n if (firstChild.textContent !== text) {\r\n firstChild.textContent = text;\r\n }\r\n } else {\r\n // 没有匹配的文本节点;创建新节点\r\n const textNode = document.createTextNode(text);\r\n parent.appendChild(textNode);\r\n }\r\n return;\r\n }\r\n\r\n // 处理 Element vnode\r\n if (typeof type === 'string') {\r\n const tag = type.toLowerCase();\r\n\r\n // 尝试在现有 DOM 子节点中查找匹配的元素\r\n let matchedElement: Element | null = null;\r\n const existingChildren = Array.from(parent.childNodes);\r\n\r\n for (let i = 0; i < existingChildren.length; i++) {\r\n const child = existingChildren[i];\r\n if (child && child.nodeType === Node.ELEMENT_NODE) {\r\n const el = child as Element;\r\n if (el.tagName.toLowerCase() === tag) {\r\n matchedElement = el;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (matchedElement) {\r\n // 复用现有元素:更新属性并 hydrate 子节点\r\n hydrateAttributes(matchedElement, vnode);\r\n hydrateElementChildren(matchedElement, vnode);\r\n } else {\r\n // 没有匹配的元素;从 vnode 创建新元素\r\n // FIX: P0-3 使用安全的 DOM API 替代 innerHTML\r\n const newElement = createElementFromVNode(vnode);\r\n if (newElement) {\r\n parent.appendChild(newElement);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n // 处理组件 VNode(有状态或函数式组件)\r\n if (typeof type === 'object' && type !== null) {\r\n const component = type as ComponentOptions;\r\n let childVNode: VNode | undefined;\r\n\r\n // 优先尝试 render 函数\r\n if (typeof component.render === 'function') {\r\n const ctx = vnode.props ?? {};\r\n const result = component.render(ctx);\r\n if (result && typeof result === 'object' && 'type' in result) {\r\n childVNode = result as VNode;\r\n }\r\n }\r\n\r\n // 如果 render 未产生 VNode,尝试 setup 函数\r\n if (!childVNode && typeof component.setup === 'function') {\r\n const setupResult = component.setup(vnode.props ?? {});\r\n if (setupResult && typeof setupResult === 'object' && 'type' in setupResult) {\r\n childVNode = setupResult as VNode;\r\n }\r\n }\r\n\r\n // 递归 hydrate 解析后的子 VNode\r\n if (childVNode) {\r\n hydrateVNode(parent, childVNode);\r\n } else if (__DEV__) {\r\n warn(`hydrateVNode: could not resolve component VNode for hydration`);\r\n }\r\n return;\r\n }\r\n}\r\n\r\n/**\r\n * 在给定索引处对单个子 vnode 与现有 DOM 子节点执行 hydration。\r\n * 返回消费节点后的下一个 DOM 索引。\r\n */\r\nfunction hydrateChildVNode(\r\n parent: Element,\r\n vnode: VNode,\r\n existingChildren: ChildNode[],\r\n domIndex: number,\r\n): number {\r\n const { type, children } = vnode;\r\n\r\n // 处理 Fragment:hydrate 每个子节点\r\n if (type === Fragment) {\r\n if (isArray(children)) {\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (child != null) {\r\n domIndex = hydrateChildVNode(parent, child, existingChildren, domIndex);\r\n }\r\n }\r\n }\r\n return domIndex;\r\n }\r\n\r\n // 处理 Text\r\n if (type === Text) {\r\n const text = isString(children) ? children : String(children ?? '');\r\n if (domIndex < existingChildren.length) {\r\n const existingNode = existingChildren[domIndex];\r\n if (!existingNode) {\r\n parent.appendChild(document.createTextNode(text));\r\n return domIndex + 1;\r\n }\r\n if (existingNode.nodeType === Node.TEXT_NODE) {\r\n // 复用现有文本节点\r\n if (existingNode.textContent !== text) {\r\n existingNode.textContent = text;\r\n }\r\n return domIndex + 1;\r\n }\r\n // 类型不匹配:替换现有节点\r\n const textNode = document.createTextNode(text);\r\n parent.replaceChild(textNode, existingNode);\r\n return domIndex + 1;\r\n }\r\n // 没有现有节点;追加新文本节点\r\n parent.appendChild(document.createTextNode(text));\r\n return domIndex + 1;\r\n }\r\n\r\n // 处理 Element\r\n if (typeof type === 'string') {\r\n const tag = type.toLowerCase();\r\n\r\n // FIX: P2-34 缓存 vnodeToSimpleHTML 结果到局部变量,避免重复调用\r\n // @ts-expect-error -- reserved for future use\r\n const _vnodeHtml = vnodeToSimpleHTML(vnode);\r\n\r\n if (domIndex < existingChildren.length) {\r\n const existingNode = existingChildren[domIndex];\r\n if (!existingNode) {\r\n // 没有现有节点;追加新元素\r\n // FIX: P0-3 使用安全的 DOM API 替代 innerHTML\r\n const newElement = createElementFromVNode(vnode);\r\n if (newElement) {\r\n parent.appendChild(newElement);\r\n }\r\n return domIndex + 1;\r\n }\r\n if (existingNode.nodeType === Node.ELEMENT_NODE) {\r\n const el = existingNode as Element;\r\n if (el.tagName.toLowerCase() === tag) {\r\n // 标签匹配:复用并 hydrate\r\n hydrateAttributes(el, vnode);\r\n hydrateElementChildren(el, vnode);\r\n return domIndex + 1;\r\n }\r\n // 标签不匹配:替换为新元素\r\n // FIX: P0-3 使用安全的 DOM API 替代 innerHTML\r\n const newElement = createElementFromVNode(vnode);\r\n if (newElement) {\r\n parent.replaceChild(newElement, existingNode);\r\n }\r\n return domIndex + 1;\r\n }\r\n // 不是元素节点:替换\r\n // FIX: P0-3 使用安全的 DOM API 替代 innerHTML\r\n const newElement = createElementFromVNode(vnode);\r\n if (newElement) {\r\n parent.replaceChild(newElement, existingNode);\r\n }\r\n return domIndex + 1;\r\n }\r\n // 没有现有节点;追加新元素\r\n // FIX: P0-3 使用安全的 DOM API 替代 innerHTML\r\n const newElement = createElementFromVNode(vnode);\r\n if (newElement) {\r\n parent.appendChild(newElement);\r\n }\r\n return domIndex + 1;\r\n }\r\n\r\n // 处理组件 VNode(有状态或函数式组件)\r\n if (typeof type === 'object' && type !== null) {\r\n const component = type as ComponentOptions;\r\n let childVNode: VNode | undefined;\r\n\r\n if (typeof component.render === 'function') {\r\n const ctx = vnode.props ?? {};\r\n const result = component.render(ctx);\r\n if (result && typeof result === 'object' && 'type' in result) {\r\n childVNode = result as VNode;\r\n }\r\n }\r\n\r\n if (!childVNode && typeof component.setup === 'function') {\r\n const setupResult = component.setup(vnode.props ?? {});\r\n if (setupResult && typeof setupResult === 'object' && 'type' in setupResult) {\r\n childVNode = setupResult as VNode;\r\n }\r\n }\r\n\r\n if (childVNode) {\r\n domIndex = hydrateChildVNode(parent, childVNode, existingChildren, domIndex);\r\n }\r\n return domIndex;\r\n }\r\n\r\n return domIndex;\r\n}\r\n\r\n/**\r\n * 从 domIndex 开始移除剩余未匹配的 DOM 子节点。\r\n */\r\nfunction removeRemainingChildren(\r\n parent: Element,\r\n existingChildren: ChildNode[],\r\n domIndex: number,\r\n): void {\r\n for (let i = existingChildren.length - 1; i >= domIndex; i--) {\r\n const child = existingChildren[i];\r\n if (child) {\r\n parent.removeChild(child);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 更新现有 DOM 元素的属性以匹配 vnode props。\r\n */\r\nfunction hydrateAttributes(el: Element, vnode: VNode): void {\r\n const props = vnode.props ?? {};\r\n const vnodeKeys = new Set<string>();\r\n\r\n // 从 vnode props 设置或更新属性\r\n for (const key in props) {\r\n if (key === 'key' || key === 'ref') continue;\r\n vnodeKeys.add(key);\r\n const value = props[key];\r\n if (typeof value === 'boolean') {\r\n if (value) {\r\n el.setAttribute(key, '');\r\n } else {\r\n el.removeAttribute(key);\r\n }\r\n } else if (value != null && value !== '') {\r\n el.setAttribute(key, String(value));\r\n } else {\r\n el.removeAttribute(key);\r\n }\r\n }\r\n\r\n // 移除 DOM 元素上存在但 vnode props 中不存在的属性\r\n const existingAttrs = Array.from(el.attributes);\r\n for (const attr of existingAttrs) {\r\n if (!vnodeKeys.has(attr.name) && attr.name !== 'data-island' && attr.name !== 'data-props') {\r\n el.removeAttribute(attr.name);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 对现有元素的子节点与 vnode 子节点执行 hydration。\r\n */\r\nfunction hydrateElementChildren(el: Element, vnode: VNode): void {\r\n const { children, shapeFlag } = vnode;\r\n\r\n // FIX: P2-35 使用 ShapeFlags 常量替代魔法数字\r\n if (shapeFlag != null && shapeFlag & ShapeFlags.TEXT_CHILDREN) {\r\n // TEXT_CHILDREN\r\n const text = isString(children) ? children : String(children ?? '');\r\n if (el.childNodes.length > 0) {\r\n // 如果存在则复用第一个文本子节点\r\n // FIX: P2-v11-03 添加 null 检查替代非空断言,\r\n // 防止无子节点时 firstChild 为 null 导致运行时崩溃\r\n const firstChild = el.firstChild;\r\n if (!firstChild) {\r\n el.appendChild(document.createTextNode(text));\r\n return;\r\n }\r\n if (firstChild.nodeType === Node.TEXT_NODE) {\r\n if (firstChild.textContent !== text) {\r\n firstChild.textContent = text;\r\n }\r\n // 移除多余的子节点\r\n while (el.childNodes.length > 1) {\r\n const lastChild = el.lastChild;\r\n // FIX: P2-51 添加 null 检查替代非空断言,防御性编程\r\n if (lastChild) {\r\n el.removeChild(lastChild);\r\n } else {\r\n break;\r\n }\r\n }\r\n } else {\r\n // 用单个文本节点替换所有子节点\r\n el.textContent = text;\r\n }\r\n } else {\r\n el.appendChild(document.createTextNode(text));\r\n }\r\n return;\r\n }\r\n\r\n if (isArray(children)) {\r\n const existingChildren = Array.from(el.childNodes);\r\n let domIndex = 0;\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (child != null) {\r\n domIndex = hydrateChildVNode(el, child, existingChildren, domIndex);\r\n }\r\n }\r\n removeRemainingChildren(el, existingChildren, domIndex);\r\n return;\r\n }\r\n}\r\n\r\n/**\r\n * 安全创建 DOM 元素\r\n * FIX: P0-3 避免使用 innerHTML,使用安全的 DOM API\r\n */\r\nfunction createElementFromVNode(vnode: VNode): Element | null {\r\n const type = vnode.type;\r\n if (typeof type !== 'string') return null;\r\n\r\n const el = document.createElement(type);\r\n\r\n // 设置属性\r\n if (vnode.props) {\r\n for (const [key, value] of Object.entries(vnode.props)) {\r\n if (key === 'children' || key === 'key') continue;\r\n if (value != null) {\r\n el.setAttribute(key, String(value));\r\n }\r\n }\r\n }\r\n\r\n // 设置子节点\r\n if (vnode.children) {\r\n if (typeof vnode.children === 'string') {\r\n el.textContent = vnode.children;\r\n } else if (Array.isArray(vnode.children)) {\r\n for (const child of vnode.children) {\r\n if (typeof child === 'string') {\r\n el.appendChild(document.createTextNode(child));\r\n } else if (child && typeof child === 'object' && 'type' in child) {\r\n const childEl = createElementFromVNode(child as VNode);\r\n if (childEl) {\r\n el.appendChild(childEl);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return el;\r\n}\r\n\r\n/**\r\n * 简单的 vnode 转 HTML 转换器,用于 Island hydration。\r\n * 处理基本元素、文本、Fragment 和注释。\r\n */\r\nfunction vnodeToSimpleHTML(vnode: VNode): string {\r\n const { type, children } = vnode;\r\n\r\n // 处理 Fragment:渲染每个子节点\r\n if (type === Fragment) {\r\n if (isArray(children)) {\r\n return children.map((child) => (child != null ? vnodeToSimpleHTML(child) : '')).join('');\r\n }\r\n return '';\r\n }\r\n\r\n // 处理 Text vnode\r\n if (type === Text) {\r\n const text = isString(children) ? children : String(children ?? '');\r\n return escapeHtml(text);\r\n }\r\n\r\n // 处理 Element vnode\r\n if (typeof type === 'string') {\r\n const props = vnode.props ?? {};\r\n let attrs = '';\r\n for (const key in props) {\r\n if (key === 'key' || key === 'ref') continue;\r\n const value = props[key];\r\n if (typeof value === 'boolean' && value) {\r\n attrs += ` ${key}`;\r\n } else if (value != null && value !== '') {\r\n attrs += ` ${key}=\"${escapeHtml(String(value))}\"`;\r\n }\r\n }\r\n\r\n const tag = type;\r\n\r\n // 渲染子节点\r\n let childContent = '';\r\n if (children != null) {\r\n if (isString(children)) {\r\n childContent = escapeHtml(children);\r\n } else if (isArray(children)) {\r\n childContent = children\r\n .map((child) => (child != null ? vnodeToSimpleHTML(child as VNode) : ''))\r\n .join('');\r\n } else if (typeof children === 'object' && 'type' in (children as object)) {\r\n // 单个 VNode 子节点\r\n // FIX: P2-batch2-2 添加运行时类型检查,避免不安全的类型断言\r\n if (children != null && typeof children === 'object' && 'type' in children) {\r\n childContent = vnodeToSimpleHTML(children as unknown as VNode);\r\n }\r\n }\r\n }\r\n\r\n return `<${tag}${attrs}>${childContent}</${tag}>`;\r\n }\r\n\r\n return '';\r\n}\r\n\r\n/**\r\n * 使用 TextEncoder 将字符串编码为 base64(安全替代 btoa(unescape(...)))。\r\n * FIX: P2-50 使用分块处理(每次 8192 字节)替代逐字符拼接,\r\n * 避免大字符串时 String.fromCharCode 的性能问题和调用栈开销。\r\n */\r\nfunction uint8ToBase64(bytes: Uint8Array): string {\r\n const CHUNK_SIZE = 8192;\r\n const chunks: string[] = [];\r\n for (let i = 0; i < bytes.length; i += CHUNK_SIZE) {\r\n const chunk = bytes.subarray(i, Math.min(i + CHUNK_SIZE, bytes.length));\r\n chunks.push(String.fromCharCode(...chunk));\r\n }\r\n return btoa(chunks.join(''));\r\n}\r\n\r\n/**\r\n * 使用 atob 将 base64 解码为 Uint8Array(安全替代 escape(atob(...)))。\r\n */\r\nfunction base64ToUint8(base64: string): Uint8Array {\r\n const binary = atob(base64);\r\n const bytes = new Uint8Array(binary.length);\r\n for (let i = 0; i < binary.length; i++) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n return bytes;\r\n}\r\n\r\n/**\r\n * 将 props 编码为 base64 字符串,用于嵌入 HTML 属性。\r\n */\r\nfunction encodeProps(props: Record<string, unknown>): string {\r\n const json = JSON.stringify(props);\r\n // 使用 TextEncoder 进行安全的 UTF-8 到 base64 转换\r\n const bytes = new TextEncoder().encode(json);\r\n return uint8ToBase64(bytes);\r\n}\r\n\r\n/**\r\n * 从 base64 字符串解码 props。\r\n */\r\nfunction decodeProps(encoded: string): Record<string, unknown> {\r\n if (!encoded) return {};\r\n\r\n try {\r\n // 使用 TextDecoder 进行安全的 base64 到 UTF-8 转换\r\n const bytes = base64ToUint8(encoded);\r\n const json = new TextDecoder().decode(bytes);\r\n return JSON.parse(json) as Record<string, unknown>;\r\n } catch {\r\n if (__DEV__) {\r\n warn(`hydrateIsland: failed to decode props from \"${encoded}\"`);\r\n }\r\n return {};\r\n }\r\n}\r\n","// src/vapor/vapor-app.ts\r\n// @lytjs/renderer - Vapor 模式应用 API\r\n// Vapor 是 Signal 模式的高级封装,提供 defineVaporComponent 和 createVaporApp\r\n\r\nimport { compile } from '@lytjs/compiler';\r\nimport { createSignalRenderer } from '../signal/signal-renderer';\r\nimport type { SignalRenderer } from '../signal/signal-renderer';\r\nimport {\r\n generateComponentId,\r\n registerComponent,\r\n unregisterComponent,\r\n isHMRAvailable,\r\n} from './vapor-hmr';\r\n\r\n// __DEV__ 已在 env.d.ts 中全局声明,无需重复声明\r\n\r\n// ============================================================\r\n// VaporContext 接口\r\n// ============================================================\r\n\r\n/** Vapor 组件的上下文对象 */\r\nexport interface VaporContext {\r\n attrs: Record<string, unknown>;\r\n slots: Record<string, () => Node>;\r\n emit: (event: string, ...args: unknown[]) => void;\r\n}\r\n\r\n// ============================================================\r\n// VaporComponentOptions 接口\r\n// ============================================================\r\n\r\n/** Prop 定义选项 */\r\nexport interface PropOptions {\r\n type?: 'string' | 'number' | 'boolean' | 'object' | 'array' | 'function';\r\n default?: unknown;\r\n required?: boolean;\r\n validator?: (value: unknown) => boolean;\r\n}\r\n\r\n/** Vapor 组件定义选项 */\r\nexport interface VaporComponentOptions {\r\n name?: string;\r\n props?: Record<string, PropOptions>;\r\n setup?: (props: Record<string, unknown>, context: VaporContext) => Record<string, unknown> | void;\r\n template: string;\r\n}\r\n\r\n// ============================================================\r\n// VaporComponentDefinition 接口\r\n// ============================================================\r\n\r\n/** Vapor 组件定义(编译后的结果) */\r\nexport interface VaporComponentDefinition {\r\n name?: string;\r\n props?: Record<string, PropOptions>;\r\n setup?: (props: Record<string, unknown>, context: VaporContext) => Record<string, unknown> | void;\r\n template: string;\r\n compiledCode?: string;\r\n}\r\n\r\n// ============================================================\r\n// VaporAppOptions 接口\r\n// ============================================================\r\n\r\n/** Vapor 应用配置选项 */\r\nexport interface VaporAppOptions {\r\n /** 根容器属性(传递给根组件的 props) */\r\n rootProps?: Record<string, unknown>;\r\n}\r\n\r\n// ============================================================\r\n// VaporApp 接口\r\n// ============================================================\r\n\r\n/** Vapor 应用实例 */\r\nexport interface VaporApp {\r\n mount(container: Element | string): void;\r\n unmount(): void;\r\n provide(key: string | symbol, value: unknown): void;\r\n component(name: string, component: VaporComponentDefinition): VaporApp;\r\n}\r\n\r\n// ============================================================\r\n// defineVaporComponent\r\n// ============================================================\r\n\r\n/**\r\n * 定义一个 Vapor 模式的组件\r\n *\r\n * 将模板编译结果缓存到闭包中,返回组件定义对象。\r\n *\r\n * @param options - 组件定义选项\r\n * @returns VaporComponentDefinition\r\n *\r\n * @example\r\n * ```ts\r\n * const MyComponent = defineVaporComponent({\r\n * name: 'MyComponent',\r\n * props: {\r\n * message: { type: String, default: 'hello' }\r\n * },\r\n * setup(props, { emit }) {\r\n * return { count: 0, onClick: () => emit('click') };\r\n * },\r\n * template: '<div @click=\"onClick\">{{ message }}</div>'\r\n * });\r\n * ```\r\n */\r\nexport function defineVaporComponent(options: VaporComponentOptions): VaporComponentDefinition {\r\n const { name, props, setup, template } = options;\r\n\r\n // 预编译模板,将编译结果缓存到闭包中\r\n let compiledCode: string | undefined;\r\n try {\r\n const compileResult = compile(template, { rendererMode: 'signal' });\r\n compiledCode = compileResult.code;\r\n } catch (e) {\r\n // FIX: P2-v11-01 生产环境编译错误不再静默吞没,\r\n // 在非 DEV 环境下将错误记录到 console.error,确保问题可追踪\r\n if (__DEV__) {\r\n console.warn(\r\n `[LytJS] defineVaporComponent: template compilation failed for \"${name || 'anonymous'}\". ` +\r\n `Error: ${e instanceof Error ? e.message : String(e)}`,\r\n );\r\n } else {\r\n console.error(\r\n `[LytJS] defineVaporComponent: template compilation failed for \"${name || 'anonymous'}\". ` +\r\n `Error: ${e instanceof Error ? e.message : String(e)}`,\r\n );\r\n }\r\n }\r\n\r\n return {\r\n name,\r\n props,\r\n setup,\r\n template,\r\n compiledCode,\r\n };\r\n}\r\n\r\n// ============================================================\r\n// createVaporApp\r\n// ============================================================\r\n\r\n/**\r\n * 创建一个 Vapor 模式的应用实例\r\n *\r\n * 内部使用 createSignalRenderer 进行渲染。\r\n *\r\n * @param rootComponent - 根组件定义\r\n * @param options - 应用配置选项\r\n * @returns VaporApp 实例\r\n *\r\n * @example\r\n * ```ts\r\n * const App = defineVaporComponent({\r\n * template: '<div>{{ message }}</div>',\r\n * setup() {\r\n * return { message: 'Hello Vapor' };\r\n * }\r\n * });\r\n *\r\n * const app = createVaporApp(App);\r\n * app.mount('#app');\r\n * ```\r\n */\r\nexport function createVaporApp(\r\n rootComponent: VaporComponentDefinition,\r\n options?: VaporAppOptions,\r\n): VaporApp {\r\n const provides = new Map<string | symbol, unknown>();\r\n const components = new Map<string, VaporComponentDefinition>();\r\n\r\n let signalRenderer: SignalRenderer | null = null;\r\n let isMounted = false;\r\n let isUnmounted = false;\r\n\r\n // Phase 1.2: HMR 组件 ID\r\n const componentId = generateComponentId();\r\n\r\n const vaporApp: VaporApp = {\r\n mount(container: Element | string) {\r\n if (isUnmounted) {\r\n throw new Error(\r\n `[LytJS] VaporApp has been unmounted and cannot be remounted. ` +\r\n `Create a new app instance instead.`,\r\n );\r\n }\r\n\r\n if (isMounted) {\r\n throw new Error(\r\n `[LytJS] VaporApp is already mounted. Call app.unmount() first before mounting again.`,\r\n );\r\n }\r\n\r\n // 解析容器\r\n const el = typeof container === 'string' ? document.querySelector(container) : container;\r\n\r\n if (!el) {\r\n throw new Error(`[LytJS] VaporApp: cannot find element matching \"${container}\".`);\r\n }\r\n\r\n // 构建上下文对象\r\n const rootProps = options?.rootProps ?? {};\r\n const ctx: Record<string, unknown> = { ...rootProps };\r\n\r\n // 创建 VaporContext\r\n const vaporContext: VaporContext = {\r\n attrs: { ...rootProps },\r\n slots: {},\r\n emit(event: string, ...args: unknown[]) {\r\n if (__DEV__) {\r\n // eslint-disable-next-line no-console\r\n console.log(`[LytJS] VaporComponent emitted event \"${event}\"`, args);\r\n }\r\n },\r\n };\r\n\r\n // 执行 setup 函数\r\n if (typeof rootComponent.setup === 'function') {\r\n const setupResult = rootComponent.setup(rootProps, vaporContext);\r\n if (setupResult && typeof setupResult === 'object') {\r\n Object.assign(ctx, setupResult);\r\n }\r\n }\r\n\r\n // FIX: P2-v11-02 createVaporApp 验证 template 存在性,\r\n // 避免缺少 template 时在运行时产生难以调试的错误\r\n if (!rootComponent.template) {\r\n throw new Error(\r\n `[LytJS] createVaporApp: rootComponent must have a 'template' property. ` +\r\n `Received: ${typeof rootComponent.template}`,\r\n );\r\n }\r\n\r\n // 创建 Signal 渲染器\r\n signalRenderer = createSignalRenderer(rootComponent.template, ctx);\r\n signalRenderer.render(el);\r\n\r\n // Phase 1.2: 注册组件实例用于 HMR\r\n if (__DEV__ || isHMRAvailable()) {\r\n registerComponent(componentId, rootComponent, el);\r\n }\r\n\r\n isMounted = true;\r\n },\r\n\r\n unmount() {\r\n if (signalRenderer) {\r\n signalRenderer.unmount();\r\n signalRenderer = null;\r\n }\r\n\r\n // Phase 1.2: 注销组件实例\r\n if (__DEV__ || isHMRAvailable()) {\r\n unregisterComponent(componentId);\r\n }\r\n\r\n isMounted = false;\r\n isUnmounted = true;\r\n\r\n // 清理注册的资源\r\n provides.clear();\r\n components.clear();\r\n },\r\n\r\n provide(key: string | symbol, value: unknown): void {\r\n if (__DEV__ && isMounted) {\r\n console.warn(\r\n '[LytJS] VaporApp.provide() cannot be called after the app has been mounted. ' +\r\n 'Register provides before calling app.mount().',\r\n );\r\n }\r\n provides.set(key, value);\r\n },\r\n\r\n component(name: string, component: VaporComponentDefinition): VaporApp {\r\n components.set(name, component);\r\n return vaporApp;\r\n },\r\n };\r\n\r\n return vaporApp;\r\n}\r\n","// packages/renderer/src/server/server-components.ts\r\n// Server Components 运行时支持\r\n// Phase 1.4: 服务端组件运行时\r\n\r\n// import type { VaporComponentDefinition } from '../vapor/vapor-app';\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/** Server Component 定义 */\r\nexport interface ServerComponentDefinition {\r\n /** 组件 ID */\r\n id: string;\r\n /** 组件名称 */\r\n name: string;\r\n /** 渲染函数 */\r\n render: () => Promise<string>;\r\n /** 数据获取函数 */\r\n fetchData?: () => Promise<Record<string, unknown>>;\r\n /** 序列化数据 */\r\n serializeData?: () => string;\r\n}\r\n\r\n/** Server Action 请求 */\r\nexport interface ServerActionRequest {\r\n /** 组件名称 */\r\n componentName: string;\r\n /** 函数名称 */\r\n functionName: string;\r\n /** 参数 */\r\n args: unknown[];\r\n}\r\n\r\n/** Server Action 响应 */\r\nexport interface ServerActionResponse {\r\n /** 是否成功 */\r\n success: boolean;\r\n /** 返回数据 */\r\n data?: unknown;\r\n /** 错误信息 */\r\n error?: string;\r\n}\r\n\r\n/** Server Component 注册表 */\r\ninterface ServerComponentRegistry {\r\n components: Map<string, ServerComponentDefinition>;\r\n functions: Map<string, Map<string, (...args: unknown[]) => Promise<unknown>>>;\r\n}\r\n\r\n// ============================================================\r\n// 全局注册表\r\n// ============================================================\r\n\r\nconst registry: ServerComponentRegistry = {\r\n components: new Map(),\r\n functions: new Map(),\r\n};\r\n\r\n// ============================================================\r\n// 组件注册\r\n// ============================================================\r\n\r\n/**\r\n * 注册 Server Component\r\n */\r\nexport function registerServerComponent(\r\n component: ServerComponentDefinition,\r\n): void {\r\n registry.components.set(component.id, component);\r\n}\r\n\r\n/**\r\n * 注册服务端函数\r\n */\r\nexport function registerServerFunction(\r\n componentId: string,\r\n functionName: string,\r\n fn: (...args: unknown[]) => Promise<unknown>,\r\n): void {\r\n if (!registry.functions.has(componentId)) {\r\n registry.functions.set(componentId, new Map());\r\n }\r\n registry.functions.get(componentId)!.set(functionName, fn);\r\n}\r\n\r\n/**\r\n * 获取 Server Component\r\n */\r\nexport function getServerComponent(id: string): ServerComponentDefinition | undefined {\r\n return registry.components.get(id);\r\n}\r\n\r\n/**\r\n * 获取服务端函数\r\n */\r\nexport function getServerFunction(\r\n componentId: string,\r\n functionName: string,\r\n): ((...args: unknown[]) => Promise<unknown>) | undefined {\r\n return registry.functions.get(componentId)?.get(functionName);\r\n}\r\n\r\n// ============================================================\r\n// Server Action 处理\r\n// ============================================================\r\n\r\n/**\r\n * 处理 Server Action 请求\r\n * 用于处理客户端对服务端函数的调用\r\n */\r\nexport async function handleServerAction(\r\n request: ServerActionRequest,\r\n): Promise<ServerActionResponse> {\r\n const { componentName, functionName, args } = request;\r\n\r\n try {\r\n // 查找函数\r\n const fn = getServerFunction(componentName, functionName);\r\n if (!fn) {\r\n return {\r\n success: false,\r\n error: `Server function not found: ${componentName}.${functionName}`,\r\n };\r\n }\r\n\r\n // 执行函数\r\n const result = await fn(...args);\r\n\r\n return {\r\n success: true,\r\n data: result,\r\n };\r\n } catch (error) {\r\n console.error(`[LytJS Server Action Error] ${componentName}.${functionName}:`, error);\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * 创建 Server Action 处理器\r\n * 用于 Express/Fastify 等服务端框架\r\n */\r\nexport function createServerActionHandler() {\r\n return async (req: any, res: any) => {\r\n const componentName = req.headers['x-server-component'];\r\n const functionName = req.headers['x-server-function'];\r\n\r\n if (!componentName || !functionName) {\r\n res.status(400).json({ error: 'Missing server component or function headers' });\r\n return;\r\n }\r\n\r\n const args = req.body?.args || [];\r\n\r\n const result = await handleServerAction({\r\n componentName,\r\n functionName,\r\n args,\r\n });\r\n\r\n if (result.success) {\r\n res.json(result.data);\r\n } else {\r\n res.status(500).json({ error: result.error });\r\n }\r\n };\r\n}\r\n\r\n// ============================================================\r\n// 数据序列化\r\n// ============================================================\r\n\r\n/**\r\n * 序列化 Server Component 数据\r\n */\r\nexport function serializeServerData(data: unknown): string {\r\n return JSON.stringify(data, (_key, value) => {\r\n // 处理特殊类型\r\n if (value instanceof Date) {\r\n return { __type: 'Date', value: value.toISOString() };\r\n }\r\n if (value instanceof Map) {\r\n return { __type: 'Map', value: Array.from(value.entries()) };\r\n }\r\n if (value instanceof Set) {\r\n return { __type: 'Set', value: Array.from(value.values()) };\r\n }\r\n if (typeof value === 'bigint') {\r\n return { __type: 'BigInt', value: value.toString() };\r\n }\r\n if (value === undefined) {\r\n return { __type: 'undefined' };\r\n }\r\n return value;\r\n });\r\n}\r\n\r\n/**\r\n * 反序列化 Server Component 数据\r\n */\r\nexport function deserializeServerData(json: string): unknown {\r\n return JSON.parse(json, (_key, value) => {\r\n if (value && typeof value === 'object' && '__type' in value) {\r\n switch (value.__type) {\r\n case 'Date':\r\n return new Date(value.value);\r\n case 'Map':\r\n return new Map(value.value);\r\n case 'Set':\r\n return new Set(value.value);\r\n case 'BigInt':\r\n return BigInt(value.value);\r\n case 'undefined':\r\n return undefined;\r\n }\r\n }\r\n return value;\r\n });\r\n}\r\n\r\n// ============================================================\r\n// Server Component 渲染\r\n// ============================================================\r\n\r\n/**\r\n * 渲染 Server Component\r\n */\r\nexport async function renderServerComponent(\r\n componentId: string,\r\n _context: Record<string, unknown> = {},\r\n): Promise<string> {\r\n const component = getServerComponent(componentId);\r\n if (!component) {\r\n throw new Error(`[LytJS] Server component not found: ${componentId}`);\r\n }\r\n\r\n // 获取数据\r\n if (component.fetchData) {\r\n await component.fetchData();\r\n }\r\n\r\n // 渲染\r\n const html = await component.render();\r\n\r\n // 注入数据脚本\r\n const dataScript = component.serializeData\r\n ? `<script>window.__LYTJS_SERVER_DATA__=${component.serializeData()};</script>`\r\n : '';\r\n\r\n return html + dataScript;\r\n}\r\n\r\n// ============================================================\r\n// defineServerComponent\r\n// ============================================================\r\n\r\n/**\r\n * 定义 Server Component\r\n *\r\n * @example\r\n * ```ts\r\n * export default defineServerComponent({\r\n * id: 'product-list',\r\n * name: 'ProductList',\r\n * async fetchData() {\r\n * const products = await db.products.findMany();\r\n * return { products };\r\n * },\r\n * async render() {\r\n * return '<div class=\"product-list\">...</div>';\r\n * }\r\n * });\r\n * ```\r\n */\r\nexport function defineServerComponent(\r\n options: Omit<ServerComponentDefinition, 'serializeData'> & {\r\n serializeData?: () => string;\r\n },\r\n): ServerComponentDefinition {\r\n const component: ServerComponentDefinition = {\r\n ...options,\r\n serializeData: options.serializeData ?? (() => serializeServerData({})),\r\n };\r\n\r\n // 自动注册\r\n registerServerComponent(component);\r\n\r\n return component;\r\n}\r\n\r\n// ============================================================\r\n// 导出(函数已在上面定义)\r\n// ============================================================\r\n","// packages/renderer/src/client/server-components-client.ts\r\n// Server Components 客户端运行时\r\n// Phase 1.4: 客户端调用服务端组件\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/** Server Action 配置 */\r\nexport interface ServerActionConfig {\r\n /** 服务端 action 端点 */\r\n endpoint?: string;\r\n /** 请求头 */\r\n headers?: Record<string, string>;\r\n /** 错误处理 */\r\n onError?: (error: Error) => void;\r\n}\r\n\r\n// ============================================================\r\n// 默认配置\r\n// ============================================================\r\n\r\nlet defaultConfig: ServerActionConfig = {\r\n endpoint: '/__lytjs_server_action',\r\n headers: {},\r\n onError: (error) => console.error('[LytJS Server Action Error]', error),\r\n};\r\n\r\n/**\r\n * 配置 Server Action\r\n */\r\nexport function configureServerAction(config: Partial<ServerActionConfig>): void {\r\n defaultConfig = { ...defaultConfig, ...config };\r\n}\r\n\r\n// ============================================================\r\n// Server Action 调用\r\n// ============================================================\r\n\r\n/**\r\n * 调用服务端函数\r\n *\r\n * @example\r\n * ```ts\r\n * // 在客户端调用服务端函数\r\n * const result = await callServer('ProductList', 'fetchProducts', { category: 'electronics' });\r\n * ```\r\n */\r\nexport async function callServer<T = unknown>(\r\n componentName: string,\r\n functionName: string,\r\n ...args: unknown[]\r\n): Promise<T> {\r\n const { endpoint, headers, onError } = defaultConfig;\r\n\r\n try {\r\n const response = await fetch(endpoint!, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Server-Component': componentName,\r\n 'X-Server-Function': functionName,\r\n ...headers,\r\n },\r\n body: JSON.stringify({ args }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `Server action failed: ${response.status} ${response.statusText}`\r\n );\r\n }\r\n\r\n const result = await response.json();\r\n return result as T;\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error(String(error));\r\n onError?.(err);\r\n throw err;\r\n }\r\n}\r\n\r\n/**\r\n * 创建服务端函数代理\r\n *\r\n * @example\r\n * ```ts\r\n * // 创建类型安全的服务端函数调用\r\n * const fetchProducts = createServerFunction<Product[]>('ProductList', 'fetchProducts');\r\n * const products = await fetchProducts({ category: 'electronics' });\r\n * ```\r\n */\r\nexport function createServerFunction<T>(\r\n componentName: string,\r\n functionName: string,\r\n): (...args: unknown[]) => Promise<T> {\r\n return (...args: unknown[]) => callServer<T>(componentName, functionName, ...args);\r\n}\r\n\r\n// ============================================================\r\n// Server Component 数据访问\r\n// ============================================================\r\n\r\n/**\r\n * 获取服务端预取的数据\r\n */\r\nexport function getServerData<T = unknown>(key?: string): T | undefined {\r\n const serverData = (window as any).__LYTJS_SERVER_DATA__;\r\n if (!serverData) return undefined;\r\n\r\n if (key) {\r\n return serverData[key] as T | undefined;\r\n }\r\n\r\n return serverData as T;\r\n}\r\n\r\n/**\r\n * 检查是否有服务端数据\r\n */\r\nexport function hasServerData(): boolean {\r\n return !!(window as any).__LYTJS_SERVER_DATA__;\r\n}\r\n\r\n// ============================================================\r\n// Server Component Hydration\r\n// ============================================================\r\n\r\n/**\r\n * Hydration 状态\r\n */\r\nconst hydrationState = new Map<string, {\r\n hydrated: boolean;\r\n pending: boolean;\r\n error: Error | null;\r\n}>();\r\n\r\n/**\r\n * 检查组件是否已 hydration\r\n */\r\nexport function isHydrated(componentId: string): boolean {\r\n return hydrationState.get(componentId)?.hydrated ?? false;\r\n}\r\n\r\n/**\r\n * 标记组件为已 hydration\r\n */\r\nexport function markHydrated(componentId: string): void {\r\n hydrationState.set(componentId, {\r\n hydrated: true,\r\n pending: false,\r\n error: null,\r\n });\r\n}\r\n\r\n/**\r\n * 获取 hydration 状态\r\n */\r\nexport function getHydrationState(componentId: string): {\r\n hydrated: boolean;\r\n pending: boolean;\r\n error: Error | null;\r\n} {\r\n return hydrationState.get(componentId) ?? {\r\n hydrated: false,\r\n pending: false,\r\n error: null,\r\n };\r\n}\r\n\r\n// ============================================================\r\n// 自动 Hydration\r\n// ============================================================\r\n\r\n/**\r\n * 自动 hydrate 所有 Server Components\r\n */\r\nexport async function autoHydrate(): Promise<void> {\r\n // 查找所有需要 hydration 的元素\r\n const elements = document.querySelectorAll('[data-server-component]');\r\n\r\n for (const el of elements) {\r\n const componentId = el.getAttribute('data-server-component');\r\n if (!componentId) continue;\r\n\r\n // 检查是否已 hydration\r\n if (isHydrated(componentId)) continue;\r\n\r\n // 标记为 pending\r\n hydrationState.set(componentId, {\r\n hydrated: false,\r\n pending: true,\r\n error: null,\r\n });\r\n\r\n try {\r\n // 动态导入组件\r\n const module = await import(/* @vite-ignore */ `/components/${componentId}.client.js`);\r\n\r\n if (module.default && typeof module.default.hydrate === 'function') {\r\n await module.default.hydrate(el);\r\n }\r\n\r\n markHydrated(componentId);\r\n } catch (error) {\r\n hydrationState.set(componentId, {\r\n hydrated: false,\r\n pending: false,\r\n error: error instanceof Error ? error : new Error(String(error)),\r\n });\r\n\r\n console.error(`[LytJS] Failed to hydrate ${componentId}:`, error);\r\n }\r\n }\r\n}\r\n\r\n// ============================================================\r\n// 初始化\r\n// ============================================================\r\n\r\n// 自动执行 hydration\r\nif (typeof document !== 'undefined' && document.readyState === 'complete') {\r\n autoHydrate();\r\n} else if (typeof document !== 'undefined') {\r\n document.addEventListener('DOMContentLoaded', autoHydrate);\r\n}\r\n\r\n// ============================================================\r\n// 导出(函数已在上面定义)\r\n// ============================================================\r\n","// packages/renderer/src/data/data-fetching.ts\r\n// 数据获取功能\r\n// Phase 1.7: 数据获取集成服务端数据预取 + 序列化\r\n\r\nimport { ref, watch, type Ref } from '@lytjs/reactivity';\r\nimport { isArray } from '@lytjs/common-is';\r\n\r\n// ============================================================\r\n// 类型定义\r\n// ============================================================\r\n\r\n/** 数据获取状态 */\r\nexport interface DataFetchState<T extends unknown = unknown> {\r\n /** 数据 */\r\n data: T | undefined;\r\n /** 是否正在加载 */\r\n loading: boolean;\r\n /** 错误信息 */\r\n error: Error | null;\r\n /** 是否来自缓存 */\r\n fromCache: boolean;\r\n /** 获取时间戳 */\r\n timestamp: number | null;\r\n}\r\n\r\n/** 数据获取选项 */\r\nexport interface DataFetchOptions<T extends unknown = unknown> {\r\n /** 是否立即执行 */\r\n immediate?: boolean;\r\n /** 初始数据 */\r\n initialData?: T;\r\n /** 缓存键 */\r\n cacheKey?: string | (() => string);\r\n /** 缓存时间(毫秒) */\r\n cacheTime?: number;\r\n /** 是否服务端预取 */\r\n serverPrefetch?: boolean;\r\n /** 依赖项变化时重新获取 */\r\n watch?: Ref<unknown>[];\r\n /** 转换函数 */\r\n transform?: (data: unknown) => T;\r\n /** 错误处理 */\r\n onError?: (error: Error) => void;\r\n /** 成功处理 */\r\n onSuccess?: (data: T) => void;\r\n /** 重试次数 */\r\n retry?: number;\r\n /** 重试延迟(毫秒) */\r\n retryDelay?: number;\r\n}\r\n\r\n/** 预取数据条目 */\r\nexport interface PrefetchDataEntry {\r\n /** 缓存键 */\r\n key: string;\r\n /** 数据 */\r\n data: unknown;\r\n /** 时间戳 */\r\n timestamp: number;\r\n /** 过期时间 */\r\n expiresAt: number;\r\n}\r\n\r\n/** 预取管理器 */\r\nexport interface PrefetchManager {\r\n /** 预取数据 */\r\n prefetch<T>(key: string, fetcher: () => Promise<T>): Promise<T>;\r\n /** 获取预取数据 */\r\n getPrefetchedData<T>(key: string): T | undefined;\r\n /** 序列化所有预取数据 */\r\n serialize(): string;\r\n /** 反序列化预取数据 */\r\n deserialize(data: string): void;\r\n /** 清除预取数据 */\r\n clear(): void;\r\n}\r\n\r\n// ============================================================\r\n// 全局预取数据存储\r\n// ============================================================\r\n\r\nconst prefetchStore = new Map<string, PrefetchDataEntry>();\r\nconst pendingPrefetches = new Map<string, Promise<unknown>>();\r\n\r\n// ============================================================\r\n// 数据序列化\r\n// ============================================================\r\n\r\n/**\r\n * 序列化数据(支持特殊类型)\r\n */\r\nexport function serializeData(data: unknown): string {\r\n return JSON.stringify(data, (_key, value) => {\r\n // 处理特殊类型\r\n if (value instanceof Date) {\r\n return { __type: 'Date', __value: value.toISOString() };\r\n }\r\n if (value instanceof Map) {\r\n return { __type: 'Map', __value: Array.from(value.entries()) };\r\n }\r\n if (value instanceof Set) {\r\n return { __type: 'Set', __value: Array.from(value.values()) };\r\n }\r\n if (typeof value === 'bigint') {\r\n return { __type: 'BigInt', __value: value.toString() };\r\n }\r\n if (value === undefined) {\r\n return { __type: 'undefined' };\r\n }\r\n if (value instanceof Error) {\r\n return {\r\n __type: 'Error',\r\n __value: {\r\n name: value.name,\r\n message: value.message,\r\n stack: value.stack,\r\n },\r\n };\r\n }\r\n if (value instanceof RegExp) {\r\n return { __type: 'RegExp', __value: value.toString() };\r\n }\r\n return value as unknown;\r\n });\r\n}\r\n\r\n/**\r\n * 反序列化数据\r\n */\r\nexport function deserializeData(json: string): unknown {\r\n return JSON.parse(json, (_key, value) => {\r\n if (value && typeof value === 'object' && '__type' in value) {\r\n switch (value.__type) {\r\n case 'Date':\r\n return new Date(value.__value);\r\n case 'Map':\r\n return new Map(value.__value);\r\n case 'Set':\r\n return new Set(value.__value);\r\n case 'BigInt':\r\n return BigInt(value.__value);\r\n case 'undefined':\r\n return undefined;\r\n case 'Error': {\r\n const err = new Error(value.__value.message);\r\n err.name = value.__value.name;\r\n err.stack = value.__value.stack;\r\n return err;\r\n }\r\n case 'RegExp': {\r\n const match = value.__value.match(/^\\/(.*)\\/([gimsuy]*)$/);\r\n if (match) {\r\n return new RegExp(match[1], match[2]);\r\n }\r\n return new RegExp(value.__value);\r\n }\r\n }\r\n }\r\n return value;\r\n });\r\n}\r\n\r\n// ============================================================\r\n// 预取管理器\r\n// ============================================================\r\n\r\n/**\r\n * 创建预取管理器\r\n */\r\nexport function createPrefetchManager(): PrefetchManager {\r\n return {\r\n async prefetch<T>(key: string, fetcher: () => Promise<T>): Promise<T> {\r\n // 检查是否已有缓存\r\n const cached = prefetchStore.get(key);\r\n if (cached && cached.expiresAt > Date.now()) {\r\n return cached.data as T;\r\n }\r\n\r\n // 检查是否正在获取\r\n const pending = pendingPrefetches.get(key);\r\n if (pending) {\r\n return pending as Promise<T>;\r\n }\r\n\r\n // 开始获取\r\n const fetchPromise = fetcher();\r\n pendingPrefetches.set(key, fetchPromise);\r\n\r\n try {\r\n const data = await fetchPromise;\r\n const now = Date.now();\r\n\r\n prefetchStore.set(key, {\r\n key,\r\n data,\r\n timestamp: now,\r\n expiresAt: now + 5 * 60 * 1000, // 默认 5 分钟过期\r\n });\r\n\r\n return data;\r\n } finally {\r\n pendingPrefetches.delete(key);\r\n }\r\n },\r\n\r\n getPrefetchedData<T>(key: string): T | undefined {\r\n const entry = prefetchStore.get(key);\r\n if (entry && entry.expiresAt > Date.now()) {\r\n return entry.data as T;\r\n }\r\n return undefined;\r\n },\r\n\r\n serialize(): string {\r\n const entries = Array.from(prefetchStore.values());\r\n return serializeData(entries);\r\n },\r\n\r\n deserialize(data: string): void {\r\n const entries = deserializeData(data) as PrefetchDataEntry[];\r\n if (isArray(entries)) {\r\n for (const entry of entries) {\r\n prefetchStore.set(entry.key, entry);\r\n }\r\n }\r\n },\r\n\r\n clear(): void {\r\n prefetchStore.clear();\r\n pendingPrefetches.clear();\r\n },\r\n };\r\n}\r\n\r\n// ============================================================\r\n// useFetch 组合式函数\r\n// ============================================================\r\n\r\n/**\r\n * 组合式数据获取函数\r\n *\r\n * @example\r\n * ```ts\r\n * const { data, loading, error, refetch } = useFetch('/api/users', {\r\n * immediate: true,\r\n * cacheKey: 'users',\r\n * });\r\n * ```\r\n */\r\nexport function useFetch<T extends string | number | boolean | object | null = object>(\r\n url: string | (() => string),\r\n options: DataFetchOptions<T> = {},\r\n): {\r\n data: Ref<T | undefined>;\r\n loading: Ref<boolean>;\r\n error: Ref<Error | null>;\r\n refetch: () => Promise<void>;\r\n} {\r\n const {\r\n immediate = true,\r\n initialData,\r\n cacheKey,\r\n cacheTime = 5 * 60 * 1000,\r\n watch: watchDeps,\r\n transform,\r\n onError,\r\n onSuccess,\r\n retry = 0,\r\n retryDelay = 1000,\r\n } = options;\r\n\r\n const data = ref(initialData) as Ref<unknown> as Ref<T | undefined>;\r\n const loading = ref<boolean>(false);\r\n const error = ref<Error | null>(null);\r\n const fromCache = ref<boolean>(false);\r\n const timestamp = ref<number | null>(null);\r\n\r\n let retryCount = 0;\r\n\r\n const fetchData = async () => {\r\n const resolvedUrl = typeof url === 'function' ? url() : url;\r\n const resolvedCacheKey = typeof cacheKey === 'function' ? cacheKey() : cacheKey;\r\n\r\n // 检查缓存\r\n if (resolvedCacheKey) {\r\n const cached = prefetchStore.get(resolvedCacheKey);\r\n if (cached && cached.expiresAt > Date.now()) {\r\n data.value = cached.data as T;\r\n fromCache.value = true as boolean;\r\n timestamp.value = cached.timestamp;\r\n return;\r\n }\r\n\r\n // 检查服务端预取数据\r\n if (typeof window !== 'undefined') {\r\n const serverData = (window as any).__LYTJS_PREFETCH_DATA__;\r\n if (serverData && serverData[resolvedCacheKey]) {\r\n data.value = serverData[resolvedCacheKey] as T;\r\n fromCache.value = true as boolean;\r\n delete serverData[resolvedCacheKey];\r\n return;\r\n }\r\n }\r\n }\r\n\r\n loading.value = true as boolean;\r\n error.value = null;\r\n\r\n try {\r\n const response = await fetch(resolvedUrl);\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n let result = await response.json();\r\n\r\n // 应用转换\r\n if (transform) {\r\n result = transform(result as unknown) as T;\r\n }\r\n\r\n data.value = result as T;\r\n timestamp.value = Date.now();\r\n retryCount = 0;\r\n\r\n // 缓存数据\r\n if (resolvedCacheKey) {\r\n prefetchStore.set(resolvedCacheKey, {\r\n key: resolvedCacheKey,\r\n data: result,\r\n timestamp: timestamp.value,\r\n expiresAt: timestamp.value + cacheTime,\r\n });\r\n }\r\n\r\n onSuccess?.(result as T);\r\n } catch (err) {\r\n const fetchError = err instanceof Error ? err : new Error(String(err));\r\n error.value = fetchError;\r\n\r\n // 重试逻辑\r\n if (retryCount < retry) {\r\n retryCount++;\r\n setTimeout(fetchData, retryDelay);\r\n return;\r\n }\r\n\r\n onError?.(fetchError);\r\n } finally {\r\n loading.value = false;\r\n }\r\n };\r\n\r\n // 监听依赖变化\r\n if (watchDeps && watchDeps.length > 0) {\r\n watch(watchDeps, () => {\r\n fetchData();\r\n });\r\n }\r\n\r\n // 立即执行\r\n if (immediate) {\r\n fetchData();\r\n }\r\n\r\n return {\r\n data,\r\n loading,\r\n error,\r\n refetch: fetchData,\r\n };\r\n}\r\n\r\n// ============================================================\r\n// useAsyncData 组合式函数\r\n// ============================================================\r\n\r\n/**\r\n * 异步数据获取(类似 Nuxt useAsyncData)\r\n *\r\n * @example\r\n * ```ts\r\n * const { data, pending, error } = useAsyncData('users', () =>\r\n * $fetch('/api/users')\r\n * );\r\n * ```\r\n */\r\nexport function useAsyncData<T extends string | number | boolean | object | null = object>(\r\n key: string,\r\n fetcher: () => Promise<T>,\r\n options: DataFetchOptions<T> = {},\r\n): {\r\n data: Ref<T | undefined>;\r\n pending: Ref<boolean>;\r\n error: Ref<Error | null>;\r\n refresh: () => Promise<void>;\r\n} {\r\n const {\r\n immediate = true,\r\n initialData,\r\n transform,\r\n onError,\r\n onSuccess,\r\n } = options;\r\n\r\n const data = ref<T | undefined>(initialData);\r\n const pending = ref<boolean>(false);\r\n const error = ref<Error | null>(null);\r\n\r\n const execute = async () => {\r\n // 检查缓存\r\n const cached = prefetchStore.get(key);\r\n if (cached && cached.expiresAt > Date.now()) {\r\n data.value = cached.data as T;\r\n return;\r\n }\r\n\r\n // 检查服务端预取数据\r\n if (typeof window !== 'undefined') {\r\n const serverData = (window as any).__LYTJS_PREFETCH_DATA__;\r\n if (serverData && serverData[key]) {\r\n data.value = serverData[key] as T;\r\n delete serverData[key];\r\n return;\r\n }\r\n }\r\n\r\n pending.value = true as boolean;\r\n error.value = null;\r\n\r\n try {\r\n let result: T = await fetcher() as T;\r\n\r\n if (transform) {\r\n result = transform(result as unknown) as T;\r\n }\r\n\r\n data.value = result as T;\r\n\r\n // 缓存数据\r\n const now = Date.now();\r\n prefetchStore.set(key, {\r\n key,\r\n data: result,\r\n timestamp: now,\r\n expiresAt: now + (options.cacheTime || 5 * 60 * 1000),\r\n });\r\n\r\n onSuccess?.(result as T);\r\n } catch (err) {\r\n const fetchError = err instanceof Error ? err : new Error(String(err));\r\n error.value = fetchError;\r\n onError?.(fetchError);\r\n } finally {\r\n pending.value = false as boolean;\r\n }\r\n };\r\n\r\n if (immediate) {\r\n execute();\r\n }\r\n\r\n return {\r\n data,\r\n pending,\r\n error,\r\n refresh: execute,\r\n };\r\n}\r\n\r\n// ============================================================\r\n// 服务端数据注入\r\n// ============================================================\r\n\r\n/**\r\n * 注入服务端预取数据到 HTML\r\n */\r\nexport function injectPrefetchData(): string {\r\n const data: Record<string, unknown> = {};\r\n\r\n for (const [key, entry] of prefetchStore) {\r\n data[key] = entry.data;\r\n }\r\n\r\n if (Object.keys(data).length === 0) {\r\n return '';\r\n }\r\n\r\n return `<script>window.__LYTJS_PREFETCH_DATA__=${serializeData(data)};</script>`;\r\n}\r\n\r\n/**\r\n * 从客户端读取预取数据\r\n */\r\nexport function getPrefetchData<T = unknown>(key: string): T | undefined {\r\n // 先检查内存缓存\r\n const cached = prefetchStore.get(key);\r\n if (cached && cached.expiresAt > Date.now()) {\r\n return cached.data as T;\r\n }\r\n\r\n // 检查服务端注入的数据\r\n if (typeof window !== 'undefined') {\r\n const serverData = (window as any).__LYTJS_PREFETCH_DATA__;\r\n if (serverData && serverData[key]) {\r\n const data = serverData[key] as T;\r\n delete serverData[key];\r\n return data;\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n// ============================================================\r\n// 导出(函数已在上面定义)\r\n// ============================================================\r\n","/**\r\n * @lytjs/renderer\r\n * LytJS 框架的渲染后端\r\n * 提供 DOM、SSR 和 Vapor 渲染\r\n * FIX: P2-10 RENDERER-NEW-03 - 渲染器插件系统\r\n * FIX: P2-26 懒加载优化 - 大型模块使用动态导入\r\n */\r\n\r\n// 从 vdom 重新导出\r\n/** 创建渲染器 */\r\nexport { createRenderer } from '@lytjs/vdom';\r\nexport type { VNode, RendererOptions } from '@lytjs/vdom';\r\n\r\n// ==================== 渲染器插件系统 ====================\r\n\r\nimport type { VNode as VNodeType } from '@lytjs/vdom';\r\nimport { warn, error } from '@lytjs/common-error';\r\n\r\n/**\r\n * 渲染器插件接口\r\n * 插件可以挂载到渲染生命周期的各个阶段\r\n */\r\nexport interface RendererPlugin {\r\n /** 插件名称 */\r\n name: string;\r\n\r\n /** 插件安装时调用 */\r\n install: (context: PluginContext) => void;\r\n\r\n /** 可选:在 mount vnode 之前调用 */\r\n beforeMount?: (vnode: VNodeType) => void;\r\n\r\n /** 可选:在 mount vnode 之后调用 */\r\n afterMount?: (vnode: VNodeType, container: unknown) => void;\r\n\r\n /** 可选:在 patch vnode 之前调用 */\r\n beforePatch?: (oldVNode: VNodeType, newVNode: VNodeType) => void;\r\n\r\n /** 可选:在 patch vnode 之后调用 */\r\n afterPatch?: (vnode: VNodeType) => void;\r\n\r\n /** 可选:在 unmount vnode 之前调用 */\r\n beforeUnmount?: (vnode: VNodeType) => void;\r\n\r\n /** 可选:在 unmount vnode 之后调用 */\r\n afterUnmount?: (vnode: VNodeType) => void;\r\n}\r\n\r\n/**\r\n * 插件安装时传递的上下文\r\n */\r\nexport interface PluginContext {\r\n /** 为特定的生命周期事件注册钩子 */\r\n on: (event: LifecycleEvent, handler: HookHandler) => void;\r\n\r\n /** 移除已注册的钩子 */\r\n off: (event: LifecycleEvent, handler: HookHandler) => void;\r\n}\r\n\r\n/** 插件可以挂载的生命周期事件 */\r\nexport type LifecycleEvent =\r\n | 'beforeMount'\r\n | 'afterMount'\r\n | 'beforePatch'\r\n | 'afterPatch'\r\n | 'beforeUnmount'\r\n | 'afterUnmount';\r\n\r\n/** 钩子处理函数类型 */\r\nexport type HookHandler = (...args: unknown[]) => void;\r\n\r\n/** 插件注册表 */\r\nconst installedPlugins: RendererPlugin[] = [];\r\n\r\n/** 钩子注册表 */\r\nconst hooks: Record<LifecycleEvent, Set<HookHandler>> = {\r\n beforeMount: new Set(),\r\n afterMount: new Set(),\r\n beforePatch: new Set(),\r\n afterPatch: new Set(),\r\n beforeUnmount: new Set(),\r\n afterUnmount: new Set(),\r\n};\r\n\r\n/**\r\n * 安装渲染器插件。\r\n * 插件可以通过挂载生命周期事件来扩展渲染器的功能。\r\n *\r\n * @example\r\n * ```ts\r\n * // 创建插件\r\n * const myPlugin: RendererPlugin = {\r\n * name: 'MyPlugin',\r\n * install(context) {\r\n * context.on('beforeMount', (vnode) => {\r\n * console.log('Before mount:', vnode);\r\n * });\r\n * },\r\n * };\r\n *\r\n * // 使用插件\r\n * use(myPlugin);\r\n * ```\r\n */\r\nexport function use(plugin: RendererPlugin): void {\r\n if (installedPlugins.includes(plugin)) {\r\n if (__DEV__) {\r\n warn(`Plugin \"${plugin.name}\" has already been installed.`);\r\n }\r\n return;\r\n }\r\n\r\n // 创建插件上下文\r\n const context: PluginContext = {\r\n on: (event, handler) => {\r\n hooks[event].add(handler);\r\n },\r\n off: (event, handler) => {\r\n hooks[event].delete(handler);\r\n },\r\n };\r\n\r\n // 安装插件\r\n plugin.install(context);\r\n installedPlugins.push(plugin);\r\n\r\n // 注册插件的生命周期钩子(如果提供)\r\n // FIX: DTS build error - 类型断言\r\n if (plugin.beforeMount) hooks.beforeMount.add(plugin.beforeMount as HookHandler);\r\n if (plugin.afterMount) hooks.afterMount.add(plugin.afterMount as HookHandler);\r\n if (plugin.beforePatch) hooks.beforePatch.add(plugin.beforePatch as HookHandler);\r\n if (plugin.afterPatch) hooks.afterPatch.add(plugin.afterPatch as HookHandler);\r\n if (plugin.beforeUnmount) hooks.beforeUnmount.add(plugin.beforeUnmount as HookHandler);\r\n if (plugin.afterUnmount) hooks.afterUnmount.add(plugin.afterUnmount as HookHandler);\r\n}\r\n\r\n/**\r\n * 获取所有已安装的插件\r\n */\r\nexport function getInstalledPlugins(): readonly RendererPlugin[] {\r\n return [...installedPlugins];\r\n}\r\n\r\n/**\r\n * 检查插件是否已安装\r\n */\r\nexport function isPluginInstalled(pluginName: string): boolean {\r\n return installedPlugins.some((p) => p.name === pluginName);\r\n}\r\n\r\n/**\r\n * 按名称移除插件\r\n */\r\nexport function removePlugin(pluginName: string): boolean {\r\n const index = installedPlugins.findIndex((p) => p.name === pluginName);\r\n if (index === -1) return false;\r\n\r\n const plugin = installedPlugins[index]!;\r\n\r\n // 移除钩子\r\n // FIX: DTS build error - 类型断言\r\n if (plugin.beforeMount) hooks.beforeMount.delete(plugin.beforeMount as HookHandler);\r\n if (plugin.afterMount) hooks.afterMount.delete(plugin.afterMount as HookHandler);\r\n if (plugin.beforePatch) hooks.beforePatch.delete(plugin.beforePatch as HookHandler);\r\n if (plugin.afterPatch) hooks.afterPatch.delete(plugin.afterPatch as HookHandler);\r\n if (plugin.beforeUnmount) hooks.beforeUnmount.delete(plugin.beforeUnmount as HookHandler);\r\n if (plugin.afterUnmount) hooks.afterUnmount.delete(plugin.afterUnmount as HookHandler);\r\n\r\n installedPlugins.splice(index, 1);\r\n return true;\r\n}\r\n\r\n/**\r\n * 内部:执行生命周期事件的钩子\r\n * 由渲染器在适当的生命周期节点调用\r\n * FIX: P2-29 数组遍历优化 - 使用 for 循环替代 forEach\r\n */\r\nexport function executeHooks(event: LifecycleEvent, ...args: unknown[]): void {\r\n const handlers = hooks[event];\r\n // FIX: P2-29 使用 for 循环替代 forEach,避免函数调用开销\r\n // FIX: DTS build error - 类型断言\r\n for (const handler of handlers) {\r\n try {\r\n (handler as (...args: unknown[]) => void)(...args);\r\n } catch (e) {\r\n if (__DEV__) {\r\n error(`Error in ${event} hook: ${String(e)}`);\r\n }\r\n }\r\n }\r\n}\r\n\r\n// 导出类型\r\n// FIX: DTS build error - 删除重复的类型导出\r\nexport type { RendererPlugin as Plugin };\r\n\r\n// 从 reactivity 重新导出首次渲染优化\r\n/** 首次渲染优化 */\r\nexport {\r\n withFirstRenderOptimization,\r\n shouldSkipTracking,\r\n getSkippedTrackingCount,\r\n resetSkippedTrackingCount,\r\n} from '@lytjs/reactivity';\r\n\r\n// DOM 渲染器 - 从 @lytjs/adapter-web 重新导出\r\n/** 创建 DOM 渲染器 */\r\nexport { createDOMRenderer } from '@lytjs/adapter-web';\r\nexport type { DOMRenderer } from '@lytjs/adapter-web';\r\n\r\n// DOM 属性补丁操作 - 从 @lytjs/adapter-web 重新导出\r\n/** DOM 属性补丁操作 */\r\nexport {\r\n patchProp,\r\n patchClass,\r\n patchStyle,\r\n patchEvent,\r\n patchAttr,\r\n normalizeEventName,\r\n getEventKey,\r\n parseEventModifier,\r\n createInvoker,\r\n removeAllEventListeners,\r\n} from '@lytjs/adapter-web';\r\nexport type { ParsedEvent, EventInvoker } from '@lytjs/adapter-web';\r\n/** 事件名检测 */\r\nexport { isOn } from '@lytjs/common-events';\r\n\r\n// Hydration - 从 @lytjs/adapter-web 重新导出\r\n/** 创建水合(hydration)函数 */\r\nexport { createHydrationFunctions } from '@lytjs/adapter-web';\r\nexport type { HydrationRenderer } from '@lytjs/adapter-web';\r\n\r\n// 增强 Hydration API (Phase 1.15-1.17)\r\n/** Hydration 完善:全应用、选择性、错误恢复 */\r\nexport async function getEnhancedHydrationFunctions() {\r\n const hydration = await import('./hydration/enhanced-hydration');\r\n return {\r\n hydrateApp: hydration.hydrateApp,\r\n hydrateVisible: hydration.hydrateVisible,\r\n queueHydration: hydration.queueHydration,\r\n safeHydrate: hydration.safeHydrate,\r\n createHydrationErrorHandler: hydration.createHydrationErrorHandler,\r\n };\r\n}\r\nexport type {\r\n HydrationMode,\r\n HydrationOptions,\r\n HydrationError,\r\n HydrationMismatch,\r\n HydrationStats,\r\n RecoveryStrategy,\r\n} from './hydration/enhanced-hydration';\r\nexport { HydrationErrorHandler } from './hydration/enhanced-hydration';\r\n\r\n// 从 @lytjs/host-contract 重新导出\r\n/** 渲染器宿主抽象类型 */\r\nexport type {\r\n RendererHost,\r\n HostRect,\r\n HostStyleDeclaration,\r\n TransitionDurationInfo,\r\n HostEvent,\r\n HostEventHandler,\r\n HostEventOptions,\r\n} from '@lytjs/host-contract';\r\n\r\n// 从 @lytjs/adapter-web 重新导出\r\n/** Web 渲染器宿主实现 */\r\nexport { WebRendererHost, createWebHost, wrapDOMEvent } from '@lytjs/adapter-web';\r\n\r\n// FIX: P2-26 懒加载优化 - SSR 相关函数使用动态导入\r\n// SSR 渲染器\r\n/** 将组件渲染为字符串(SSR) */\r\nexport async function renderToString(input: { vnode: VNodeType }): Promise<string> {\r\n const { renderToString: _renderToString } = await import('./ssr/ssr-renderer');\r\n return _renderToString(input);\r\n}\r\nexport type { SSRInput } from './ssr/ssr-renderer';\r\n\r\n// SSR 流式渲染\r\n/** 将 VNode 树流式渲染为 ReadableStream(SSR Streaming) */\r\nexport async function renderToStream(\r\n input: { vnode: unknown },\r\n options?: { commentMarkers?: boolean },\r\n): Promise<ReadableStream> {\r\n const { renderToStream: _renderToStream } = await import('./ssr/ssr-stream');\r\n return _renderToStream(input as { vnode: VNodeType }, options);\r\n}\r\nexport type { SSRStreamOptions } from './ssr/ssr-stream';\r\n\r\n// 优化的流式渲染 (Phase 1.5)\r\n/** 优化的流式渲染 - TTFB 降低 50%+ */\r\nexport async function createOptimizedStream(\r\n vnode: unknown,\r\n options?: unknown,\r\n): Promise<ReadableStream> {\r\n const { createOptimizedStream: _createOptimizedStream } = await import('./ssr/ssr-stream-optimized');\r\n return _createOptimizedStream(vnode as VNodeType, options as any);\r\n}\r\nexport async function renderDocumentToStream(\r\n vnode: unknown,\r\n options?: unknown,\r\n): Promise<ReadableStream> {\r\n const { renderDocumentToStream: _renderDocumentToStream } = await import('./ssr/ssr-stream-optimized');\r\n return _renderDocumentToStream(vnode as VNodeType, options as any);\r\n}\r\nexport type {\r\n OptimizedStreamOptions,\r\n PreloadHint,\r\n StreamStats,\r\n} from './ssr/ssr-stream-optimized';\r\nexport { OptimizedSSRStream } from './ssr/ssr-stream-optimized';\r\n\r\n// SSR Island 架构\r\n/** Island Architecture 相关函数 */\r\nimport type { ComponentOptions } from './ssr/ssr-island';\r\nexport async function hydrateIsland(\r\n el: Element,\r\n component: ComponentOptions,\r\n props?: Record<string, unknown>,\r\n): Promise<void> {\r\n const { hydrateIsland: _hydrateIsland } = await import('./ssr/ssr-island');\r\n return _hydrateIsland(el, component, props);\r\n}\r\nexport async function registerIslandComponent(\r\n name: string,\r\n component: ComponentOptions,\r\n): Promise<void> {\r\n const { registerIslandComponent: _registerIslandComponent } = await import('./ssr/ssr-island');\r\n return _registerIslandComponent(name, component);\r\n}\r\nexport async function createIslandSSRContent(\r\n name: string,\r\n props: Record<string, unknown> = {},\r\n): Promise<string> {\r\n const { createIslandSSRContent: _createIslandSSRContent } = await import('./ssr/ssr-island');\r\n return _createIslandSSRContent(name, props);\r\n}\r\nexport type { ComponentOptions as IslandComponentOptions } from './ssr/ssr-island';\r\n\r\n// Signal 渲染器\r\n/** 创建 Signal 模式渲染器(细粒度 DOM 更新) */\r\n// FIX: DTS build error - 修复参数数量\r\nexport async function createSignalRenderer(\r\n template: string = '',\r\n context: Record<string, unknown> = {},\r\n) {\r\n const { createSignalRenderer: _createSignalRenderer } = await import('./signal/signal-renderer');\r\n return _createSignalRenderer(template, context);\r\n}\r\nexport type { SignalRenderer } from './signal/signal-renderer';\r\n\r\n// Vapor 渲染器(Signal 渲染器的别名)\r\n/** 创建 Vapor 模式渲染器(Signal 渲染器的别名) */\r\n// FIX: DTS build error - 修复参数数量\r\nexport async function createVaporRenderer(\r\n template: string = '',\r\n context: Record<string, unknown> = {},\r\n) {\r\n const { createSignalRenderer: _createSignalRenderer } = await import('./signal/signal-renderer');\r\n return _createSignalRenderer(template, context);\r\n}\r\nexport type { SignalRenderer as VaporRenderer } from './signal/signal-renderer';\r\n\r\n// Vapor 应用 API\r\n/** 定义 Vapor 模式组件 */\r\n// FIX: DTS build error - 添加类型断言\r\nexport async function defineVaporComponent(options: unknown) {\r\n const { defineVaporComponent: _defineVaporComponent } = await import('./vapor/vapor-app');\r\n return _defineVaporComponent(options as Parameters<typeof _defineVaporComponent>[0]);\r\n}\r\nexport async function createVaporApp(rootComponent: unknown, props?: Record<string, unknown>) {\r\n const { createVaporApp: _createVaporApp } = await import('./vapor/vapor-app');\r\n return _createVaporApp(rootComponent as Parameters<typeof _createVaporApp>[0], props);\r\n}\r\nexport type {\r\n VaporComponentOptions,\r\n VaporComponentDefinition,\r\n VaporApp,\r\n VaporAppOptions,\r\n VaporContext,\r\n PropOptions as VaporPropOptions,\r\n} from './vapor/vapor-app';\r\n\r\n// Vapor HMR API (Phase 1.2)\r\n/** Vapor 模式 HMR 支持 */\r\nexport async function getVaporHMRFunctions() {\r\n const vaporHMR = await import('./vapor/vapor-hmr');\r\n return {\r\n generateComponentId: vaporHMR.generateComponentId,\r\n registerComponent: vaporHMR.registerComponent,\r\n unregisterComponent: vaporHMR.unregisterComponent,\r\n handleComponentUpdate: vaporHMR.handleComponentUpdate,\r\n createVaporHMRHandler: vaporHMR.createVaporHMRHandler,\r\n isHMRAvailable: vaporHMR.isHMRAvailable,\r\n forceRerender: vaporHMR.forceRerender,\r\n clearHMRState: vaporHMR.clearHMRState,\r\n onHMRUpdate: vaporHMR.onHMRUpdate,\r\n };\r\n}\r\nexport type {\r\n HMRUpdateType,\r\n HMRUpdate,\r\n HMRStatePreservation,\r\n} from './vapor/vapor-hmr';\r\nexport { DEFAULT_STATE_PRESERVATION } from './vapor/vapor-hmr';\r\n\r\n// Vapor SSR API (Phase 1.3)\r\n/** Vapor 模式 SSR 支持 */\r\nexport async function renderVaporToString(\r\n component: unknown,\r\n props?: Record<string, unknown>,\r\n options?: unknown,\r\n) {\r\n const { renderVaporToString: _renderVaporToString } = await import('./vapor/vapor-ssr');\r\n return _renderVaporToString(\r\n component as Parameters<typeof _renderVaporToString>[0],\r\n props as Parameters<typeof _renderVaporToString>[1],\r\n options as Parameters<typeof _renderVaporToString>[2],\r\n );\r\n}\r\nexport async function renderVaporToStream(\r\n component: unknown,\r\n props?: Record<string, unknown>,\r\n options?: unknown,\r\n) {\r\n const { renderVaporToStream: _renderVaporToStream } = await import('./vapor/vapor-ssr');\r\n return _renderVaporToStream(\r\n component as Parameters<typeof _renderVaporToStream>[0],\r\n props as Parameters<typeof _renderVaporToStream>[1],\r\n options as Parameters<typeof _renderVaporToStream>[2],\r\n );\r\n}\r\nexport async function hydrateVaporComponent(\r\n container: Element | string,\r\n component: unknown,\r\n options?: unknown,\r\n) {\r\n const { hydrateVaporComponent: _hydrateVaporComponent } = await import('./vapor/vapor-ssr');\r\n return _hydrateVaporComponent(\r\n container,\r\n component as Parameters<typeof _hydrateVaporComponent>[1],\r\n options as Parameters<typeof _hydrateVaporComponent>[2],\r\n );\r\n}\r\nexport type {\r\n VaporSSROptions,\r\n VaporSSRResult,\r\n VaporSSRStreamResult,\r\n VaporHydrationOptions,\r\n} from './vapor/vapor-ssr';\r\nexport { definePrefetch, usePrefetchData } from './vapor/vapor-ssr';\r\n\r\n// 组件资源清理\r\n/** 组件资源自动清理:注册事件监听器、effect 订阅、cleanup 钩子,卸载时自动释放 */\r\nexport {\r\n registerComponentEventListener,\r\n registerComponentEffectSubscription,\r\n registerComponentCleanup,\r\n cleanupComponentResources,\r\n} from './unmount';\r\nexport type { ResourceCleanupRenderer } from './unmount';\r\n\r\n// 工具函数\r\n/** HTML 转义、布尔属性判断等工具函数 */\r\nexport { escapeHtml, isBooleanAttr, isVoidElement } from './utils';\r\n\r\n// Server Components API (Phase 1.4)\r\n/** Server Components 服务端运行时 */\r\nexport async function getServerComponentFunctions() {\r\n const serverComponents = await import('./server/server-components');\r\n return {\r\n registerServerComponent: serverComponents.registerServerComponent,\r\n registerServerFunction: serverComponents.registerServerFunction,\r\n getServerComponent: serverComponents.getServerComponent,\r\n getServerFunction: serverComponents.getServerFunction,\r\n handleServerAction: serverComponents.handleServerAction,\r\n createServerActionHandler: serverComponents.createServerActionHandler,\r\n serializeServerData: serverComponents.serializeServerData,\r\n deserializeServerData: serverComponents.deserializeServerData,\r\n renderServerComponent: serverComponents.renderServerComponent,\r\n defineServerComponent: serverComponents.defineServerComponent,\r\n };\r\n}\r\nexport type {\r\n ServerComponentDefinition,\r\n ServerActionRequest,\r\n ServerActionResponse,\r\n} from './server/server-components';\r\n\r\n/** Server Components 客户端运行时 */\r\nexport async function getServerComponentClientFunctions() {\r\n const client = await import('./client/server-components-client');\r\n return {\r\n callServer: client.callServer,\r\n createServerFunction: client.createServerFunction,\r\n getServerData: client.getServerData,\r\n hasServerData: client.hasServerData,\r\n isHydrated: client.isHydrated,\r\n markHydrated: client.markHydrated,\r\n getHydrationState: client.getHydrationState,\r\n autoHydrate: client.autoHydrate,\r\n configureServerAction: client.configureServerAction,\r\n };\r\n}\r\n\r\n// 数据获取 API (Phase 1.7)\r\n/** 数据获取集成 */\r\nexport async function getDataFetchingFunctions() {\r\n const data = await import('./data/data-fetching');\r\n return {\r\n serializeData: data.serializeData,\r\n deserializeData: data.deserializeData,\r\n createPrefetchManager: data.createPrefetchManager,\r\n useFetch: data.useFetch,\r\n useAsyncData: data.useAsyncData,\r\n injectPrefetchData: data.injectPrefetchData,\r\n getPrefetchData: data.getPrefetchData,\r\n };\r\n}\r\nexport type {\r\n DataFetchState,\r\n DataFetchOptions,\r\n PrefetchDataEntry,\r\n PrefetchManager,\r\n} from './data/data-fetching';\r\n","/**\r\n * @lytjs/renderer - Component Resource Cleanup\r\n *\r\n * 基于 WeakMap 的组件资源清理注册表。\r\n * 组件卸载时自动清理所有注册的事件监听器、effect 订阅和 cleanup 钩子。\r\n */\r\n\r\n// ==================== 类型定义 ====================\r\n\r\n\r\n/** 事件监听器注册条目 */\r\ninterface EventListenerEntry {\r\n el: unknown;\r\n event: string;\r\n handler: (...args: unknown[]) => void;\r\n options?: unknown;\r\n}\r\n\r\n/** 渲染器接口(仅需 removeEventListener 方法) */\r\nexport interface ResourceCleanupRenderer {\r\n removeEventListener(\r\n el: unknown,\r\n event: string,\r\n handler: (...args: unknown[]) => void,\r\n options?: unknown,\r\n ): void;\r\n}\r\n\r\n// ==================== 三层 WeakMap 清理注册表 ====================\r\n\r\n/**\r\n * 事件监听器注册表\r\n * key: 组件实例, value: 该组件注册的所有事件监听器条目\r\n */\r\nconst eventListenerRegistry = new WeakMap<object, EventListenerEntry[]>();\r\n\r\n/**\r\n * effect 订阅注册表\r\n * key: 组件实例, value: 该组件注册的所有 effect dispose 函数\r\n */\r\nconst effectSubscriptionRegistry = new WeakMap<object, Array<() => void>>();\r\n\r\n/**\r\n * cleanup 钩子注册表\r\n * key: 组件实例, value: 该组件注册的所有通用清理回调\r\n */\r\nconst cleanupHookRegistry = new WeakMap<object, Array<() => void>>();\r\n\r\n// ==================== 注册函数 ====================\r\n\r\n/**\r\n * 注册组件事件监听器。\r\n * 组件卸载时将自动调用 renderer.removeEventListener 移除该监听器。\r\n *\r\n * @param component - 组件实例(作为 WeakMap key)\r\n * @param el - 事件目标元素\r\n * @param event - 事件名称\r\n * @param handler - 事件处理函数\r\n * @param options - 可选的 addEventListener 选项\r\n */\r\nexport function registerComponentEventListener(\r\n component: object,\r\n el: unknown,\r\n event: string,\r\n handler: (...args: unknown[]) => void,\r\n options?: unknown,\r\n): void {\r\n let listeners = eventListenerRegistry.get(component);\r\n if (!listeners) {\r\n listeners = [];\r\n eventListenerRegistry.set(component, listeners);\r\n }\r\n listeners.push({ el, event, handler, options });\r\n}\r\n\r\n/**\r\n * 注册 effect 订阅。\r\n * 组件卸载时将自动调用 dispose 函数停止 effect。\r\n *\r\n * @param component - 组件实例(作为 WeakMap key)\r\n * @param dispose - effect 的 dispose 回调函数\r\n */\r\nexport function registerComponentEffectSubscription(component: object, dispose: () => void): void {\r\n let subscriptions = effectSubscriptionRegistry.get(component);\r\n if (!subscriptions) {\r\n subscriptions = [];\r\n effectSubscriptionRegistry.set(component, subscriptions);\r\n }\r\n subscriptions.push(dispose);\r\n}\r\n\r\n/**\r\n * 注册通用 cleanup 钩子。\r\n * 组件卸载时将按注册顺序执行该回调。\r\n *\r\n * @param component - 组件实例(作为 WeakMap key)\r\n * @param cleanup - 清理回调函数\r\n */\r\nexport function registerComponentCleanup(component: object, cleanup: () => void): void {\r\n let cleanups = cleanupHookRegistry.get(component);\r\n if (!cleanups) {\r\n cleanups = [];\r\n cleanupHookRegistry.set(component, cleanups);\r\n }\r\n cleanups.push(cleanup);\r\n}\r\n\r\n// ==================== 统一清理函数 ====================\r\n\r\n/**\r\n * 统一清理组件所有注册资源。\r\n *\r\n * 清理顺序:\r\n * 1. cleanup 钩子(可能依赖 effect 仍活跃)\r\n * 2. effect 订阅(停止响应式追踪)\r\n * 3. 事件监听器(DOM 操作,最后执行)\r\n *\r\n * 每个清理操作均通过 try-catch 保护,单个失败不影响其余流程。\r\n *\r\n * @param renderer - 渲染器实例,需提供 removeEventListener 方法\r\n * @param component - 要清理资源的组件实例\r\n */\r\nexport function cleanupComponentResources(\r\n renderer: ResourceCleanupRenderer,\r\n component: object,\r\n): void {\r\n // 1. 执行 cleanup 钩子\r\n const cleanups = cleanupHookRegistry.get(component);\r\n if (cleanups) {\r\n for (const cleanup of cleanups) {\r\n try {\r\n cleanup();\r\n } catch (err) {\r\n if (__DEV__) console.warn('[lytjs/cleanup] Error during cleanup:', err);\r\n }\r\n }\r\n cleanupHookRegistry.delete(component);\r\n }\r\n\r\n // 2. 清理 effect 订阅\r\n const subscriptions = effectSubscriptionRegistry.get(component);\r\n if (subscriptions) {\r\n for (const dispose of subscriptions) {\r\n try {\r\n dispose();\r\n } catch (err) {\r\n if (__DEV__) console.warn('[lytjs/cleanup] Error during cleanup:', err);\r\n }\r\n }\r\n effectSubscriptionRegistry.delete(component);\r\n }\r\n\r\n // 3. 清理事件监听器\r\n const listeners = eventListenerRegistry.get(component);\r\n if (listeners) {\r\n for (const { el, event, handler, options } of listeners) {\r\n try {\r\n renderer.removeEventListener(el, event, handler, options);\r\n } catch (err) {\r\n if (__DEV__) console.warn('[lytjs/cleanup] Error during cleanup:', err);\r\n }\r\n }\r\n eventListenerRegistry.delete(component);\r\n }\r\n}\r\n"]}
|