在线咨询
Skip to content

能力与限制 ​

微应用页面可以理解为一个网络请求受白名单约束、页面资源本地化的受控 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。

详见清单文件 · network。

本地存储 ​

能力说明
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 入口。