20个浏览器的原生能力

JavaScript性能优化实战 10w+人浏览 461人参与

在各种组件、插件、JS库大行其道的今天,很少人知道,很少人直接使用这些浏览器原生的API,仅次记录。

1.ResizeObserver

用来监听DOM的宽高尺寸变化,适用图表的自适应、长列表的虚拟滚动、长列表中每一行的数据高度不同时如何的优化加载

new ResizeObserver(([e]) => chart.resize(e.contentRect.width)).observe(chartDom);

2.IntersectionObserver

监测元素进入或退出视图窗口,可以设置监测出现比例,适用性能优化、例如图片的懒加载

new IntersectionObserver(entrieList =>
  entrieList.forEach(e => e.isIntersecting && loadImg(e.target))
).observe(img);

3.Page Visibility

监测标签页的隐藏,自动暂停视频、停止轮询、移动端省电

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

4.Web Share

一键唤起系统分享面板,直达微信、微博、Telegram,需要HTTPS,电脑端也可唤起

navigator.share?.({ title: '好文', url: location.href });

5.Web Lock

锁定屏幕常亮,直播、PPT、阅读器不再自动息屏

await navigator.wakeLock.request('screen');

6.Broadcast Channel

同域标签实时广播消息,登录态秒同步,告别localStorage轮询

const bc = new BroadcastChannel('auth');
bc.onmessage = () => location.reload();

7.PerformanceObserver

无侵入采集 FCPLCPFID,一行代码完成前端性能监控

new PerformanceObserver(list =>
  list.getEntries().forEach(sendMetric)
).observe({ type: 'largest-contentful-paint', buffered: true });

8.requestldleCallback

将埋点、日志丢进浏览器的空闲时间,首帧零阻塞

requestIdleCallback(() => sendBeacon('/log', data));

9.scheduler.postTask

原生优先级任务队列,低优先级任务后台跑,不占用主线程资源

scheduler.postTask(() => sendBeacon('/log', data), { priority: 'background' });

10.AbortController

取消异步请求、fetch、promise

const ac = new AbortController();
fetch(url, { signal: ac.signal });
ac.abort();

11.ReadableStream

分段读取响应流,边下载边渲染,处理大文件内存问题

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

12.WritableStream

逐块写入磁盘或网络,实时保存草稿、上传大文件更稳定

const writer = stream.writable.getWriter();
await writer.write(chunk);

13.Background Fetch

PWA后台静默下载,断网恢复继续、课程视频的提前缓存

await registration.backgroundFetch.fetch('video', ['/course.mp4']);

14.File System Access

读写本地真实文件,需要用户授权,web ide 开箱即用

const [fh] = await showOpenFilePicker();
editor.value = await (await fh.getFile()).text();

15.Clipboard

异步读写剪贴板,无需第三方库,HTTPS环境安全复制

await navigator.clipboard.writeText('邀请码 9527');

16.URLSeachParams

解析、修改、构造URL查询串,告别手写正则

const p = new URLSearchParams(location.search);
p.set('page', 2);
history.replaceState({}, '', `?${p}`);

17.structuredClone

深拷贝对象、数组、Map、Date,循环引用也能完美复制

const copy = structuredClone(state);

18.Intl.NumberFormat

千分位、货币、百分比一次性格式化,国际化零配置

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

19.EyeDropper

浏览器级吸管工具,像素级取色,设计系统直接调用

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

20.WebCodecs

原生硬解码音视频,4k 60帧流畅播放,降低CPU占用

const decoder = new VideoDecoder({
  output: frame => ctx.drawImage(frame, 0, 0),
  error: console.error
});
decoder.configure({ codec: 'vp09.00.10.08' });

参考文章:https://mp.weixin.qq.com/s/3B88ZJtpRciGJDi5vcNn4g

浏览器原生通信模块是实现浏览器与操作系统之间高效交互的核心组件之一,它主要用于处理浏览器前端界面(通常基于 HTML/CSS/JavaScript)与底层系统资源之间的数据交换。这类模块在现代浏览器中广泛存在,并且在开发定制化浏览器或基于 Chromium 的应用时尤为重要。 ### 通信机制的基本原理 浏览器原生通信模块主要依赖于 IPC(Inter-Process Communication,进程间通信)机制。在 Chromium 架构中,渲染进程(负责网页内容展示)与主进程(负责窗口管理、网络请求等)之间通过 IPC 进行通信。这种设计不仅提升了安全性,也增强了系统的稳定性。 例如,在 Electron 或 Tauri 等框架中,开发者可以借助 IPC 来调用原生功能,如文件读写、系统通知等。Tauri 提供了类似的能力,允许通过 Rust 编写的后端模块与前端 JavaScript 进行安全的数据交换[^2]。 ### 开发指南与关键技术点 #### 1. **定义通信接口** 在开发过程中,首先需要定义清晰的通信接口。通常使用 JSON 格式来封装请求和响应数据,确保前后端之间的信息传递结构统一。例如: ```json { "command": "read_file", "payload": { "path": "/example.txt" } } ``` #### 2. **实现 IPC 桥接层** 对于基于 Chromium 的项目(如 Electron),可以使用 `ipcMain` 和 `ipcRenderer` 模块来建立通信通道。而在 Tauri 中,则可以通过 Rust 编写的命令处理器来接收前端请求并返回结果[^3]。 **Electron 示例代码:** ```javascript // 主进程 const { ipcMain } = require('electron'); ipcMain.on('read-file', (event, path) => { fs.readFile(path, 'utf8', (err, data) => { if (err) { event.reply('read-file-response', { error: err.message }); } else { event.reply('read-file-response', { content: data }); } }); }); // 渲染进程 const { ipcRenderer } = require('electron'); ipcRenderer.send('read-file', '/path/to/file.txt'); ipcRenderer.on('read-file-response', (event, response) => { console.log(response.content); }); ``` #### 3. **权限控制与安全性** 在访问本地资源(如文件系统、注册表、网络接口等)时,必须进行严格的权限控制。Tauri 在配置文件中提供了对模块权限的声明方式,确保只有经过授权的功能才能被调用[^3]。 #### 4. **性能优化** 由于 IPC 是跨进程操作,频繁调用可能会影响性能。因此建议将多个小请求合并为一个大请求,或者使用异步非阻塞的方式处理任务,避免主线程被阻塞。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值