跳到主要内容

1.运行环境和性能优化

运行环境​

image-20210208163724618

2.网页加载过程

1.题目和知识点:​

题目:​

  • 从输入 url 到渲染出页面的整个过程
  • window.onload 和 DOMContentLoaded 的区别

知识点:​

  • 加载资源的形式
  • 加载资源的过程
  • 渲染页面的过程

2.加载资源的形式​

  • html 代码
  • 媒体文件
  • js 和 css

3.加载过程​

  • DNS 解析【本地 都可以自己解析】:域名 -> IP 地址
  • 浏览器根据 IP 地址 向服务器 发起 http 请求
  • 服务器 处理 http 请求,并返回给 浏览器

4.渲染过程 -1​

  • 根据 HTML 代码生成一个 DOM Tree
  • 根据 CSS 代码 生成 CSSOM
  • 将  DOM Tree 和 CSSOM 整合形成一个 Render Tree

5.渲染过程 -2​

  • 根据 Render Tree 渲染界面
  • 遇到 <script>则暂停渲染,优先加载并执行 js 代码 ,【因为 script 可能存在更改 dom 的情况】完成以后在继续
  • 直至把 Render Tree 渲染完成

渲染场景 1:​

image-20210208165704408

  1. 先把 css 加载完,因为在 head 里面,加载完以后生成 CSSOM【CSS Object Model】
  2. 然后根据 HTML 结构,开始渲染 DOM 树。
  3. 最后 两个整合成 Render Tree

6.为什么把 CSS 放在 头部​

反过来想,如果把 css 放在底部,浏览器会从头开始渲染,使用浏览器的默认样式进行渲染,当 加载到 link 标签的时候,需要对已经渲染的样式 进行应用 css,可能会重新渲染,如果性能过低 会发现肉眼可见的变化。

7.渲染场景含有 js 的 渲染过程​

image-20210208170144976

  1. 拿到 HTML 以后 根据 内容渲染出 DOM Tree ,遇到了 script 标签,暂停渲染,
  2. 加载 js 时候 发现改变了 container 的 属性,js 代码执行完成以后 ,才继续渲染 p 标签
  3. 为什么要暂停渲染,是因为浏览器不知道 js 中是否会更改 DOM 元素,如果不暂停渲染,浏览器不知道 以 HTML 标签为准还是以 js 更改的结果为准。

8.为什么把 js 放在最后​

先把可以渲染出来的 DOM 进行展示,然后最后在进行更改

image-20210208165359770

9.含有 图片的渲染过程​

image-20210208170741556

  1. 含有 img 标签的渲染,如果图片资源比较大,会先把这个地方空着。
  2. 因为 图片不会改变其他元素,可以先渲染其他的元素,不会阻塞渲染过程

10.window.onload 和 DOMContentLoaded 的区别​

  • window.onload 是页面级别的 当页面的所有的资源加载完成以后,才会执行
  • DOMContentLoaded 是 DOM 级别的,此时 DOM 渲染已经完成了,但是 图片和视频可能还没有加载完毕

image-20210208171131071

11.解答​

1.从输入 url 到显示出页面的整个过程​

  • 下载资源:各个资源类型,下载过程
  • 渲染页面:结合 HTML css JavaScript 图片等渲染出界面

2.window.onload 和 DOMContentLoaded 的区别​

  • window.onload 资源全部加载完才能执行 包括图片
  • DOMContentLoaded DOM 渲染完成即可,图片可能尚未加载完毕

3.性能优化

1.性能优化的原则​

  • 多使用内存、缓存 或其他方法
  • 减少 CPU 的计算量,减少网络加载耗时
  • (适用于所有编程的性能优化——空间换时间)

2.从何入手​

  • 让加载更快
  • 让渲染更快

3.让加载更快​

  • 减少资源体积,压缩代码
  • 减少访问次数:合并代码,SSR 服务端渲染,缓存。
  • 使用更快的网络:CDN

4.让渲染更快​

  • CSS 放在 head ,JS 放在 body 的最下面
  • 尽早开始执行 JS,用 DOMContentLoaded 触发
  • 懒加载(图片懒加载,上滑加载更多)
  • 对 DOM 查询进行缓存
  • 频繁操作 DOM 时候,合并到一次插入 DOM 结构
  • 节流 throttle 防抖 debounce

5.资源合并​

image-20210208173402694

6.缓存​

image-20210208173423460

  • 静态资源加 hash 后缀,根据文件内容 计算 hash
  • 文件内容不变,则 hash 不变,则 url 不变
  • url 和文件都不变,则会自动触发 http 缓存机制,返回 304。

7.CDN​

image-20210208173731294

8.SSR​

  • 服务端渲染【SSR】:将网页和数据一起加载,一起渲染
  • 非 SSR【前后端分离】:先加载网页,然后加载数据,在渲染数据
  • 早先的 JSP 和 django 的模板引擎,使用的就是 SSR。

9.图片懒加载​

image-20210208174048344

  • 真实的地址放在 另外一个属性中
  • 然后判断 该 DOM 元素是不是 露出屏幕
  • 然后再进行渲染真正的数据

10.缓存 DOM 操作 【NICE】​

image-20210208174206320

11.多个 DOM 批量插入 DOM 结构​

image-20210208174258548

  • 先搞一个空标签,将待插入的数据放在其中
  • 然后把这个空标签一次插入即可

12.尽快开始 JS 执行​

image-20210208174429658