在线咨询
Skip to content

运行时架构 ​

本页介绍微应用是如何被迅雷加载和运行的:安装到哪里、页面运行在什么样的环境中、平台能力如何注入。理解这些机制,可以解释开发中遇到的大部分"为什么"。

安装与加载 ​

微应用以目录为最小运行单元:根目录必须包含一个 manifest.json,连同页面、脚本、资源文件一起构成完整的微应用包。

  • 用户侧安装:从微应用商店安装时,迅雷把微应用包下载解压到本地内部目录并登记注册;
  • 加载方式:微应用页面直接从本地目录加载,所有修改立即生效;
  • 数据隔离:存储、设置等数据按微应用唯一标识(identity)隔离,微应用之间无法互访。

微应用唯一标识(identity) ​

每个微应用有一个 32 位字符串的稳定的唯一标识 identity(可通过 xunlei.info.identity 读取),存储、设置等数据都按它隔离。identity 的来源取决于安装方式:

安装方式identity 来源稳定性
本地加载(开发者模式)由微应用目录的绝对路径派生目录移动或改名后,标识随之变化
商店安装上架时由官方分配同一微应用的所有版本标识稳定

对开发的实际影响:

  • 本地加载期间产生的存储数据,与商店安装后的数据互不相通(两者 identity 不同);
  • 本地调试时移动了项目目录,等同于一个"新的"微应用,原有本地数据不会延续。

页面运行环境 ​

微应用页面运行在迅雷创建的 WebView 页面容器中,这个环境由三部分构成:

运行时架构:本地微应用包加载到迅雷客户端内的 WebView 页面容器,容器提供标准 WebView、CSP 资源限制和 xunlei 平台 API

① 标准 WebView

微应用页面是运行在页面容器里的 Web 页面,可使用兼容基线内的 HTML / CSS / JS,以及 fetch / XMLHttpRequest 等标准 Web API;Vue / React 等前端框架的构建产物也须满足浏览器兼容基线。

② 注入 CSP 限制

平台为页面注入 CSP(内容安全策略):页面只能加载微应用包内的脚本、样式、字体、媒体等资源,远程资源、iframe、外部跳转均会被拦截。这保证了页面运行的所有代码都来自经过审核的微应用包本身。

③ 注入原生 API(xunlei)

WebView 中自动注入全局对象 xunlei,页面通过它调用迅雷的原生能力:下载任务管理、键值对存储、设置读取、日志、辅助 WebView 等。完整清单见平台能力。

窗口由迅雷负责创建和管理,manifest.window 可配置初始尺寸。每个微应用拥有相互隔离的运行环境(页面会话、存储数据等),微应用之间无法互访。

安全模型 ​

微应用运行在一个受管控的容器里,安全边界可以概括为五条规则:

规则说明
资源本地化CSP 限制页面只能加载微应用包内的 JS / CSS / 字体 / 媒体等资源
网络白名单fetch / XMLHttpRequest / WebSocket 等直接网络请求,只能访问 manifest 中 network.urls声明的地址
导航受控页面可以在包内跳转(含 SPA 路由),但不能跳转到外部网页、不能 window.open 打开新窗口
下载收口浏览器原生下载(<a download>、Content-Disposition 等)全部被禁用;所有下载必须通过 xunlei.tasks.create 创建任务完成
权限声明涉及宿主能力的 API(任务、文件访问、网络、blob、辅助 WebView)必须在 manifest 的 permissions 中声明,未声明的调用返回 PERMISSION_DENIED

资源加载 ≠ 网络请求

CSP 约束的是页面资源的加载(脚本、样式等,仅限包内);通过 fetch / XMLHttpRequest 发起的数据请求不受 CSP 约束,但受 network.urls 白名单约束。两条限制相互独立。

完整的"哪些能用 / 哪些不能用"清单见 能力与限制。

下一步 ​