CDN 原理详解
CDN(Content Delivery Network,内容分发网络)是现代互联网基础设施的重要组成部分。本文将从概念到实践,全面讲解 CDN 的工作原理、关键技术及应用场景。
CDN(Content Delivery Network,内容分发网络)是现代互联网基础设施的重要组成部分。本文将从概念到实践,全面讲解 CDN 的工作原理、关键技术及应用场景。
DNS(Domain Name System,域名系统)是互联网最重要的基础设施之一,它负责将人类可读的域名转换为机器可识别的 IP 地址。本文将从基础到进阶,全面讲解 DNS 的工作原理、记录类型及安全机制。
HTTP(Hyper Text Transfer Protocol,超文本传输协议)是 Web 开发中最重要的协议之一。本文将从基础到进阶,全面讲解 HTTP 协议的核心知识点。
垃圾回收机制是由引擎来负责的。JS 引擎有很多种(各个浏览器都不同),其垃圾回收机制在一些细节及优化上也略有不同。本文以一些通用的回收算法作为切入,再由市场占有率大的 V8 引擎发展至今对该机制的优化为例。JavaScript 是门魅力无限的语言,关于它的 GC(垃圾回收)方面,你了解多少呢?想来大部分人是因为面试才去看一些面试题从而了解的垃圾回收,那在正式开始之前,给大家列几个小问题,大家可以先想一下答案,带着问题及答案再去看文章。
只是用户看到仅仅只是浏览器本身,却很少能看到浏览器最核心的部分—浏览器内核。从第一款 libwww(Library WorldWideWeb)浏览器发展至今已经经历了无数竞争与淘汰了。现在国内常见的浏览器有:IE、Firefox、QQ 浏览器、Safari、Opera、Google Chrome、百度浏览器、搜狗浏览器、猎豹浏览器、360 浏览器、UC 浏览器、遨游浏览器、世界之窗浏览器等。但目前最为主流浏览器有五大款,分别是 IE、Firefox、Google Chrome、Safari、Opera。
1 | 面试时常说的"兼容经验"涵盖三个层面: |
| 浏览器 | 内核 | 占比(中国) | 特征 |
|---|---|---|---|
| Chrome | Blink | ~65% | 标准支持最快,自动更新 |
| Safari | WebKit | ~25% | 封闭生态,iOS 强制使用,落后标准 1-2 个版本 |
| Firefox | Gecko | ~5% | 强隐私,DevTools 功能丰富 |
| Edge | Blink | ~5% | 与 Chrome 一致,但有少量差异 |
| 微信内置浏览器 | X5(Blink 变体) | 大量 | 基于 Chromium 但版本滞后,部分功能缺失 |
面试应答策略:
1 | 兼容工作不是"所有浏览器 100% 效果一致"——这不现实。 |
1 | /* 开发时 */ |
Vite 内置 Autoprefixer,Webpack 通过 postcss-loader + autoprefixer 引入。
1 | ┌─ flexbox 兼容 |
1 | /* 先写标准属性,再写降级(渐进增强) */ |
1 | ┌─ ES6+ 语法 → Babel / esbuild 编译为 ES5 |
常用 API 的支持情况(2026 年参考):
| API | Chrome | Safari | Firefox | 降级方案 |
|---|---|---|---|---|
| IntersectionObserver | ✅ 原生 | ✅ | ✅ | 回退为 scroll 事件计算 |
| ResizeObserver | ✅ | ✅ | ✅ | 回退为 window.resize |
| WebSocket | ✅ | ✅ | ✅ | 回退为轮询(极少需要) |
| CSS Typed OM | ✅ | ❌ | ❌ | 使用 element.style |
| WebGPU | ✅ 实验性 | ✅ | ❌ | 回退 WebGL |
| SharedArrayBuffer | ✅(跨域隔离) | ✅ | ✅ | 不可降级,需加响应头 |
| import maps | ✅ | ✅ 16.4+ | ✅ | 用打包工具替代 |
1 | // ✅ 正确做法:检测 API 是否存在 |
1 | ├── 开发期 |
| 差异点 | iOS(Safari WebView) | Android(Chrome WebView) |
|---|---|---|
| 内核 | WebKit(所有 iOS 浏览器强制使用) | Blink / Chromium |
| 版本更新 | 随 iOS 系统更新,用户升级慢 | Play Store 独立更新,版本较新 |
| 内存限制 | 严格(网页内存超限被杀掉) | 相对宽松 |
| 键盘弹起 | visualViewport 变化,window.innerHeight 缩小 | 部分机型 resize 事件不触发 |
| 底部安全区域 | 有(刘海屏指示条) | 有(各厂商不同) |
| Cookie 持久化 | 严格(ITP 智能防追踪) | 正常 |
| 日期输入 | 无原生 <input type="date">(需自行实现) | 原生支持 |
| 字体渲染 | 较细,-webkit-font-smoothing: antialiased | 默认正常 |
1 | /* 1. 滚动回弹效果 */ |
1 | /* 1. 部分机型 1px 边框过粗 → 用伪元素缩放 */ |
| 维度 | 移动端 | 桌面端 |
|---|---|---|
| 输入 | 触摸(点击/滑动/长按) | 鼠标 + 键盘 |
| 悬停 | 无 hover | hover 可用 |
| 屏幕尺寸 | 小(320-430px) | 大(1024px+) |
| 网络 | 移动网络(弱网/离线) | Wi-Fi/有线(稳定) |
| 性能 | 低功耗 CPU,内存有限 | 高性能 |
| 存储 | IndexedDB/localStorage | 同上但容量更大 |
1 | /* 区分触摸与鼠标 */ |
| 模式 | 代码复用率 | 性能 | 团队成本 | 代表 |
|---|---|---|---|---|
| Web 优先 + 小程序 | 60-70% | 一般 | 低 | 同一套 Vue/React 代码,小程序部分重写 |
| React Native / Weex | 80-90% | 较好 | 中 | 同一 JS 逻辑,原生渲染 |
| Flutter | 90%+ | 最好 | 高(需学 Dart) | 自渲染引擎,完全不依赖系统 WebView |
| 小程序 + H5 同构 | 70-80% | 一般 | 中 | Taro / uni-app 编译到多端 |
| 响应式 Web | 100%(仅 H5) | 依赖浏览器 | 低 | 一套代码适配不同屏幕 |
1 | // Taro 示例:一套代码编译到多端 |
跨端框架的兼容处理方式:
1 | ├── 组件映射:View → div / view / View(取决于目标端) |
1 | <script> |
| 功能 | Web 实现 | 小程序实现 |
|---|---|---|
| 页面路由 | React Router / Vue Router | 文件系统路由 |
| 网络请求 | fetch / axios | wx.request |
| 本地存储 | localStorage | wx.setStorageSync |
| 登录 | 账号密码/OAuth | wx.login + code2session |
| 支付 | 微信 H5 支付/支付宝 | wx.requestPayment |
| 分享 | 外部链接 | wx.shareAppMessage |
| 更新 | 刷新即最新 | wx.getUpdateManager |
1 | 渐进增强(Progressive Enhancement): |
1 | 遇到兼容问题: |
1 | │ 特性 │ Polyfill / 降级方案 │ |
1 | 当被问到"说一下你的兼容经验"时,按以下结构组织: |
1 | /* Safari 中 100vh 包含地址栏高度,页面底部被遮挡 */ |
1 | // CSS 特性检测 |
1 | /* 方案一:伪元素 + scale(推荐) */ |
1 | 主流方案: |
1 | Polyfill 是用 JS 模拟浏览器未实现的 API,让旧环境也能使用新特性。 |
1 | 系统性兼容方案: |
AJAX 技术使开发者能够专注于互联网中数据的传输,而不再拘泥于数据传输的载体。通过它,我们获取数据的方式变得更加灵活,可控和优雅。但 AJAX 技术并不是一把万能钥匙,互联网中的数据隐私和数据安全(例如银行账号和密码)非常重要,为了保护用户数据的隐私与安全,浏览器使用同源策略限制了 AJAX 技术获取数据的范围和能力。但有时我们不得不想办法绕过同源策略,实现跨域请求资源。因此跨域技术一直成为开发者们经久不衰的讨论话题。