# ResourceShare.js 系统原理文档 (V1.3.7.4) **版本:** V1.3.7.5 **发布日期:** 2026 **开发团队:** GVSDS Team **许可协议:** MIT License --- ## 1. 系统概述 `ResourceShare.js` 是一个高性能的跨域资源共享系统,专门设计用于解决复杂 Web 应用(特别是包含大量 iframe 嵌套的单页应用)中的资源重复加载、依赖管理混乱以及脚本执行顺序不可控等问题。 ### 1.1 核心特性 * **跨级资源共享:** 利用 `postMessage` 和 `Blob URL` 技术,使得同源下的子页面可以直接复用父页面已加载的 JS/CSS 资源,极大减少网络请求。 * **智能脚本阻塞:** 在资源加载期间自动阻塞页面上的业务脚本,确保核心依赖(如 jQuery, Layui)先于业务代码执行。 * **虚拟路径映射:** 为内联脚本和远程加载的脚本生成带 `VM_` 前缀的 SourceURL,解决调试时代码定位混乱的问题。 * **可视化 UI 面板:** 提供原生 JavaScript 编写的加载日志、进度条和错误诊断面板,无需依赖第三方 UI 库。 * **自动诊断系统:** 内置规则引擎,能够识别常见的错误(如 jQuery 未定义、CORS 错误)并给出修复建议。 --- ## 2. 架构设计 系统采用模块化类结构设计,主要分为以下几个核心部分: ### 2.1 类结构概览 1. **`ResourceShareManager` (核心管理器)**: 负责资源加载、缓存管理、脚本拦截、跨页面通信协调。 2. **`ResourceShareUI` (UI 管理器)**: 负责 DOM 元素的渲染(启动页、进度条、日志面板、错误弹窗)。 3. **`ResourceShareLogger` (日志系统)**: 统一日志输出入口,负责根据配置过滤日志,并分发到 DevTools 控制台和 UI 面板。 4. **`ResourceShareElement` (Web Components)**: 自定义标签 ``,用于声明页面需要加载的依赖资源。 ### 2.2 初始化流程 1. **配置合并**: 脚本加载时,首先执行 `deepMerge`,将用户定义的 `window.RS_CONFIG` 与系统默认配置合并。 2. **单例检测**: 检查 `window.resourceShareManager` 是否存在,若不存在则实例化。 3. **环境检测**: 判断当前页面是 `Top Level` (顶级父页面) 还是 `Sub Level` (子页面)。 4. **组件初始化**: * 初始化 Logger。 * 若 `ENABLE_UI` 为 true,初始化 UI 并显示启动屏。 5. **DOM 扫描**: 监听 `DOMContentLoaded`,扫描页面中的 `` 标签,构建加载队列。 --- ## 3. 核心机制详解 ### 3.1 资源加载与缓存策略 系统采用“源驱动,缓存优先”的策略。 * **队列机制**: 扫描到的 `` 标签会被推入 `resourceExecutionQueue`。系统严格按顺序处理队列,确保依赖关系(例如 jQuery 必须在业务插件前加载)。 * **顶级页面**: 1. 检查本地内存缓存 (`this.cache`)。 2. 若未缓存,发起 `fetch` 请求。 3. **重试机制**: 内置请求失败重试逻辑(默认 3 次,间隔 1.5s),提高弱网环境下的成功率。 4. **缓存决策**: * 小于 `POST_MESSAGE_LIMIT` (1MB):存储为字符串文本。 * 大于阈值:转换为 `Blob URL` 并存储,防止 `postMessage` 数据过大导致报错。 * **子页面**: 1. 先通过 `postMessage` 向父页面请求资源 (`resource-request`)。 2. 父页面若缓存,直接返回数据(文本或 Blob URL)。 3. 父页面若未缓存,子页面回退到直接 `fetch`,并将结果同步给父页面更新缓存。 ### 3.2 智能脚本阻塞系统 为了防止业务脚本在依赖库加载完成前执行,系统劫持了 DOM 操作。 1. **拦截目标**: * 页面初始化时已存在的 ` ``` ### 7.2 iframe 子页面自动共享 **父页面**: ```html ``` **子页面**: ```html ``` --- ## 8. 注意事项与最佳实践 1. **同源限制**: 资源共享主要基于 `postMessage`,在严格跨域(Top-Level Domain 不同)场景下,子页面将回退到独立加载模式,但不会报错。 2. **Blob URL 清理**: 系统在页面卸载 (`beforeunload`) 时会自动清理生成的 Blob URL,防止内存泄漏。 3. **脚本顺序**: 请严格按照依赖顺序在 HTML 中编写 `` 标签,系统不会自动分析依赖拓扑。 4. **调试建议**: 开发环境下建议设置 `RS_CONFIG.LOG_LEVEL_DEVTOOLS = 'debug'` 以查看详细的加载链路日志。