福州英文网站建设不用淘宝客api如何做网站

张小明 2025/12/31 11:49:29
福州英文网站建设,不用淘宝客api如何做网站,中信建设有限责任公司中标公示,网址大全123流式SSR就是一种渐进式渲染#xff0c;在传统的页面加载流程是#xff1a;请求 → 等待 → 渲染。而渐进式渲染的思路是#xff1a;立即展示缓存的页面快照#xff08;即使是旧内容#xff09;后台请求最新的页面内容无缝替换为最新内容这样用户感知到的加载时间接近于零在传统的页面加载流程是请求 → 等待 → 渲染。而渐进式渲染的思路是立即展示缓存的页面快照即使是旧内容后台请求最新的页面内容无缝替换为最新内容这样用户感知到的加载时间接近于零体验类似于原生 App。前面笔者的文章中提到关于H5页面的快照是客户端做的。本篇文章讲述一种基于 Service Worker 的渐进式渲染方案的原理简单来讲就是将客户端的工作挪到了service worker中。通过给站点开启一个后台运行的service workerservice worker可以独立于webview运行在后台在service worker中劫持包括主文档在内的网络请求对文档内容进行存储并修改返回。技术方案设计整体架构┌─────────────┐ │ 用户访问 │ └──────┬──────┘ │ ▼ ┌─────────────────┐ │ Service Worker │ ◄─── 拦截请求 └────┬────────┬───┘ │ │ │ └─────────┐ ▼ ▼ ┌─────────┐ ┌──────────┐ │ 缓存快照 │ │ 网络请求 │ └────┬────┘ └─────┬────┘ │ │ └────────┬────────┘ ▼ ┌─────────────┐ │ 流式替换 │ └─────────────┘核心代码实现1. HTML 页面注册 Service Worker!DOCTYPE html html langen head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title渐进式渲染示例/title /head body h1Hello World/h1 script data-snapshot (function () { const swEnabled location.search.indexOf(x-swfalse) 0; // 注册 Service Worker swEnabled navigator.serviceWorker navigator.serviceWorker.register(/sw.js) .then(function (registration) { console.log(Service Worker 注册成功:, registration); }) .catch(function (error) { console.log(Service Worker 注册失败:, error); }); // 如果禁用则注销 Service Worker !swEnabled navigator.serviceWorker navigator.serviceWorker.getRegistration(location.href).then((r) { r r.unregister(); }); }()); /script /body /html关键点说明data-snapshot属性标记这是快照阶段需要保留的脚本支持通过?x-swfalse参数禁用 Service Worker禁用时会自动注销已注册的 Service Worker2. Service Worker 核心逻辑// sw.js self.addEventListener(fetch, (event) { // 只拦截主文档请求 if (event.request.destination ! document) { return; } // 支持禁用功能 if (event.request.url.indexOf(x-swfalse) 0) { event.waitUntil(caches.delete(my-cache)); return; } event.respondWith(handleFetch(event.request)); }); self.addEventListener(install, (event) { console.log(Service Worker 安装); self.skipWaiting(); // 立即激活 });3. 脚本过滤策略function replaceScripts(text, regularStream) { return text.replace(/script\b[^]*(?:(?!\/script)[^]*)*\/script/gi, (match) { // 快照阶段只保留 data-snapshot 脚本 // 正式阶段只保留普通脚本 if (match.indexOf(data-snapshot) 0) { return regularStream ? : match; } return regularStream ? match : ; }); }为什么要过滤脚本快照阶段避免执行业务逻辑脚本可能依赖未加载的资源正式阶段避免重复执行初始化脚本4. 流式渲染核心function withSnapshot(snapshot, request) { return new Response(new ReadableStream({ start(controller) { const encoder new TextEncoder(); const decoder new TextDecoder(); // 第一步立即输出快照 controller.enqueue(encoder.encode(snapshot)); let firstStream true; // 第二步请求最新内容 fetchAndStore(request).then((response) { const reader response.body.getReader(); function push() { reader.read().then(({ done, value }) { if (done) { controller.close(); return; } if (firstStream) { firstStream false; // 第三步清空页面 controller.enqueue(encoder.encode( scriptdocument.head.innerHTML ;document.body.innerHTML ;/script )); // 第四步注入最新内容 const text decoder.decode(value); const head text.match(/head([\s\S]*?)\/head/i); const body text.match(/body([\s\S]*?)\/body/i); if (head body) { controller.enqueue(encoder.encode( scriptdocument.head.innerHTML ${head[1].trim().replace(/\n/g, )}/script )); controller.enqueue(encoder.encode(replaceScripts(body[1], true))); } } else { controller.enqueue(value); } push(); }); } push(); }); }, })); }为什么要清空 DOM快照内容和最新内容可能结构不同直接追加会导致内容重复清空后重新注入确保页面状态一致为什么用 innerHTML 注入流式响应中我们无法直接操作 DOM只能通过推送script标签让浏览器执行 JavaScriptinnerHTML是最简单的 DOM 替换方式5. 缓存管理Service Worker 的缓存存储在 Cache Storage API 中这是浏览器提供的专门用于 Service Worker 的持久化存储空间。实际上不需要关心物理位置因为浏览器完全管理这些文件。function fetchAndStore(request) { return fetch(request) .then((networkResponse) { if (networkResponse.ok) { // 克隆响应用于缓存 const cacheResponse networkResponse.clone(); caches.open(my-cache).then((cache) { cache.put(request, cacheResponse); }); } return networkResponse; }); } function handleFetch(request) { return caches.match(request) .then((response) { if (response) { // 有缓存先展示快照再更新 return readResponseText(response).then((snapshot) { return withSnapshot(snapshot, request); }); } // 无缓存直接请求 return fetchAndStore(request); }); }为什么要 clone 响应Response 对象的 body 只能读取一次流的特性需要一份给缓存一份给浏览器clone()创建独立的副本工作流程详解首次访问无缓存用户访问 → Service Worker 拦截 → 无缓存 → 网络请求 → 返回内容 → 存入缓存二次访问有缓存用户访问 ↓ Service Worker 拦截 ↓ 读取缓存快照去除普通脚本 ↓ 立即返回快照内容 ← 用户看到页面 ↓ 后台发起网络请求 ↓ 清空 DOM ↓ 注入最新 head 和 body ↓ 更新缓存注意事项上述只讲述了该方案的基本原理实际应用要考虑更多的因素如App 环境兼容性、缓存策略、基础设施依赖等下面是方案对比维度客户端方案Service Worker 方案首次访问拦截✅ 可以拦截❌ 无法拦截跨平台能力❌ 需要各端适配✅ Web 标准通用更新速度⚠️ 需要发版✅ 实时生效开发成本⚠️ 需要端上开发⚠️ 需要 Web 开发维护成本❌ 多端维护✅ 单一维护灵活性⚠️ 受限于客户端版本✅ 完全可控降级能力⚠️ 需要发版回滚✅ 秒级降级总结如果你的业务是纯 Web 应用PWA) → Service Worker 是最佳选择如果你的业务在 App 内 → 优先考虑客户端方案
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

