输入URL后发生了什么

输入URL到渲染页面

【进程之间使用 IPC 通信】

flowchart subgraph 浏览器进程 A[用户输入] --> B[处理输入信息] B[判断是合法域名
而非搜索关键字] --> C[开始导航] end %% ========== 跨进程标注 ========== style C stroke:#f66,stroke-width:2px
flowchart subgraph 网络进程 D[查找本地缓存] D -->|无缓存| E[进入请求流程] E --> F[DNS解析] F --> |得到IP和port| G[等待 TCP 队列] G --> |同域名限6个tcp连接| H[建立TCP连接] end %% ========== 跨进程标注 ========== style H stroke:#f66,stroke-width:2px
  • 提交文档
  • 更新前进、后退状态
  • 更新地址栏
  • 更新web页面
flowchart subgraph 渲染器进程 J[渲染阶段] J --> K[构建DOM树] K --> L[构建CSSOM树] L --> M[布局] M --> N[绘制] N --> O[合成] O --> P[展示页面] end

为什么第二次打开网页会变快?

因为存在各类缓存

  • 网站资源缓存,直接通过【强缓存】或者【协商缓存】获取
  • DNS缓存,下一次获取 IP + port,更快
  • 如果用户存在登录信息 cookie,下一次也不需要登录了

什么是重排(回流)、重绘?

Reflow/Repaint.

重排:浏览器计算元素的【几何属性】(位置、宽高)。影响范围大。整个渲染树

重绘:浏览器计算元素的【视觉属性】(颜色、背景)。不影响布局

offsetHeight 之类的获取,也会触发重排。

优化原则

  • 减少范围:尽量只修改【脱离文档流】的元素
  • 减少次数:使用 classList批量修改样式
  • 跳过阶段:用transform``opacity之类的属性,避开 【重排】【重绘】 ,直接【合成】

【与上面重复的,但是不同的知识分类方式

css的角度:

  • 使用 transform 和 opacity。
  • 使用 classList

js技巧:

  • 批量操作 dom 元素,使用 fragment
ini 复制代码
// ❌ 糟糕(多次重排)
for (let i = 0; i < 100; i++) {
  document.body.appendChild(document.createElement('div'));
}

// ✅ 优化(1次重排)
const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {
  fragment.appendChild(document.createElement('div'));
}
document.body.appendChild(fragment);
  • 读写分离
ini 复制代码
// ❌ 糟糕(强制同步布局)
for (let i = 0; i < items.length; i++) {
  items[i].style.width = box.offsetWidth + 'px'; // 读 → 写 → 读 → 写...
}

// ✅ 优化(先读后写)
const width = box.offsetWidth; // 集中读取
for (let i = 0; i < items.length; i++) {
  items[i].style.width = width + 'px'; // 集中写入
}
  • 使用 requestAnimation 动画
scss 复制代码
function animate() {
  element.style.transform = `translateX(${pos++}px)`;
  requestAnimationFrame(animate); // 与浏览器刷新率同步
}

浏览器发起HTTP请求的过程

1.构建请求行 GET index.html HTTP1.1

2.查找缓存

3.准备 IP 和 端口------DNS查询

4.等待 TCP 队列,同一个域名下只能有 6 个

5.建立 TCP 连接

6.发送请求

【服务端】

1.返回响应,返回响应码 200、304、400、403、404、502 之类的

2.断开 TCP 连接, 除非设置了 Keep-Alive

其他:TCP通信图

应用层、传输层、会话层、网络层、数据链路层、物理层

其实就是一个,封装包数据 => 拆解包数据 的过程。

其他:关于重定向 302

nginx 配置,通常在废弃旧网址的时候使用。

ruby 复制代码
server {
 listen 80;
 server_name example.com;
 return 301 $scheme://www.example.com$request_uri;
}

其他:plantuml版本流程图

相关推荐
阿珊和她的猫4 小时前
v-scale-scree: 根据屏幕尺寸缩放内容
开发语言·前端·javascript
加班是不可能的,除非双倍日工资8 小时前
css预编译器实现星空背景图
前端·css·vue3
wyiyiyi9 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
gnip9 小时前
vite和webpack打包结构控制
前端·javascript
excel10 小时前
在二维 Canvas 中模拟三角形绕 X、Y 轴旋转
前端
阿华的代码王国10 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
一条上岸小咸鱼10 小时前
Kotlin 基本数据类型(三):Booleans、Characters
android·前端·kotlin
Jimmy10 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
ZXT10 小时前
promise & async await总结
前端
Jerry说前后端10 小时前
RecyclerView 性能优化:从原理到实践的深度优化方案
android·前端·性能优化