现代Web API应用与优化建议

news/2025/11/9 14:12:55/文章来源:https://www.cnblogs.com/amulong1237/p/19204227

1. ResizeObserver:像素级「监听」元素尺寸

痛点window.resize 只能监听视口,图表容器被 flex 布局偷偷撑开你却拿不到回调。
一行代码

new ResizeObserver(entries => myChart.resize()).observe(document.querySelector('#chart'));

生产场景:ECharts、AntV 自适应、虚拟滚动条重算高度。
兼容:Chromium 64+、FF 69+、Safari 13.1+,polyfill 3 KB。

2. IntersectionObserver:懒加载 & 曝光埋点「零 JS」

痛点:手写滚动监听,一滚动就掉帧。
一行代码

const io = new IntersectionObserver(([{isIntersecting}]) => {   isIntersecting && sendExposure(); }, {threshold: 0.5}); io.observe(document.querySelector('#ad'));

生产场景:图片懒加载、视频自动播放、埋点曝光。
注意rootMargin 支持 "50px 0px" 提前触发,做预加载神器。

3. Page Visibility:标签页切走,自动暂停一切

痛点:用户切后台,你的轮询 & 动画还在烧电。
一行代码

document.addEventListener('visibilitychange', () => {   document.hidden ? video.pause() : video.play(); });

生产场景:直播、游戏、轮询接口、WebSocket 心跳。
隐藏彩蛋document.visibilityState 还能区分 "prerender"

4. Web Share:「系统级分享」一呼百应

痛点:自己写分享面板,安卓 & iOS & PC 永远调不好。
一行代码

navigator.share({title: '白皮书', text: '2025 前端趋势', url: location.href});

生产场景:H5 页一键分享到微信、Telegram、邮件。
注意:必须用户手势触发,HTTPS 下可用。

5. Wake Lock:让屏幕「常亮」

痛点:直播、PPT 演示 30 秒后自动息屏,老板以为你卡了。
一行代码

const lock = await navigator.wakeLock.request('screen');

生产场景:直播、在线会议、车载中控 HMI。
隐藏彩蛋:页面可见性变化会自动释放,记得重新申请。

6. Broadcast Channel:同域标签页「微信群」

痛点:A 标签登录,B 标签 302 还在登录页。
一行代码

new BroadcastChannel('login').postMessage({token});

生产场景:登录态同步、主题色切换、购物车合并。
注意同域限制,跨域请用 localStorage + storage 事件。

7. PerformanceObserver:性能指标「无侵入」采集

痛点:手动算 FCP、LCP、FID 太麻烦。
一行代码

new PerformanceObserver(list => {   for (const entry of list.getEntries()) analytics.send(entry.name, entry.startTime); }).observe({type: 'paint'});

生产场景:灰度发布性能回归、SLA 看板。
隐藏彩蛋element 类型能拿到 LCP 具体 DOM。

8. requestIdleCallback:浏览器「闲时」偷偷干活

痛点:埋点、日志上传阻塞主线程,导致掉帧。
一行代码

requestIdleCallback(() => sendLogs(), {timeout: 2000});

生产场景:非关键日志、预加载下一路由。
注意:React 18 的 startTransition 底层就是它。

9. scheduler.postTask:原生「优先级」队列

痛点:后台数据同步抢走了用户点击的算力。
一行代码

scheduler.postTask(refreshData, {priority: 'background'});

生产场景:低优先级数据同步、预渲染。
隐藏彩蛋:支持 signal 与 AbortController 联动取消。

10. AbortController:fetch「取消」竞态

痛点:快速切换 Tab,旧请求后回来覆盖新数据。
一行代码

const ctrl = new AbortController(); fetch(url, {signal: ctrl.signal}); ctrl.abort(); // 任意时机取消

生产场景:搜索框联想、路由切换清理。
隐藏彩蛋:同时能取消 ReadableStreamscheduler.postTask

11. ReadableStream:大文件「流式」下载

痛点:1 GB 安装包一次性读进内存,Tab 直接崩。
一行代码

const reader = response.body.getReader(); while (true) {   const {done, value} = await reader.read();   if (done) break;   await writeChunk(value); }

