别再装库了:这10个浏览器API早就帮你解决问题了

6 阅读5分钟

Web平台比大部分开发者想象中强大得多——而且每年都在悄悄获得新能力。

有时候选题比写文章本身还难。

这周我在琢磨写什么的时候,脑子里只蹦出两种思路:要么是潜在爆款,要么是深度技术分析。😅 但我想来点轻松的。有技术含量,有实用性,但不是那种要研究三天的兔子洞。

既然我真心喜欢探索浏览器能干什么(以及能push到什么程度),就选了个隐藏话题:被低估的Web API

这些API有些可能是你的日常必备。但我敢说至少有几个会让人惊呼"等等,这玩意儿早就有了?!"😉

顺便说一句,如果你喜欢前沿技术话题,而且今年4月刚好在意大利——来jsday.it吧,我会在那讲WebGPU + WASM 🙂

好了,不废话了。开始吧。

这里有10个值得更多关注的浏览器API。

1) Structured Clone API

这个我是又爱又恨。

多年来,我最喜欢问面试者的问题之一就是:

"你怎么拷贝一个对象?"

从答案里能看出太多东西:

  • 他们理解引用吗?
  • 知道 Object.assign、展开运算符、JSON技巧吗?
  • 会提到第三方库吗?
  • 慌不慌?😄

现在呢?

javascript

const copy = structuredClone(original);

搞定。完美的深拷贝。

一方面我挺开心的。另一方面我有点怀念那个面试问题了。

额外好处

  • 支持 MapSetDateBlobFileArrayBuffer
  • 能处理循环引用(不会再有JSON.stringify爆炸💥)
  • 不会克隆函数

浏览器支持:现代浏览器(Chrome、Firefox、Safari、Edge)。可以放心用在生产环境。

2) Performance API

非常被低估。

我们聊性能聊得很多。装各种工具。跑Lighthouse。辩论优化方案。

但有时候你就想知道:"A到底比B快,还是我在过度工程化?"

javascript

performance.mark("start");

// 要测量的代码

performance.mark("end");
performance.measure("calc", "start", "end");

console.log(performance.getEntriesByName("calc"));

适合:

  • 微基准测试
  • 检查Worker或WASM值不值得用
  • 检验你的假设是不是对的

因为有时候"优化后"的版本反而更慢😅

浏览器支持:所有现代浏览器都很好。


3) Page Visibility API

检测标签页是否激活。

javascript

document.addEventListener("visibilitychange", () => {
  if (document.hidden) {
    video.pause();
  }
});

实话说:用户会打开你的应用,然后切到别的标签页20分钟。或者2小时。或者永远。

用途:

  • 暂停视频
  • 停止轮询
  • 降低CPU占用
  • 更精准的数据统计

你的后端(和电池)会感谢你的。

浏览器支持:所有现代浏览器。


4) ResizeObserver

终于——能监听元素尺寸了,不只是窗口尺寸。

javascript

const ro = new ResizeObserver(entries => {
  for (const entry of entries) {
    console.log(entry.contentRect.width);
  }
});

ro.observe(element);

如果你做过响应式组件、图表或仪表盘,可能写过一些诡异的resize逻辑。

这个API就像浏览器在说:"放轻松,我搞定了。"

浏览器支持:现代浏览器,广泛可用。


5) IntersectionObserver

ResizeObserver的兄弟。

检查元素是否在可视区域内。

javascript

const io = new IntersectionObserver(entries => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      console.log("可见了!");
    }
  });
});

io.observe(element);

适合:

  • 无限滚动
  • 懒加载
  • 滚动动画

手动实现过一次无限滚动的人……再也不想干第二次了😄

浏览器支持:所有现代浏览器。


6) AbortController

很多开发者知道它能用在fetch上……

但它能取消的不止fetch

javascript

const controller = new AbortController();

fetch(url, { signal: controller.signal });

// 之后
controller.abort();

还能用在:

  • 事件监听器
  • 任何可中止的API

更棒的是:👉 一个signal可以取消多个操作。

干净、可扩展,非常"成熟代码库"友好。

浏览器支持:所有现代浏览器。


7) Idle Detection API

Page Visibility告诉你标签页是否激活。Idle Detection告诉你是否活跃。

javascript

const detector = new IdleDetector();

await detector.start();

detector.addEventListener("change", () => {
  console.log(detector.userState);
});

意思是:用户可能开着你的应用……但实际在泡咖啡☕或者开会。

用途:

  • 自动登出
  • "离开"状态
  • 后台优化

是的,你能检测到用户离开了电脑。有点creepy。但很实用😄

浏览器支持:主要是基于Chromium的。需要权限。


8) BroadcastChannel API

简单的多标签页通信。

javascript

const channel = new BroadcastChannel("app");

channel.postMessage("logout");

channel.onmessage = e => {
  console.log(e.data);
};

适合:

  • 同步登出
  • 认证状态
  • 共享会话逻辑

在用户"以防万一"开5个标签页的实际应用中特别实用。

浏览器支持:现代浏览器。Safari后来也支持了。


9) Web Locks API

BroadcastChannel的表亲。

防止多个标签页重复工作。

javascript

navigator.locks.request("data-lock", async lock => {
  await fetchData();
});

例子:

  • 只让一个标签页拉取通知
  • 避免轰炸后端
  • 协调共享资源

感觉很"分布式系统遇上前端"。

浏览器支持:主要是Chromium。不是所有浏览器都支持。


10) File System Access API

没错——浏览器直接访问真实文件系统。

javascript

const [fileHandle] = await window.showOpenFilePicker();
const file = await fileHandle.getFile();

适合:

  • Web编辑器
  • 导入/导出工具
  • 高级用户应用

第一次用的时候感觉有点像非法操作。好像"Web上真的能这么干?"😄

浏览器支持:主要是Chromium。其他浏览器支持有限。


现实检查🧠

这些API大部分在现代浏览器中都支持得很好。但有些(Idle Detection、File System Access、Web Locks)还是以Chromium为主。

所以全力投入之前一定要检查兼容性。

但光是知道这些存在?就已经让你领先一步了。

Web平台进化很快。有时候"新技术"不是框架——而是浏览器里一直静静躺着的原生功能。

原文出处: Stop Installing Libraries: 10 Browser APIs That Already Solve Your Problems
作者: Sylwia Laskowska