每日一个知识点:浏览器原生能力

40 阅读3分钟

什么是“浏览器原生能力”?

它指的是由 W3C、WHATWG 等标准组织制定规范,并由 浏览器引擎(如 Blink、Gecko、WebKit) 直接实现的功能。开发者通过 JavaScript 调用这些 API,浏览器负责调用底层的操作系统硬件或服务来执行操作。下面我来简单列出一些常用的API

一、​​渲染与DOM操作​​

  1. ​ResizeObserver​

    • ​功能​​:精准监听元素尺寸变化(如响应式布局调整)

    • ​示例​​:图表自适应、虚拟滚动优化

    new ResizeObserver(entries => { entries.forEach(entry => console.log(entry.contentRect.width)); }).observe(document.querySelector('.chart'));

2.​​ IntersectionObserver​

  • ​功能​​:检测元素是否进入/离开视口(懒加载、曝光埋点)

  • ​优势​​:零性能损耗,替代滚动事件监听

    const observer = new IntersectionObserver(entries => { entries.forEach(entry => entry.isIntersecting && loadImage(entry.target)); }); observer.observe(document.querySelector('.lazy-image'));

3.MutationObserver​

  • ​功能​​:监听DOM树变化(如动态内容监控)

    new MutationObserver(mutations => { mutations.forEach(mutation => console.log('DOM changed:', mutation)); }).observe(document.body, { childList: true });

二、​​网络与通信​

1.Fetch API​

  • ​功能​​:现代网络请求(替代XMLHttpRequest)

  • ​特性​​:Promise支持、流式响应(ReadableStream)

    fetch('/api/data') .then(response => response.body.getReader()) .then(reader => readStream(reader)); // 边下载边处理

2.​​WebSocket​

  • ​功能​​:双向实时通信(聊天室、在线游戏)

    const socket = new WebSocket('wss://example.com'); socket.onmessage = (event) => console.log('收到消息:', event.data);

3.​​Service Worker​

  • ​功能​​:离线缓存、后台同步(PWA核心)

    self.addEventListener('install', event => { event.waitUntil(caches.open('v1').then(cache => cache.addAll(['/index.html']))); });

三、​​数据存储​​

  1. ​Web Storage​

    • ​LocalStorage​​:持久化键值存储(无过期时间)

    • ​SessionStorage​​:会话级存储(页面关闭失效)

    localStorage.setItem('theme', 'dark'); const theme = localStorage.getItem('theme');

2.​​ IndexedDB​

  • ​功能​​:客户端数据库(支持复杂查询、事务)

    // 这是一个复杂API的简单示例,通常会用库(如 idb)简化操作 const request = indexedDB.open('MyDatabase', 1);

    request.onsuccess = (event) => { const db = event.target.result; const transaction = db.transaction(['books'], 'readwrite'); const store = transaction.objectStore('books'); store.add({ id: 1, title: 'Web API Guide', author: 'AI' }); // 存储数据 };

四、​​设备与硬件访问​

1.Geolocation API​

  • ​功能​​:获取用户地理位置(需授权)

    navigator.geolocation.getCurrentPosition(position => { console.log(纬度:${position.coords.latitude}, 经度:${position.coords.longitude}); });

2.Clipboard API​

  • ​功能​​:异步读写剪贴板(HTTPS必需)

    navigator.clipboard.writeText('邀请码:9527') .then(() => alert('复制成功!'));

3.MediaDevices API​

  • ​功能​​:访问摄像头/麦克风

    navigator.mediaDevices.getUserMedia({ video: true }) .then(stream => videoElement.srcObject = stream);

五、​​性能优化​​

  1. ​requestIdleCallback​

    • ​功能​​:将任务延迟到浏览器空闲时段执行(避免阻塞渲染)

    requestIdleCallback(() => { sendAnalyticsData(); // 非关键任务 });

2.scheduler.postTask​

  • ​功能​​:控制任务优先级(如后台日志上传)

    scheduler.postTask(() => uploadLog(), { priority: 'background' });

六、​​安全与隐私​​

  1. ​Content Security Policy (CSP)​

    • ​功能​​:防止XSS攻击(通过HTTP头配置)

    Content-Security-Policy: default-src 'self'; script-src 'self' trusted.cdn

2.SameSite Cookies​

  • ​功能​​:防CSRF攻击(设置SameSite=StrictLax

    document.cookie = "session=abc123; SameSite=Lax; Secure";

绝大多数强大的 API 都要求页面通过 HTTPS 提供服务(http://localhostfile:// 除外,用于本地开发)。这是为了防止中间人攻击。

七、​​多媒体处理​​

  1. ​WebRTC​

    • ​功能​​:浏览器间实时音视频通信(无需插件)

    const peerConnection = new RTCPeerConnection(); peerConnection.addTrack(localStream.getTracks()[0], localStream);

2.Web Audio API​

  • ​功能​​:音频合成与处理(如语音降噪)

    const audioContext = new AudioContext(); const oscillator = audioContext.createOscillator(); oscillator.connect(audioContext.destination); oscillator.start();

八、​​用户界面增强​​

  1. ​Web Share API​

    • ​功能​​:原生分享面板(一键分享到社交平台)

    navigator.share({ title: '文章标题', text: '文章摘要', url: window.location.href });

2.Page Visibility API​

  • ​功能​​:检测页面可见性(优化视频暂停、轮询停止)

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

总结:原生能力的核心价值

  • ​零依赖​​:无需引入第三方库(如Lodash、Moment.js)

  • ​高性能​​:底层优化(如WebAssembly、SIMD指令)

  • ​跨平台​​:一次开发适配多端(Web/小程序/混合应用)

  • ​标准化​​:W3C规范保障兼容性(如Fetch/Service Worker)

​建议优先使用原生能力​​,仅在必要时引入框架或库。可通过Can I Use 查询浏览器兼容性。

我们使用的依赖库一般也是使用浏览器原生API进行封装的,或者在此基础上做了一些兼容/降级处理,方便我们使用。

当然进入只是列举出来了部分,浏览器其实还有很多待发现的API,可以继续发现补充....

对了在使用原生API注意哈,进行 特性检测 (Feature Detection):在调用 API 前,务必检查浏览器是否支持它,以保证代码的健壮性。

__真棒,今天又学会了一些知识。加油...