生产场景:断点续传、进度条。
隐藏彩蛋:配合 BYOB 能把内存占用再降 30%。

12. WritableStream:大文件「流式」上传

痛点:前端生成 500 MB CSV,直接 xhr.send(blob) 必崩。
一行代码

const writer = (await fetch(url, {method: 'POST', body: stream})).body.getWriter();

生产场景:日志实时上传、SQLite 备份。
注意:需要服务端支持 Transfer-Encoding: chunked

13. Background Fetch:PWA「断网续传」

痛点:用户下载到 99%,地铁进隧道,回来又要重下。
一行代码

sw.registration.backgroundFetch.fetch('pkg', ['/1.zip', '/2.zip']);

生产场景:App Shell、游戏资源包。
隐藏彩蛋:系统通知栏自带进度,用户可暂停/继续。

14. File System Access:浏览器里「读写」本地文件

痛点:用户想保存 .psd,你只能给 .zip 下载。
一行代码

const h = await window.showSaveFilePicker(); const w = await h.createWritable(); await w.write(blob);

生产场景:Web IDE、在线 Photoshop、Notion 本地备份。
注意:需要用户主动交互,HTTPS 下可用。

15. Clipboard:「异步」剪贴板

痛点:老派 document.execCommand('copy') 被 Chrome 废弃。
一行代码

await navigator.clipboard.writeText('Hello, 2025!');

生产场景:代码编辑器、在线 Excel。
隐藏彩蛋clipboard.read() 能读图片,做「一键去水印」神器。

16. URLSearchParams:告别「手写」正则

痛点:拼接参数总是漏 &、多 ?
一行代码

const p = new URLSearchParams({q: '前端', year: 2025}); console.log(p.toString()); // q=%E5%89%8D%E7%AB%AF&year=2025

生产场景:任意 GET 请求、分页跳转。
隐藏彩蛋URLSearchParams 本身是可迭代对象,可以直接 for-of

17. structuredClone:「深拷贝」循环引用

痛点JSON.parse(JSON.stringify(obj)) 掉 functionDateundefined
一行代码

const copy = structuredClone(original);

生产场景:Redux 巨型 Store、画板历史记录。
注意:支持 Map/Set/Blob/File,但不拷贝函数

18. Intl.NumberFormat:「千分位 & 货币」一步到位

痛点:后端给 1234567.89,你要显示「¥ 123 万」。
一行代码

new Intl.NumberFormat('zh-CN', {style: 'currency', currency: 'CNY'}).format(1234567); // ¥1,234,567.89

生产场景:电商价格、股票行情。
隐藏彩蛋unit: 'meter-per-second' 直接显示 5 m/s。

19. EyeDropper:浏览器级「吸管」

痛点:用户想在网页取色,你还要靠 Canvas 自己算像素。
一行代码

const {sRGBHex} = await new EyeDropper().open();

生产场景:在线设计工具、主题色提取。
注意:需要用户手势触发,Chromium 95+。

20. WebCodecs:「原生硬解」4K 视频

痛点:H.265 10bit 在浏览器卡成 PPT。
一行代码

const decoder = new VideoDecoder({output: frame => canvas.draw(frame), error: e => console.error(e)}); decoder.configure({codec: 'hvc1.1.6.L120.90'});

生产场景:在线剪辑、云游戏、安防监控。
隐藏彩蛋:支持 WebWorker 解码,主线程 0 占用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/960489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 云计算核心技术:原理、组件与 K8s 实战部署 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

局域网---传输文件资料信息

我们在进行文件传输的过程中,通常都是使用微信传输,但是微信传输会被自动压缩,特别是在传输视频的时候。而且微信传输文件,如果不注意清理,就会导致存储的文件越来越多,内存占据越来越多。 推荐一个局域网的传输…

ICPC2023南京个人题解