小型网站开发教程yandex搜索引擎入口

如何快速构建智能安防系统:wvp-GB28181-pro AI集成实战指南 【免费下载链接】wvp-GB28181-pro 项目地址: https://gitcode.com/GitHub_Trending/wv/wvp-GB28181-pro 痛点洞察:传统安防系统的三大困境 当前视频监控系统普遍面临识别效率低、响应…

张小明 2025/12/29 8:17:11 网站建设

网站产品策划青白江做网站的公司

终极游戏登录神器:告别繁琐扫码的自动化解决方案 【免费下载链接】MHY_Scanner 崩坏3,原神,星穹铁道的Windows平台的扫码和抢码登录器,支持从直播流抢码。 项目地址: https://gitcode.com/gh_mirrors/mh/MHY_Scanner 还记得…

张小明 2025/12/29 5:21:52 网站建设

有网站如何做淘宝客qq官方网站进入

Windows平台Nginx-RTMP流媒体服务器快速部署指南 【免费下载链接】nginx-rtmp-win32 Nginx-rtmp-module Windows builds. 项目地址: https://gitcode.com/gh_mirrors/ng/nginx-rtmp-win32 您是否希望在Windows系统上快速搭建一个专业的流媒体直播环境?Nginx…

张小明 2025/12/28 11:17:40 网站建设

高端网站设计企业定制营销的例子有哪些

分布式电源接入对配电网影响分析 关键词:分布式电源 配电网 评估 参考文档:《自写文档,联系我看》参考选址定容模型部分; 仿真平台:MATLAB 主要内容:代码主要做的是分布式电源接入场景下对配电网运行影…

张小明 2025/12/31 8:15:14 网站建设

广告公司寮步网站建设价钱响应式公司网站

西门子1500PLC某大型物流中心分拣线程序案例 由18个远程IO模块和39个ST40CPU组态,多种线体分拣程序,使用大华扫码枪扫码上传,程序采用SCL进行编程,程序注释齐全,逻辑清晰,可参考性较好。 V15版本打开 包含…

张小明 2025/12/31 10:22:48 网站建设

客户端网站建设文档企业网站推广定义

第一章:工业机器人Agent精度的核心挑战在现代智能制造系统中,工业机器人作为执行关键任务的Agent,其操作精度直接影响生产质量与效率。然而,在实际部署中,多种因素共同制约着机器人Agent的精度表现。机械结构误差的累积…

张小明 2025/12/29 4:50:58 网站建设