移动端safari/wkwebview预加载扫描器行为类似桌面端但受系统策略限制更严;关键脚本须静态、非内联、服务端直出才能被识别,动态插入、模块导入或js拼接注入均逃逸预加载。

移动端 Safari 和 WKWebView 的预加载扫描器(Preload Scanner)行为与桌面版基本一致,但受系统级策略和资源限制影响更明显。优化关键在于让脚本“被看见、被优先、不干扰”。
确保脚本能被预解析器识别
只有静态、非内联、服务端直出的 <script src="xxx.js"></script> 才会被预解析器捕获。动态插入(document.createElement('script'))、模块导入(import('./x.js'))、或通过 JS 拼接字符串注入的 script 标签,完全逃逸预加载机制。
- 避免在 HTML 中用 JS 动态写入 script 标签,哪怕只是初始化逻辑
- 服务端渲染(SSR)时保持关键脚本为原始标签,不要由框架 runtime 后置注入
- type="module" 脚本虽默认 defer,预解析器仍能发现并下载,但模块图解析由 JS 引擎接管,不参与传统依赖调度
慎用 async/defer,明确执行意图
async 和 defer 脚本仍会被预解析器发现并提前下载,但执行时机不同,对首屏体验影响显著:
规划您的迪拜之旅 — 哈利法塔观景、沙漠探险、迪拜购物中心购物、棕榈岛度假村及黄金市场砍价。还提供支持...
- async 适合埋点、统计等无依赖独立脚本;但在 Safari 中,多个 async 脚本执行顺序不可控,可能触发竞态
- defer 更适合业务逻辑脚本,它保证执行顺序且不阻塞解析,但会延迟到 DOM 构建完成后——这对需要尽早操作 DOM 的场景(如骨架屏控制)不够及时
- 移动端网络波动大,defer 脚本若体积较大,可能错过用户交互窗口;可考虑配合
DOMContentLoaded前的微任务做轻量初始化
用 preload 主动干预高优脚本加载
当关键脚本不在 HTML 顶部、或需比 CSS 更早发起请求时,<link rel="preload" as="script" href="core.js"> 是最可靠手段:
- 必须指定
as="script",否则 Safari 可能以 text/plain 类型缓存响应,后续<script src></script>加载失败 - preload 只负责下载,不执行;需额外配对一个空
<script src="core.js"></script>或用import()触发执行 - 避免对同一资源同时使用 preload + defer/async,Safari 16.4 之前存在重复下载风险
避开 Safari 特有的预获取干扰
移动端 Safari 会主动预取搜索建议页、历史高频页甚至页面内链接,导致真实脚本加载被带宽挤占或缓存污染:
- 在 iOS 设置中关闭「Siri 与搜索」里的“搜索建议”和“查询建议”
- 在 Safari 偏好设置中关闭“在后台载入‘最佳搜索结果’”和“Safari 建议”
- 启用蜂窝/Wi-Fi 双模低数据模式,系统层抑制非关键预取请求(包括预加载的 JS)