I. Counter 题意:给定一个初始值为零的计数器,每次操作可以使值+1或者变为0,再给定 \(m\) 个特定时间 \(a_i\) 的对应计数器的值 \(b_i\) ,问有没有可能的长度为 \(n\) 的操作序列满足所有条件。 限制条件:\(1\le…

从C++到wasm,并在JavaScript中调用

我将为你提供一个完整的从 C++ 编译到 WebAssembly 并在 JavaScript 中调用的指南。 环境准备 1. 安装 Emscripten # 克隆 emsdk 仓库 git clone https://github.com/emscripten-core/emsdk.git cd emsdk# 安装最新版本…

图书馆管理系统初步设计

图书馆管理系统开发记录 1. 我使用了什么AI工具辅助选题 在项目初期,我使用了deepseek和豆包等AI工具辅助选题。通过与这些工具交流,了解了当前常见的Java课程设计选题方向,分析了不同选题的可行性和复杂度,最终结…

Delphi 修改单元名称后,编译报错找不到修改前的单元

原因是: 被修改的单元的名称,没有同步到早前引用了该单元的单元中. 做个比喻就是 张三改名为李四,以后大家也都叫他李四,但是在他没改名之前,注册在某单元里面的名字还是叫张三. 解决方案是: 菜单 - 搜索 - 在文件中查…

详细介绍:计算某字符出现次数

详细介绍:计算某字符出现次数pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

3dgs Scene详解 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

英语_阅读_30 years ago_待读

It was a few years ago. 那是几年前的事了。 A friend had sent me a restaurant gift card for Christmas and I had picked a sunny Sunday afternoon to use it. 一个朋友送了我一张餐厅礼品卡做圣诞礼物,我选了一…

2026 NOI 做题记录(九)

推荐阅读:A、F、G、I、PContest Link \(\text{By DaiRuiChen007}\)*A. [P11984] 占卜 3 (8.5) Problem Link 首先朴素的想法就是用 \(a\) 个 \(0\) 和 \(b\) 个 \(1\) 表示 \(\binom{a}{a+b}\) 级别的信息。 有几个问…

英语_阅读_When youre bored_待读

When youre bored, what will you do first? 当你感到无聊时,你会先做什么? If youre like many, the answer is quite simple: You reach for your phone. 如果你和许多人一样,答案很简单:你会拿起手机。 Five m…

教学视频(1)

一、剪辑元素 剪辑需要的部分,加上音乐、文字、元素、台词、镜头图片 二、录播软件 直播伴侣(自带美颜) obs studio obs 多平台操作,操作步骤复杂点 ev录屏 部分功能受限 芦笋软件 手机 x recorder 手机录…

实用指南:C++STL---静态数组array

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

设置linux时间

# 设置时区 sudo timedatectl set-timezone Asia/Shanghai # 开启设置时间 timedatectl set-ntp no # 具体设置时间 timedatectl set-time "2025-06-11 19:05:55" # 重启 reboot # 立即关机 sudo shutdow…

MCP神器!一键部署连接任何MCP服务器

Hello, 大家好,我是程序员海军, 全栈开发 |AI爱好者 | 独立开发。最近一直在研究MCP方面的事情,使用的技术栈是Python + FastAPi + FastMCP,开发了多个MCP-Server,本地化访问没啥问题,准备部署试着玩一下,调研…

MCP神器!一键部署连接任何MCP服务器

Hello, 大家好,我是程序员海军, 全栈开发 |AI爱好者 | 独立开发。最近一直在研究MCP方面的事情,使用的技术栈是Python + FastAPi + FastMCP,开发了多个MCP-Server,本地化访问没啥问题,准备部署试着玩一下,调研…

输入法与思维的边界:一个人重塑输入法的旅程

本文用于记录我与输入法的故事和记录 Apple 生态在 rime 上配置双拼 + 辅助码的过程。输入法与思维的边界:一个人重塑输入法的旅程本文用于记录我与输入法的故事和记录 Apple 生态在 rime 上配置双拼 + 辅助码的过程,…

英语_阅读_Why we dislike change_待读

Most people hate change, which is sad since we often go through changes in life. 大多数人讨厌变化,这很可悲,因为我们的人生中经常会经历变化。 And for some of us, even the smallest changes can upset our…

游戏编程模式-享元模式(Flyweight) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:css、dom 性能优化方向

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …