Files
SMANAGE/TempLate/ProJect/ResourceShare/index.html
T
2026-06-16 11:55:14 +08:00

723 lines
48 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<style>
:root {
--color-primary: #0891b2;
--color-secondary: #64748b;
--color-dark: #0f172a;
--color-light: #f8fafc;
--color-surface: #ffffff;
--border-light: #e2e8f0;
--bg-glass: rgba(255, 255, 255, 0.7)
}
body {
background-color: var(--color-light);
color: var(--color-dark);
background-image: radial-gradient(circle at 10% 20%,rgba(8,145,178,.05) 0,transparent 20%),radial-gradient(circle at 90% 80%,rgba(99,102,241,.05) 0,transparent 20%);
background-attachment: fixed;
font-feature-settings: "cv11","ss01"
}
.code-block {
background-color: #1e293b;
color: #e2e8f0;
border-radius: .5rem;
padding: 1rem;
font-family: Consolas,Monaco,monospace;
font-size: .85rem;
overflow-x: auto;
position: relative;
border: 1px solid #334155
}
.code-block::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 4px;
background: linear-gradient(90deg,var(--color-primary),#6366f1)
}
::-webkit-scrollbar {
width: 8px;
height: 8px
}
::-webkit-scrollbar-track {
background: 0 0
}
::-webkit-scrollbar-thumb {
background: #cbd5e1;
border-radius: 4px
}
::-webkit-scrollbar-thumb:hover {
background: #94a3b8
}
.fade-in-up {
animation: fadeInUp .8s cubic-bezier(.16,1,.3,1) forwards;
opacity: 0;
transform: translateY(20px)
}
@keyframes fadeInUp {
to {
opacity: 1;
transform: translateY(0)
}
}
.delay-100 {
animation-delay: .1s
}
.delay-200 {
animation-delay: .2s
}
.delay-300 {
animation-delay: .3s
}
.tech-grid {
background-size: 40px 40px;
background-image: linear-gradient(to right,rgba(148,163,184,.1) 1px,transparent 1px),linear-gradient(to bottom,rgba(148,163,184,.1) 1px,transparent 1px);
mask-image: linear-gradient(to bottom,black 40%,transparent 100%);
-webkit-mask-image: linear-gradient(to bottom,black 40%,transparent 100%)
}
</style>
<div class="antialiased selection:bg-cyan-200 selection:text-cyan-900">
<section class="relative pt-16 pb-20 lg:pt-24 lg:pb-32 overflow-hidden">
<div class="absolute inset-0 tech-grid -z-10"></div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<div class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-cyan-50 border border-cyan-100 text-cyan-700 text-xs font-semibold mb-8 fade-in-up"> <span class="w-2 h-2 rounded-full bg-cyan-500 animate-pulse"></span> 架构重构 V1.3.7.2 发布 </div>
<h1 class="text-5xl md:text-7xl font-extrabold text-slate-900 tracking-tight mb-8 fade-in-up delay-100">ResourceShare 企业级跨域<br> <span class="text-transparent bg-clip-text bg-gradient-to-r from-cyan-600 to-blue-600">资源共享解决方案</span> </h1>
<p class="mt-4 max-w-2xl mx-auto text-xl text-slate-600 fade-in-up delay-200"> 如同瑞士军刀一般,解决 iframe 资源加载瓶颈。支持 VM 虚拟路径映射、Blob 传输优化、可视化 UI 监控以及智能错误诊断。 <br class="hidden sm:block"> 为大规模复杂 Web 应用打造的高性能底层引擎。 </p>
<div class="mt-10 flex justify-center gap-4 fade-in-up delay-300">
<a href="#features" class="px-8 py-3.5 rounded-lg bg-cyan-600 text-white font-semibold shadow-lg shadow-cyan-200 hover:bg-cyan-700 transition-all hover:-translate-y-1"> 探索功能 </a>
<a href="https://github.com/GVSADS/ResourceShare/" target="_blank" class="px-8 py-3.5 rounded-lg bg-white text-slate-700 border border-slate-200 font-semibold shadow-tech hover:bg-slate-50 transition-all"> 查看 Github 项目 </a>
</div>
<div class="mt-20 relative rounded-2xl bg-slate-900 border border-slate-200 shadow-2xl overflow-hidden fade-in-up delay-300 mx-auto max-w-5xl">
<div class="flex items-center gap-2 px-4 py-3 bg-white border-b border-slate-100 h-10">
<div class="flex gap-1.5">
<div class="w-3 h-3 rounded-full bg-red-400"></div>
<div class="w-3 h-3 rounded-full bg-yellow-400"></div>
<div class="w-3 h-3 rounded-full bg-green-400"></div>
</div>
<div class="flex-1 flex items-center justify-center text-center text-xs font-mono text-slate-400">
ResourceShare Monitor Panel
</div>
</div>
<div class="aspect-[16/9] bg-slate-50 relative flex items-center justify-center p-8 overflow-hidden">
<iframe
src="./example.html"
class="absolute inset-0 w-full h-full border-0 rounded-md"
title="RS Demo"
frameborder="0"
loading="lazy"
></iframe>
</div>
</div>
</div>
</section>
<section id="features" class="py-24 bg-white relative">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16">
<h2 class="text-3xl font-bold text-slate-900 sm:text-4xl">全链路性能与体验优化</h2>
<p class="mt-4 text-lg text-slate-600">不仅仅是加载脚本,而是提供一套完整的资源治理方案。</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<div class="p-8 rounded-2xl bg-slate-50 border border-slate-100 hover:border-cyan-200 hover:shadow-lg transition-all group">
<div class="w-12 h-12 rounded-lg bg-cyan-100 flex items-center justify-center text-cyan-600 mb-6 group-hover:scale-110 transition-transform"> <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path>
</svg> </div>
<h3 class="text-xl font-bold text-slate-900 mb-3">高性能传输</h3>
<p class="text-slate-600 leading-relaxed"> 智能判断资源体积。小于 1MB 使用 PostMessage 直接传输,超大文件自动切换为 Blob URL 方式,突破浏览器消息传递限制。 </p>
</div>
<div class="p-8 rounded-2xl bg-slate-50 border border-slate-100 hover:border-cyan-200 hover:shadow-lg transition-all group">
<div class="w-12 h-12 rounded-lg bg-blue-100 flex items-center justify-center text-blue-600 mb-6 group-hover:scale-110 transition-transform"> <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"></path>
</svg> </div>
<h3 class="text-xl font-bold text-slate-900 mb-3">虚拟路径映射 (V1.3.7.2)</h3>
<p class="text-slate-600 leading-relaxed"> 自动为远程资源生成 <code>VM_</code> 前缀的虚拟文件名(如 <code>VM_jquery.min.js</code>),保留完整的 SourceURL 路径层级,极大提升开发者调试体验。 </p>
</div>
<div class="p-8 rounded-2xl bg-slate-50 border border-slate-100 hover:border-cyan-200 hover:shadow-lg transition-all group">
<div class="w-12 h-12 rounded-lg bg-indigo-100 flex items-center justify-center text-indigo-600 mb-6 group-hover:scale-110 transition-transform"> <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path>
</svg> </div>
<h3 class="text-xl font-bold text-slate-900 mb-3">智能错误诊断</h3>
<p class="text-slate-600 leading-relaxed"> 内置规则引擎,自动识别常见的加载错误(如 jQuery 缺失、CORS 限制),并提供具体的解决方案建议,告别无头苍蝇式排查。 </p>
</div>
</div>
</div>
</section>
<section id="architecture" class="py-24 bg-slate-50 overflow-hidden">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid lg:grid-cols-2 gap-16 items-center">
<div>
<div class="inline-block px-3 py-1 bg-blue-50 text-blue-600 rounded-full text-xs font-bold tracking-wider mb-4">ARCHITECTURE</div>
<h2 class="text-3xl font-bold text-slate-900 mb-6">可视化 UI 管理系统</h2>
<p class="text-slate-600 mb-6 leading-relaxed"> 系统内置了一套基于 Web Components 的轻量级 UI 管理器。通过毛玻璃风格的悬浮面板,您可以实时监控资源加载进度、查看分类日志,甚至在发生严重错误时通过遮罩层获取诊断信息。 </p>
<ul class="space-y-4">
<li class="flex items-start">
<div class="flex-shrink-0 w-6 h-6 rounded-full bg-green-100 flex items-center justify-center mt-0.5"> <svg class="w-4 h-4 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg> </div>
<div class="ml-3">
<h4 class="text-base font-semibold text-slate-900">启动页与进度条</h4>
<p class="text-sm text-slate-500 mt-1">优雅的加载动画,缓解用户等待焦虑。</p>
</div>
</li>
<li class="flex items-start">
<div class="flex-shrink-0 w-6 h-6 rounded-full bg-green-100 flex items-center justify-center mt-0.5"> <svg class="w-4 h-4 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg> </div>
<div class="ml-3">
<h4 class="text-base font-semibold text-slate-900">分级日志控制</h4>
<p class="text-sm text-slate-500 mt-1">UI 日志与 DevTools 日志独立控制,生产环境可完全关闭 UI 日志以节省性能。</p>
</div>
</li>
</ul>
</div>
<div class="relative">
<div class="absolute -inset-4 bg-gradient-to-r from-cyan-100 to-blue-100 rounded-2xl -z-10 transform rotate-1"></div>
<div class="bg-white rounded-xl shadow-xl overflow-hidden border border-slate-200">
<div class="px-6 py-4 border-b border-slate-100 bg-slate-50/50 flex justify-between items-center"> <span class="text-sm font-bold text-slate-700">RS_CONFIG.js</span> <span class="text-xs text-slate-400 font-mono">V1.3.7.2</span> </div>
<div class="p-0">
<pre class="code-block !rounded-t-none !border-t-0" style="
overflow-y: scroll;
height: 300px;
"><span class="text-purple-400">window</span>.RS_CONFIG = {
<span class="text-blue-400">VERSION</span>: <span class="text-green-400">'1.3.7.2'</span>, <span class="text-slate-500">// 当前系统版本号</span>
<span class="text-blue-400">COPYRIGHT</span>: <span class="text-green-400">'© 2026 GVSDS Team'</span>, <span class="text-slate-500">// 版权声明</span>
<span class="text-blue-400">SOURCE_FILE</span>: <span class="text-green-400">'ResourceShare.js'</span>, <span class="text-slate-500">// 源文件标识名称</span>
<span class="text-blue-400">ENABLE_UI</span>: <span class="text-orange-400">true</span>, <span class="text-slate-500">// 是否启用可视化界面 (启动页/日志/弹窗)</span>
<span class="text-blue-400">POST_MESSAGE_LIMIT</span>: <span class="text-purple-400">1</span> * <span class="text-purple-400">1024</span> * <span class="text-purple-400">1024</span>, <span class="text-slate-500">// 消息传输大小阈值 (1MB),超过转Blob</span>
<span class="text-blue-400">BLOB_LIMIT</span>: <span class="text-purple-400">1024</span> * <span class="text-purple-400">1024</span> * <span class="text-purple-400">1024</span>, <span class="text-slate-500">// Blob数据处理限制 (1GB),防内存溢出</span>
<span class="text-blue-400">SCRIPT_TIMEOUT</span>: <span class="text-purple-400">5</span> * <span class="text-purple-400">60</span> * <span class="text-purple-400">1000</span>, <span class="text-slate-500">// 脚本加载超时时间 (5分钟),超时强制释放</span>
<span class="text-blue-400">PING_INTERVAL</span>: <span class="text-purple-400">100</span>, <span class="text-slate-500">// 子页向父页握手间隔</span>
<span class="text-blue-400">PING_TIMEOUT</span>: <span class="text-purple-400">5000</span>, <span class="text-slate-500">// 父页握手响应超时 (5秒)</span>
<span class="text-blue-400">REQUEST_TIMEOUT</span>: <span class="text-purple-400">10000</span>, <span class="text-slate-500">// 资源请求超时 (10秒)</span>
<span class="text-blue-400">RETRY</span>: {
<span class="text-blue-400">COUNT</span>: <span class="text-purple-400">3</span>, <span class="text-slate-500">// 失败重试次数</span>
<span class="text-blue-400">DELAY</span>: <span class="text-purple-400">1500</span> <span class="text-slate-500">// 重试间隔</span>
},
<span class="text-blue-400">Z_INDEX</span>: {
<span class="text-blue-400">SPLASH</span>: <span class="text-purple-400">2147483647</span>, <span class="text-slate-500">// 启动页层级 (最高)</span>
<span class="text-blue-400">PROGRESS</span>: <span class="text-purple-400">2147483646</span>, <span class="text-slate-500">// 进度条层级</span>
<span class="text-blue-400">PANEL</span>: <span class="text-purple-400">2147483645</span>, <span class="text-slate-500">// 日志面板层级</span>
<span class="text-blue-400">ERROR</span>: <span class="text-purple-400">2147483648</span> <span class="text-slate-500">// 错误弹窗层级</span>
},
<span class="text-blue-400">LOG_LEVEL_UI</span>: <span class="text-green-400">'debug'</span>, <span class="text-slate-500">// UI面板日志级别 ('debug'/'info'/'error'/'none')</span>
<span class="text-blue-400">LOG_LEVEL_DEVTOOLS</span>: <span class="text-green-400">'error'</span>, <span class="text-slate-500">// 浏览器控制台日志级别 ('debug'/'info'/'error'/'none')</span>
<span class="text-blue-400">LOG_LEVEL_MAP</span>: {
debug: [<span class="text-green-400">'info'</span>, <span class="text-green-400">'success'</span>, <span class="text-green-400">'warning'</span>, <span class="text-green-400">'danger'</span>, <span class="text-green-400">'cache'</span>, <span class="text-green-400">'request'</span>], <span class="text-slate-500">// 调试模式允许所有类型</span>
info: [<span class="text-green-400">'info'</span>, <span class="text-green-400">'success'</span>, <span class="text-green-400">'warning'</span>, <span class="text-green-400">'danger'</span>], <span class="text-slate-500">// 信息模式排除缓存/请求</span>
error: [<span class="text-green-400">'danger'</span>], <span class="text-slate-500">// 错误模式仅显示危险</span>
none: [] <span class="text-slate-500">// 关闭日志</span>
},
<span class="text-blue-400">ANIMATION</span>: {
<span class="text-blue-400">SPLASH_HIDE</span>: <span class="text-purple-400">800</span>, <span class="text-slate-500">// 启动页隐藏动画时长</span>
<span class="text-blue-400">PROGRESS_COMPLETE</span>: <span class="text-purple-400">800</span>,<span class="text-slate-500">// 进度条完成动画时长</span>
<span class="text-blue-400">PANEL_HIDE</span>: <span class="text-purple-400">500</span>, <span class="text-slate-500">// 面板隐藏动画时长</span>
<span class="text-blue-400">ERROR_SLIDE_UP</span>: <span class="text-purple-400">400</span>, <span class="text-slate-500">// 错误弹窗滑入动画时长</span>
<span class="text-blue-400">LOG_FADE_IN</span>: <span class="text-purple-400">200</span> <span class="text-slate-500">// 日志条目淡入动画时长</span>
},
<span class="text-blue-400">UI_STYLE</span>: {
<span class="text-blue-400">FONT_FAMILY</span>: <span class="text-green-400">"'Segoe UI Variable', 'Segoe UI', sans-serif"</span>, <span class="text-slate-500">// 系统字体</span>
<span class="text-blue-400">MONO_FONT</span>: <span class="text-green-400">"'Consolas', 'Monaco', monospace"</span>, <span class="text-slate-500">// 代码字体</span>
<span class="text-blue-400">BLUR_VALUE</span>: <span class="text-green-400">'20px'</span>, <span class="text-slate-500">// 背景模糊度</span>
<span class="text-blue-400">SHADOW_OPACITY</span>: <span class="text-purple-400">0.12</span> <span class="text-slate-500">// 阴影透明度</span>
}
};</pre>
</div>
</div>
</div>
</div>
</div>
</section>
<style>
/* 架构动画 */
@keyframes pulse-ring {
0% { transform: scale(0.8); opacity: 0.5; }
100% { transform: scale(1.3); opacity: 0; }
}
.animate-pulse-ring::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
border-radius: 50%;
border: 2px solid var(--color-brand-500);
animation: pulse-ring 2s cubic-bezier(0.215, 0.61, 0.355, 1) infinite;
}
.code-block {
background: #1e293b;
color: #e2e8f0;
}
.code-comment { color: #64748b; font-style: italic; }
.code-tag { color: #569cd6; }
.code-attr { color: #9cdcfe; }
.code-string { color: #ce9178; }
</style>
<section id="architecture" class="py-20 bg-white border-y border-slate-100">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16">
<h2 class="text-base text-brand-600 font-semibold tracking-wide uppercase">Architecture</h2>
<p class="mt-2 text-3xl leading-8 font-extrabold tracking-tight text-slate-900 sm:text-4xl">
父级分发,多子级复用
</p>
<p class="mt-4 max-w-2xl text-xl text-slate-500 mx-auto">
告别每个 iframe 都重新下载 jQuery 或 Vue 的低效时代。
</p>
</div>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<!-- 左侧:架构图示 -->
<div class="relative bg-slate-50 rounded-2xl border border-slate-200 p-8 shadow-inner overflow-hidden h-[400px] flex items-center justify-center">
<!-- 连接线 SVG -->
<svg class="absolute inset-0 w-full h-full pointer-events-none" style="z-index: 1;">
<line x1="50%" y1="50%" x2="20%" y2="30%" stroke="#cbd5e1" stroke-width="2" stroke-dasharray="4 4"></line>
<line x1="50%" y1="50%" x2="80%" y2="30%" stroke="#cbd5e1" stroke-width="2" stroke-dasharray="4 4"></line>
<line x1="50%" y1="50%" x2="20%" y2="70%" stroke="#cbd5e1" stroke-width="2" stroke-dasharray="4 4"></line>
<line x1="50%" y1="50%" x2="80%" y2="70%" stroke="#cbd5e1" stroke-width="2" stroke-dasharray="4 4"></line>
</svg>
<!-- 父级窗口 -->
<div class="absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 w-40 h-40 bg-white border-2 border-brand-500 rounded-xl shadow-glow z-10 flex flex-col items-center justify-center text-center p-2">
<div class="w-10 h-10 bg-brand-100 rounded-lg flex items-center justify-center text-brand-600 mb-2">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"></path></svg>
</div>
<span class="font-bold text-slate-800">Top Window</span>
<span class="text-xs text-brand-600 font-medium">资源持有者 / 缓存中心</span>
</div>
<!-- 子级窗口 A -->
<div class="absolute top-[20%] left-[15%] w-24 h-20 bg-white border border-slate-300 rounded-lg shadow-sm z-0 flex flex-col items-center justify-center">
<span class="text-xs font-semibold text-slate-600">Iframe A</span>
<div class="mt-1 px-1.5 py-0.5 bg-green-100 text-green-700 text-[10px] rounded">Cached</div>
</div>
<!-- 子级窗口 B -->
<div class="absolute top-[20%] right-[15%] w-24 h-20 bg-white border border-slate-300 rounded-lg shadow-sm z-0 flex flex-col items-center justify-center">
<span class="text-xs font-semibold text-slate-600">Iframe B</span>
<div class="mt-1 px-1.5 py-0.5 bg-green-100 text-green-700 text-[10px] rounded">Cached</div>
</div>
<!-- 子级窗口 C -->
<div class="absolute bottom-[20%] left-[15%] w-24 h-20 bg-white border border-slate-300 rounded-lg shadow-sm z-0 flex flex-col items-center justify-center">
<span class="text-xs font-semibold text-slate-600">Iframe C</span>
<div class="mt-1 px-1.5 py-0.5 bg-green-100 text-green-700 text-[10px] rounded">Cached</div>
</div>
<!-- 子级窗口 D -->
<div class="absolute bottom-[20%] right-[15%] w-24 h-20 bg-white border border-slate-300 rounded-lg shadow-sm z-0 flex flex-col items-center justify-center">
<span class="text-xs font-semibold text-slate-600">Iframe D</span>
<div class="mt-1 px-1.5 py-0.5 bg-green-100 text-green-700 text-[10px] rounded">Cached</div>
</div>
</div>
<!-- 右侧:优势列表 -->
<div class="space-y-8">
<div class="flex gap-4">
<div class="flex-shrink-0 w-12 h-12 rounded-lg bg-blue-50 flex items-center justify-center text-blue-600">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg>
</div>
<div>
<h3 class="text-lg font-bold text-slate-900">极速加载 (0ms Latency)</h3>
<p class="mt-2 text-slate-600">首个 iframe 请求资源后,后续所有同源 iframe 均直接从父级内存读取 Blob URL 或 PostMessage 消息,网络延迟为零。</p>
</div>
</div>
<div class="flex gap-4">
<div class="flex-shrink-0 w-12 h-12 rounded-lg bg-indigo-50 flex items-center justify-center text-indigo-600">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"></path></svg>
</div>
<div>
<h3 class="text-lg font-bold text-slate-900">流量节省</h3>
<p class="mt-2 text-slate-600">对于 100 个 iframe 加载同一套 2MB 的 UI 库,系统仅消耗 2MB 流量,而非 200MB,显著降低服务器带宽成本。</p>
</div>
</div>
<div class="flex gap-4">
<div class="flex-shrink-0 w-12 h-12 rounded-lg bg-emerald-50 flex items-center justify-center text-emerald-600">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path></svg>
</div>
<div>
<h3 class="text-lg font-bold text-slate-900">同源安全握手</h3>
<p class="mt-2 text-slate-600">内置 Ping/Pong 握手机制,严格校验 Origin,确保资源只在授权的同源 iframe 间流转,防止数据泄露。</p>
</div>
</div>
</div>
</div>
</div>
</section>
<section id="architecture" class="py-20 bg-[var(--primary-light)] border-y border-blue-100">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex flex-col lg:flex-row items-center gap-12">
<div class="lg:w-1/2">
<h2 class="text-3xl font-bold text-gray-900 mb-6">父对子 (P2C) 共享逻辑</h2>
<p class="text-[var(--text-muted)] mb-6">
在传统的 iframe 架构中,每个 iframe 都是一个独立的浏览器上下文,拥有独立的网络栈和缓存。
如果你的页面有 5 个子窗格,每个都需要加载 jQuery (85KB),那么你浪费了 400KB 的带宽和 5 次 DNS 查询时间。
</p>
<ul class="space-y-4">
<li class="flex items-start gap-3">
<span class="flex-shrink-0 h-6 w-6 rounded-full bg-blue-500 text-white flex items-center justify-center text-xs font-bold">1</span>
<div>
<strong class="block text-gray-900">父页面优先获取</strong>
<span class="text-sm text-[var(--text-muted)]">Parent Window 发起 HTTP 请求,将资源存储在内存 Map 中。</span>
</div>
</li>
<li class="flex items-start gap-3">
<span class="flex-shrink-0 h-6 w-6 rounded-full bg-blue-500 text-white flex items-center justify-center text-xs font-bold">2</span>
<div>
<strong class="block text-gray-900">建立握手通道</strong>
<span class="text-sm text-[var(--text-muted)]">Child Window 启动时自动 PostMessage Ping 父页面,验证同源。</span>
</div>
</li>
<li class="flex items-start gap-3">
<span class="flex-shrink-0 h-6 w-6 rounded-full bg-blue-500 text-white flex items-center justify-center text-xs font-bold">3</span>
<div>
<strong class="block text-gray-900">Blob 传输与执行</strong>
<span class="text-sm text-[var(--text-muted)]">父页面将缓存转化为 Blob URL 或 直接传输数据,子页面通过 URL.createObjectURL 即时执行脚本。</span>
</div>
</li>
</ul>
</div>
<div class="lg:w-1/2 w-full">
<!-- Architecture Diagram -->
<div class="bg-white rounded-xl shadow-lg border border-gray-200 p-8 relative">
<!-- Parent Box -->
<div class="bg-gray-900 text-white rounded-lg p-6 mb-8 relative z-10 border-l-4 border-[var(--primary)]">
<div class="text-xs uppercase text-gray-400 mb-1">Parent Window (Top Level)</div>
<div class="font-bold text-lg">ResourceShare Manager</div>
<div class="mt-4 flex gap-2">
<span class="bg-gray-800 px-2 py-1 rounded text-xs border border-gray-700">Cache: Map</span>
<span class="bg-gray-800 px-2 py-1 rounded text-xs border border-gray-700 text-green-400">✓ jQuery Loaded</span>
</div>
</div>
<!-- Connectors -->
<div class="h-12 flex justify-center relative mb-8">
<!-- Left Arrow -->
<div class="absolute left-10 top-1/2 -translate-y-1/2 flex flex-col items-center">
<div class="h-8 w-[1px] bg-gray-300 mb-1"></div>
<div class="text-xs text-[var(--primary)] bg-white px-1">Ping/Pong</div>
</div>
<!-- Right Arrows -->
<div class="absolute right-10 top-1/2 -translate-y-1/2 flex flex-col items-center">
<div class="text-xs text-[var(--success)] bg-white px-1 mb-1">PostMessage (Blob)</div>
<div class="h-8 w-[1px] bg-gray-300"></div>
</div>
</div>
<!-- Children Container -->
<div class="grid grid-cols-2 gap-4">
<!-- Child 1 -->
<div class="bg-white border border-gray-200 rounded-lg p-4 shadow-sm">
<div class="text-xs text-gray-400 mb-1">Child Iframe 1</div>
<div class="text-sm font-semibold text-gray-700">Dashboard Pane</div>
<div class="mt-2 text-xs text-green-600 flex items-center gap-1">
<span class="w-2 h-2 rounded-full bg-green-500"></span> Ready (Cached)
</div>
</div>
<!-- Child 2 -->
<div class="bg-white border border-gray-200 rounded-lg p-4 shadow-sm">
<div class="text-xs text-gray-400 mb-1">Child Iframe 2</div>
<div class="text-sm font-semibold text-gray-700">Settings Pane</div>
<div class="mt-2 text-xs text-green-600 flex items-center gap-1">
<span class="w-2 h-2 rounded-full bg-green-500"></span> Ready (Cached)
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section id="logic" class="py-24 bg-slate-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid lg:grid-cols-2 gap-16">
<!-- 父页面职责 -->
<div>
<div class="flex items-center gap-3 mb-6">
<div class="p-2 rounded-lg bg-cyan-100 text-cyan-600">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"></path></svg>
</div>
<h3 class="text-xl font-bold text-slate-900">父页面:资源中枢</h3>
</div>
<div class="space-y-6">
<div class="flex gap-4">
<div class="flex flex-col items-center">
<div class="w-6 h-6 rounded-full bg-cyan-600 text-white flex items-center justify-center text-xs font-bold">1</div>
<div class="w-0.5 flex-1 bg-cyan-200 my-1"></div>
</div>
<div class="pb-6">
<h4 class="font-bold text-slate-800">发起网络请求</h4>
<p class="text-sm text-slate-600 mt-1">
父页面负责所有的跨域资源下载。系统自动拦截 <code>&lt;resource-share&gt;</code> 标签声明的资源,并发起 <code>fetch</code> 请求。
</p>
</div>
</div>
<div class="flex gap-4">
<div class="flex flex-col items-center">
<div class="w-6 h-6 rounded-full bg-cyan-600 text-white flex items-center justify-center text-xs font-bold">2</div>
<div class="w-0.5 flex-1 bg-cyan-200 my-1"></div>
</div>
<div class="pb-6">
<h4 class="font-bold text-slate-800">缓存与预处理</h4>
<p class="text-sm text-slate-600 mt-1">
下载的内容被存储在父页面的 <code>Map</code> 缓存中。对于大文件,自动转换为 Blob URL;对于小文件,直接文本存储。
</p>
</div>
</div>
<div class="flex gap-4">
<div class="flex flex-col items-center">
<div class="w-6 h-6 rounded-full bg-cyan-600 text-white flex items-center justify-center text-xs font-bold">3</div>
</div>
<div>
<h4 class="font-bold text-slate-800">监听子请求 &amp; 分发</h4>
<p class="text-sm text-slate-600 mt-1">
父页面开启 <code>message</code> 监听器。一旦收到子页面的 <code>resource-request</code> 信号,立即从缓存提取数据并通过 <code>postMessage</code> 推回。
</p>
</div>
</div>
</div>
</div>
<!-- 子页面职责 -->
<div>
<div class="flex items-center gap-3 mb-6">
<div class="p-2 rounded-lg bg-indigo-100 text-indigo-600">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"></path></svg>
</div>
<h3 class="text-xl font-bold text-slate-900">子页面:轻量接入</h3>
</div>
<div class="space-y-6">
<div class="flex gap-4">
<div class="flex flex-col items-center">
<div class="w-6 h-6 rounded-full bg-indigo-600 text-white flex items-center justify-center text-xs font-bold">1</div>
<div class="w-0.5 flex-1 bg-indigo-200 my-1"></div>
</div>
<div class="pb-6">
<h4 class="font-bold text-slate-800">握手与请求</h4>
<p class="text-sm text-slate-600 mt-1">
子页面初始化时,向父页面发送 <code>resource-share-ping</code> 确认连接。随后解析自身的 <code>&lt;resource-share&gt;</code> 标签,生成请求列表。
</p>
</div>
</div>
<div class="flex gap-4">
<div class="flex flex-col items-center">
<div class="w-6 h-6 rounded-full bg-indigo-600 text-white flex items-center justify-center text-xs font-bold">2</div>
<div class="w-0.5 flex-1 bg-indigo-200 my-1"></div>
</div>
<div class="pb-6">
<h4 class="font-bold text-slate-800">接收资源并执行</h4>
<p class="text-sm text-slate-600 mt-1">
收到父页面 <code>postMessage</code> 传来的 Blob URL 或字符串内容后,立即创建 <code>&lt;script&gt;</code> 或 <code>&lt;style&gt;</code> 标签并注入 DOM。
</p>
</div>
</div>
<div class="flex gap-4">
<div class="flex flex-col items-center">
<div class="w-6 h-6 rounded-full bg-indigo-600 text-white flex items-center justify-center text-xs font-bold">3</div>
</div>
<div>
<h4 class="font-bold text-slate-800">降级机制 (Fallback)</h4>
<p class="text-sm text-slate-600 mt-1">
如果无法连接到父页面(例如跨域限制),子页面会自动降级,直接向 CDN 发起请求,确保业务不受影响。
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section id="advantage" class="py-24 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16">
<h2 class="text-3xl font-bold text-slate-900">多子场景下的性能碾压</h2>
<p class="mt-4 text-slate-600">假设系统有 1 个父页面和 5 个子 iframe,共同加载 3 个公共库(jQuery, Vue, ElementUI)</p>
</div>
<div class="grid md:grid-cols-2 gap-8">
<!-- 传统模式 -->
<div class="bg-red-50 rounded-xl p-8 border border-red-100 relative overflow-hidden">
<div class="absolute top-0 right-0 p-4 opacity-10">
<svg class="w-32 h-32" fill="currentColor" viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"></path></svg>
</div>
<h3 class="text-xl font-bold text-red-800 mb-4">传统加载模式</h3>
<ul class="space-y-3 text-red-900/80">
<li class="flex items-center gap-2">
<span class="w-2 h-2 rounded-full bg-red-400"></span>
每个页面独立向 CDN 发起请求
</li>
<li class="flex items-center gap-2">
<span class="w-2 h-2 rounded-full bg-red-400"></span>
重复下载相同资源 6 次 (1父+5子)
</li>
<li class="flex items-center gap-2">
<span class="w-2 h-2 rounded-full bg-red-400"></span>
浪费带宽,加载时间长
</li>
</ul>
<div class="mt-6 bg-white/60 rounded p-4 text-center">
<div class="text-sm text-red-500 mb-1">总网络请求</div>
<div class="text-3xl font-bold text-red-600">18 次</div>
</div>
</div>
<!-- ResourceShare 模式 -->
<div class="bg-green-50 rounded-xl p-8 border border-green-100 relative overflow-hidden shadow-lg">
<div class="absolute top-0 right-0 p-4 opacity-10">
<svg class="w-32 h-32" fill="currentColor" viewBox="0 0 24 24"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"></path></svg>
</div>
<h3 class="text-xl font-bold text-green-800 mb-4">ResourceShare 模式</h3>
<ul class="space-y-3 text-green-900/80">
<li class="flex items-center gap-2">
<span class="w-2 h-2 rounded-full bg-green-500"></span>
仅父页面发起 3 次网络请求
</li>
<li class="flex items-center gap-2">
<span class="w-2 h-2 rounded-full bg-green-500"></span>
5 个子页面瞬间并发获取 (PostMessage)
</li>
<li class="flex items-center gap-2">
<span class="w-2 h-2 rounded-full bg-green-500"></span>
节省 83% 的外部请求
</li>
</ul>
<div class="mt-6 bg-white/60 rounded p-4 text-center">
<div class="text-sm text-green-600 mb-1">总网络请求</div>
<div class="text-3xl font-bold text-green-600">3 次</div>
</div>
</div>
</div>
</div>
</section>
<section id="diagnostics" class="py-24 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16">
<h2 class="text-3xl font-bold text-slate-900">智能错误诊断系统</h2>
<p class="mt-4 text-slate-600">当脚本执行失败时,系统不仅显示错误,更会提供修复建议。</p>
</div>
<div class="grid md:grid-cols-2 gap-8 items-center">
<div class="bg-white rounded-xl shadow-lg border border-slate-200 p-0 overflow-hidden flex flex-col h-80">
<div class="bg-red-50 px-4 py-3 border-b border-red-100 flex items-center gap-3">
<div class="w-8 h-8 rounded-full bg-red-500 text-white flex items-center justify-center font-bold">!</div>
<div>
<div class="text-sm font-bold text-red-700">系统严重错误</div>
<div class="text-xs text-red-600">ResourceShare 遇到不可恢复的错误</div>
</div>
</div>
<div class="p-6 bg-slate-50 flex-1 overflow-y-auto">
<div class="mb-4">
<h5 class="text-xs font-bold text-slate-500 uppercase tracking-wider mb-2">智能诊断与建议</h5>
<div class="bg-red-50 border-l-4 border-red-500 p-3 text-sm text-red-800"> <strong>jQuery 依赖错误:</strong><br /> 脚本依赖 jQuery,但似乎未加载或加载顺序错误。<br /> <em>解决方案: 请检查 resource-share 中 jQuery 是否在其他依赖库之前声明。</em> </div>
</div>
<div>
<h5 class="text-xs font-bold text-slate-500 uppercase tracking-wider mb-2">错误堆栈跟踪</h5>
<div class="bg-slate-800 text-slate-300 p-3 rounded text-xs font-mono"> TypeError: $ is not defined<br> at VM_app_main.js:12:5<br> at executeScript (ResourceShare.js:420) </div>
</div>
</div>
</div>
<div class="space-y-8">
<div>
<h3 class="text-xl font-bold text-slate-900 mb-2">实时规则匹配</h3>
<p class="text-slate-600"> 内置的 <code>DIAGNOSTIC_RULES</code> 包含多种常见错误的特征检测。一旦捕获异常,系统会遍历规则库,匹配错误特征并生成 HTML 诊断报告。 </p>
</div>
<div>
<h3 class="text-xl font-bold text-slate-900 mb-2">网络层异常捕捉</h3>
<p class="text-slate-600"> 不仅限于 JavaScript 语法错误。对于网络请求超时、4xx/5xx 状态码、CORS 跨域拦截等底层网络问题,同样提供明确的指引。 </p>
</div>
<div class="flex gap-4"> <span class="px-3 py-1 bg-slate-100 rounded text-xs font-mono text-slate-600">TypeError</span> <span class="px-3 py-1 bg-slate-100 rounded text-xs font-mono text-slate-600">ReferenceError</span> <span
class="px-3 py-1 bg-slate-100 rounded text-xs font-mono text-slate-600">NetworkError</span> </div>
</div>
</div>
</div>
</section>
<section id="config" class="py-24 bg-slate-900 text-white">
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<h2 class="text-3xl font-bold mb-8">开箱即用,零配置启动</h2>
<p class="text-slate-400 mb-10"> 只需引入一个 JS 文件,并使用自定义标签声明资源,系统将自动完成脚本拦截、加载、映射和执行的整个生命周期。 </p>
<div class="bg-black/50 rounded-xl border border-slate-700 p-1 inline-block w-full text-left shadow-2xl">
<div class="flex items-center gap-2 px-4 py-3 border-b border-slate-800 bg-slate-800/50 rounded-t-lg">
<div class="w-3 h-3 rounded-full bg-slate-600"></div> <span class="text-xs text-slate-400">index.html</span>
</div>
<pre class="!rounded-t-none !bg-slate-900 !border-none p-6 leading-6"><span class="text-slate-500">
<pre class="!rounded-t-none !bg-slate-900 !border-none p-6 leading-6">
<span class="text-slate-500">&lt;!-- 1. 引入系统 --&gt;</span>
<span class="text-blue-400">&lt;script</span> <span class="text-cyan-400">src</span>=<span class="text-green-400">"https://cdn.gvsds.com/ResourceShare/ResourceShare-1.3.7.2.js"</span><span class="text-blue-400">&gt;&lt;/script&gt;</span>
<span class="text-slate-500">&lt;!-- 2. 声明需要管理的资源 --&gt;</span>
<span class="text-blue-400">&lt;resource-share</span>
<span class="text-cyan-400">type</span>=<span class="text-green-400">"script"</span>
<span class="text-cyan-400">src</span>=<span class="text-green-400">"https://cdn.../jquery.min.js"</span><span class="text-blue-400">&gt;</span>
<span class="text-blue-400">&lt;/resource-share&gt;</span>
<span class="text-blue-400">&lt;resource-share</span>
<span class="text-cyan-400">type</span>=<span class="text-green-400">"style"</span>
<span class="text-cyan-400">href</span>=<span class="text-green-400">"https://cdn.../app.css"</span><span class="text-blue-400">&gt;</span>
<span class="text-blue-400">&lt;/resource-share&gt;</span>
<span class="text-slate-500">&lt;!-- 3. 正常书写业务代码,无需额外等待逻辑 --&gt;</span>
<span class="text-blue-400">&lt;script&gt;</span>
<span class="text-purple-400">window</span>.resourceShareManager.on(<span class="text-green-400">'ready'</span>, () => {
$(<span class="text-green-400">'#app'</span>).show(); <span class="text-slate-500">// jQuery 确保已加载</span>
});
<span class="text-blue-400">&lt;/script&gt;</span></pre>
</div>
</div>
</section>
<!--footer id="install" class="bg-slate-50 border-t border-slate-200 pt-16 pb-8">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 md:grid-cols-4 gap-8 mb-12">
<div class="col-span-1 md:col-span-2">
<div class="flex items-center gap-2 mb-4">
<div class="w-6 h-6 rounded bg-slate-800 flex items-center justify-center text-white font-bold text-xs">RS</div> <span class="font-bold text-slate-900">ResourceShare</span>
</div>
<p class="text-slate-500 text-sm max-w-xs"> 致力于解决复杂微前端架构下的资源治理问题。由 GVSDS Team 维护,基于 MIT 协议开源。 </p>
</div>
<div>
<h4 class="font-bold text-slate-900 mb-4">资源</h4>
<ul class="space-y-2 text-sm text-slate-600">
<li><a href="#" class="hover:text-cyan-600">API 文档</a></li>
<li><a href="#" class="hover:text-cyan-600">更新日志 (V1.3.7.2)</a></li>
<li><a href="#" class="hover:text-cyan-600">常见问题</a></li>
</ul>
</div>
<div>
<h4 class="font-bold text-slate-900 mb-4">社区</h4>
<ul class="space-y-2 text-sm text-slate-600">
<li><a href="#" class="hover:text-cyan-600">GitHub</a></li>
<li><a href="#" class="hover:text-cyan-600">NPM 包</a></li>
<li><a href="#" class="hover:text-cyan-600">联系我们</a></li>
</ul>
</div>
</div>
<div class="border-t border-slate-200 pt-8 flex flex-col md:flex-row justify-between items-center gap-4">
<p class="text-sm text-slate-400">© 2026 GVSDS Team. All rights reserved.</p>
<div class="flex gap-6 text-sm text-slate-400"> <span>MIT License</span> </div>
</div>
</div>
</footer-->
</div>