能力与限制
微应用页面可以理解为一个网络请求受白名单约束、页面资源本地化的受控 Web 页面。本页列出容器内哪些 Web 能力可用、哪些被禁用,以及各类资源的加载规则。开始开发前建议通读一遍,能省去大量试错。
浏览器兼容基线
目前仅迅雷 Windows 版支持微应用。 Android、iOS 等其它平台的微应用支持正在陆续推进;下表中的移动端版本是开发者规划多端兼容时的适配目标,并不表示移动端现已开放微应用。
| 平台 | 当前状态 | 页面内核与兼容目标 |
|---|---|---|
| Windows | 已支持 | 基于 Chrome 108 内核 |
| Mac | 推进中 | 最低适配 macOS 15,按该版本的 WebKit 能力评估兼容性 |
| Android | 推进中 | 最低适配 Android 9 出厂 WebView,以 Chrome 68 作为兼容基线 |
| iOS | 推进中 | 最低适配 iOS 18,按该版本的 WebKit 能力评估兼容性 |
开发者目前可在迅雷 Windows 版开发和验证微应用。若计划后续支持多端,建议现在就评估所用框架、JS/CSS 特性、Web API 和图形能力在 Chrome 68 与 iOS 18 WebKit 中的兼容性,并为较新能力准备降级方案。移动端实际支持情况以后续平台发布为准。
可用能力
页面与渲染
| 能力 | 说明 |
|---|---|
| HTML / CSS / JS | 支持兼容基线内的标准能力;新语法、新 API 和较新的 CSS 特性须转译、检测或降级 |
| 内联样式 | <style> 和元素的 style 属性可用 |
| 页面内脚本 | 包内页面自带的脚本可执行;外部脚本仍受下方资源加载规则限制 |
| Canvas 2D | 可用于页面内绘制 |
| 文本选择 | 页面文本可正常选择 |
| 前端框架 | 可使用 Vue / React / SolidJS 等框架,最终产物须符合兼容基线并打包进微应用包 |
| SPA 路由 | 支持包内页面跳转与 hash 路由(见下方导航规则) |
当前暂不支持 WebGL(含 WebGL 2)和 WebGPU。 依赖这些图形 API 的页面或渲染库不能直接使用;图形展示请使用 Canvas 2D 或 CSS 实现。
JS / CSS 兼容要求
- JavaScript:计划支持多端时,建议以 ES2015 / Chrome 68 为构建目标,并评估 iOS 18 WebKit 兼容性;高于基线的语法需在构建时转译。新 Web API 无法仅靠语法转译获得,使用前须检测支持情况并准备降级逻辑。
- CSS:计划支持多端时,保留可在 Chrome 68 和 iOS 18 WebKit 使用的基础布局和样式;较新的 CSS 特性可作为增强,用
@supports判断是否启用。 - 能力检测:使用较新的 Web API 或 CSS 能力前,先检测运行环境;支持时启用增强,不支持时使用基础实现。图形功能须提供不依赖 WebGL / WebGPU 的实现。
网络请求
网络请求采用白名单制:在 manifest 中声明 network 权限并配置 network.urls 后,页面与事件脚本即可访问白名单内的地址:
| 能力 | 说明 |
|---|---|
fetch / XMLHttpRequest | 访问 network.urls 白名单内的 HTTP(S) 地址,支持跨域 |
WebSocket 等长连接 | 同样受白名单约束;可声明 ws:// / wss://,或使用匹配其主机的 *:// 规则 |
| 请求头 | 可自由设置 User-Agent、Referer、Cookie 等请求头 |
json
{
"permissions": ["network"],
"network": {
"urls": ["https://api.example.com/*"]
}
}- 多条规则或关系;
network.urls只使用主机/路径匹配规则,支持https://*这样的省略路径写法。事件规则中的<all_urls>和协议:*不能用于网络授权; - 白名单外的请求会被拦截;未声明
network权限时,所有直接网络请求都会被拦截; - 不受白名单约束的通道:下载任务(
tasks.create的req.url可以是任意地址)、辅助 WebView。
本地存储
| 能力 | 说明 |
|---|---|
xunlei.storage | 页面与事件脚本共享的键值对存储,按微应用隔离、持久化,推荐优先使用(见数据与日志) |
| 页面级 Web 存储 | localStorage 等 Web 存储 API 随页面环境提供,同样按微应用隔离 |
资源加载规则
页面引用的静态资源只允许来自微应用包内(或 data: / blob: 内存对象),远程资源一律拦截:
| 资源类型 | 允许 | 禁止 |
|---|---|---|
脚本 <script> | 包内脚本文件 | 远程域名脚本、eval 远程代码 |
样式 <style> / <link> | 包内样式、内联样式 | 远程域名样式表 |
| 图片 | 包内图片、data: / blob: | 远程域名图片 |
| 字体 | 包内字体文件 | 远程域名字体 |
| 音视频 / 媒体 | 包内媒体文件 | 远程域名媒体 |
iframe / object | — | 全部禁止 |
别用外链 CDN
<script src="https://cdn.example.com/lib.js"> 这类外链资源加载不到。所有依赖请通过构建工具(npm 包 + 打包)打进微应用包内。若确实需要加载外部页面,参见辅助 WebView 或进阶 · in_app_webview 入口。
导航规则
| 行为 | 是否允许 |
|---|---|
| 包内页面跳转 | ✅ 允许 |
| SPA 路由(history / hash) | ✅ 允许 |
| 跳转到远程 HTTP(S) 页面 | 🔴 拦截(NAVIGATION_BLOCKED) |
window.open 打开新窗口 | 🔴 拦截 |
| 表单提交到外部地址 | 🔴 拦截 |
下载规则
浏览器原生下载被全部禁用,包括:
<a download>或脚本触发的链接点击下载;blob:/data:URL 下载;- HTTP 响应
Content-Disposition: attachment触发的下载。
把 URL 或页面生成的数据保存到本地的唯一方式是通过 xunlei.tasks.create 创建下载任务:
js
// 下载一个网络地址
await xunlei.tasks.create({
req: { url: 'https://example.com/file.zip' },
opts: { name: 'file.zip' },
});
// 下载页面里生成的数据(如 Canvas 导出的图片)
const blob = await new Promise((resolve) => canvas.toBlob(resolve, 'image/png'));
const url = await xunlei.runtime.blob.createObjectURL(blob);
await xunlei.tasks.create({
req: { url },
opts: { name: 'picture.png' },
});详见任务 API。注意:fetch / ReadableStream 在内存中读取数据不受此限制。
平台能力 API
除标准 Web 能力外,运行时自动注入全局对象 xunlei,提供任务管理、存储、日志、辅助 WebView 等宿主能力。完整清单见平台能力。
常见问题
Q:能加载我自己的服务器上的 JS 吗? 不能。页面资源必须打包在微应用包内;但可以通过 fetch 请求服务器接口获取数据。
Q:能请求需要登录态的接口吗? 可以。请求头可自由设置以携带 Cookie / Token(前提是接口地址在 network.urls 白名单内);复杂登录流程可以使用辅助 WebView引导用户完成授权。
Q:为什么 window.open 没反应? 外部导航被容器拦截。站外页面场景请使用辅助 WebView,或采用 in_app_webview 入口。


