所有网站通用:6 行 HTML 代码搞定页面加载提速

所有网站通用:6 行 HTML 代码搞定页面加载提速

HTML 复制代码
<script type="speculationrules">
  {
    "prerender": [{ "where": { "href_matches": "/*" }, "eagerness": "moderate" }],
    "prefetch": [{ "where": { "href_matches": "/*" }, "eagerness": "moderate" }]
  }
</script>

把这段 HTML 标签塞进你网站的 `` 里,就能实现近乎瞬间的页面跳转体验!

有没有过这种感觉:点个链接,下一页"唰"地就出来了?这种神奇的秒开体验,现在靠 Chrome 的推测规则 API(Speculation Rules API) 就能轻松实现。这个全新的浏览器特性,只用几行 HTML 就能让页面导航快到飞起。

它是怎么干活的?

Chrome 的推测规则 API 允许开发者" declaratively "(也就是用配置的方式)告诉浏览器该预加载或预渲染哪些页面,从而实现近乎瞬间的加载效果:

  • "prefetch"****(预获取):只让浏览器下载目标页面的顶层 HTML 文件,不渲染页面,也不加载 CSS、JS、图片这些子资源。虽然比预渲染省资源,但提前把 HTML 缓存好,也能省不少加载时间。
  • "prerender"****(预渲染):不仅会下载页面,还会在后台完整渲染------包括拉取所有子资源、执行 JavaScript。等用户真点了链接,直接把后台渲染好的页面"切换"到前台,简直瞬间完成。
  • "eagerness": "moderate":浏览器会这么理解:"等用户把鼠标悬停在链接上 200 毫秒后,我再开始干活"(避免误触时白忙活)。

举个真实场景看看

  1. 用户正在看你网站的某个页面;
  2. 他们把鼠标移到"服务"这个链接上,停了一下;
  3. 浏览器捕捉到这个"想点"的信号,等 200 毫秒(确认不是手滑)后,就开始预渲染或预获取"服务"页面;
  4. 要是用户真点了链接------页面早就准备好了,秒开!

我们 Docuseal 之前是用 Hotwired Turbo 来实现类 SPA 的导航效果,以及 hover 时预加载页面。现在换成推测规则后,不仅删掉了 Turbo 的依赖,还能通过预渲染让重型页面加载更快。

有啥限制?

推测规则 API 目前只支持 Chrome 121 及以上版本。其他浏览器的支持情况看这里:

Chrome Edge Safari Firefox Opera IE Chrome for Android Safari on iOS Samsung Internet
4-120 12-120 - 2-140 10-106 - - - 4-24
121-137 121-137 3.1-18.4 - 107-116 6-10 - 3.2-18.4 25-27
138 138 18.5 141 117 11 138 18.5 28
139-141 - 26.0-TP 142-144 - - - 26.0 -

针对 Firefox 和 Safari 用户,我们写了个简短的降级脚本------hover 时预加载页面,让浏览器缓存起来,点链接时直接复用。这样就算不支持推测规则 API,也能接近秒开。不过比起 Chrome 的预渲染,这些浏览器的重型页面(比如 API 文档页)加载还是会慢一点,毕竟没有原生预渲染加持。

降级脚本在这里:

JavaScript 复制代码
if (!HTMLScriptElement.supports || !HTMLScriptElement.supports('speculationrules')) {
  const preloadedUrls = {};

  function pointerenterHandler () {
    if (!preloadedUrls[this.href]) {
      preloadedUrls[this.href] = true;

      const prefetcher = document.createElement('link');

      prefetcher.as = prefetcher.relList.supports('prefetch') ? 'document' : 'fetch';
      prefetcher.rel = prefetcher.relList.supports('prefetch') ? 'prefetch' : 'preload';
      prefetcher.href = this.href;

      document.head.appendChild(prefetcher);
    }
  }

  document.querySelectorAll('a[href^="/"]').forEach(item =&gt; {
    item.addEventListener('pointerenter', pointerenterHandler);
  });
}

要让这个脚本在 Firefox 和 Safari 上生效,你的页面得加一个 Cache-Control 响应头,并且设置 max-age 值------这样 hover 时预加载的页面才能被缓存,点链接时直接复用。

相关推荐
iReachers1 天前
HTML打包APK(安卓APP)中下载功能常见问题和详细介绍
前端·javascript·html·html打包apk·网页打包app·下载功能
Java陈序员1 天前
告别手写礼簿!一款开源免费的电子红白喜事礼簿系统!
javascript·css·html
唐叔在学习1 天前
insertAdjacentHTML踩坑实录:AI没搞定的问题,我给搞定啦
前端·javascript·html
小则又沐风a1 天前
数据结构->链表篇
前端·html
晓得迷路了1 天前
栗子前端技术周刊第 112 期 - Rspack 1.7、2025 JS 新星榜单、HTML 状态调查...
前端·javascript·html
jinmo_C++1 天前
从零开始学前端 · HTML 基础篇(一):认识 HTML 与页面结构
前端·html·状态模式
winfredzhang1 天前
从零构建:基于 Node.js 的全栈视频资料管理系统开发实录
css·node.js·html·音视频·js·收藏,搜索,缩略图
松涛和鸣2 天前
49、智能电源箱项目技术栈解析
服务器·c语言·开发语言·http·html·php
智航GIS2 天前
10.5 PyQuery:jQuery 风格的 Python HTML 解析库
python·html·jquery
科雷软件测试3 天前
推荐几个常用的校验yaml、json、xml、md等多种文件格式的在线网站
xml·html·md·yaml