美文网首页
url输入之后发生了什么以及优化点

url输入之后发生了什么以及优化点

作者: 青色琉璃 | 来源:发表于2020-07-26 02:49 被阅读0次

    \color{red}{问题:}

    • 已经建立连接了,但是服务器崩溃了,怎么办?
    • HSTS
    • 缓存校验
    • DNS解析(20ms到120ms)

    \color{red}{url输入之后流程:}

    1.png

    一,url解析以及缓存

    二,DNS解析

    2.png

    1,首先本地解析,没有的话再去别的地方找(递归过程--深度搜索)


    3.png

    2,去DNS服务器上找(迭代过程--广度搜索),2,3,4,5,6,7步骤,最后到权威域名服务器找,20-120ms
    优化点:
    1,减少DNS请求次数,尽量不用请求太多不同服务器资源。但是为了做负载均衡,服务器分离部署,需要尽量多的请求不同服务器资源,所以这个很难做到。
    2,DNS预解析,这个是异步处理,节省时间,针对的是页面的图片等资源
    <link rel="dns-prefetch" href="//g.alicdn.com">

    三,减少HTTP请求和请求资源大小

    优化点:
    1,资源合并压缩
    2,字体图标
    3,base64(小图片)
    4,GZIP
    5,图片懒加载(骨架屏技术)
    6,数据延迟分批加载(第一次只加载首页)
    7,CDN资源(地域式分布,请求离自己最近的服务器)
    8,雪碧图(基本淘汰)

    四,发送http请求之后应用缓存(把内容缓存起来,他不香吗)

    4.png

    缓存位置:

    1,Service Worker:浏览器独立线程进行缓存(基本不用)
    2,Memory Cache:内存缓存(小而快,浏览器操作)
    3,Disk Cache:硬盘缓存(大而慢,浏览器操作)
    4,Push Cache:推送缓存(HTTP2中,基本不用)

    缓存流程:

    • 初次加载url:查找disk cache,有的话直接拿,没有的话从服务器请求,服务器返回缓存规则
    • 刷新页面(f5):memory cache,然后再disk cache
    • 强制刷新(ctrl+f5):浏览器不使用缓存,发送的头部带有cache-control:no-cache(为了兼容,也会有pragma:no-cache),服务器直接返回200和最新内容

    4.1,强缓存(Expires/Cache-Control)

    浏览器对于强缓存的处理:根据第一次请求资源时服务器返回的相应头来确定


    5.png

    缓存规则:

    • Expries:缓存过期时间,用来指定资源到期时间(http1,过时了,现在用http1.1)
    • Cache-Control: Cache-Control:max-age=2592000,也就是30天,再次发请求,读取缓存中的信息(http1.1),具体是在memory cache中还是disk cache中读取,由浏览器规定
      规则(两者同时写时,Cache-Control优先级更高):


      6.png

      问题:服务器在30天内更新资源,客户端无法同步更新。
      解决:webpack打包之后,文件名会添加hash值,当成新的资源请求服务器(也就是没有缓存)

    4.2,协商缓存

    强缓存失效(过期)后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程。
    资源未更新,返回304过程:


    7.png

    资源更新,返回200的过程:


    8.png

    Last-Modified和If-Modified-Since:

    • 初次访问,服务器返回资源,响应头中设置了Last-Modified(上次修改时间),缓存文件和响应头
    • 再次访问,浏览器检测到有Last-Modified,于是设置If-Modified-Since=Last-Modified,并将If-Modified-Since添加到请求头。
    • 服务器收到请求,将If-Modified-Since与服务器的Last-Modified相同,则返回304和空的响应体,浏览器直接从缓存中读取;如果If-Modified-Since小于服务器的Last-Modified,则说明服务器资源有更新,则返回新的资源文件和200.
      注意:Last-Modified是秒级,如果在不可感知的时间内修改文件,则服务器会以为没有修改

    ETag和If-None-Match:

    服务器资源改变时,ETag就会改变,用法和上面一样

    七,浏览器渲染

    构建DOM树,CSS树,Render树

    7.1,DOM树

    初始字节码-通过utf-8转换:Bytes:3c 62 6f ......


    9.png

    (1)转换 字符集

    Characters:<html><head></head><body><p></p></body></html>


    10.png

    (2)令牌

    Tokens: StartTag:html StartTag:head EndTag:head StartTag:body EndTag:body ...


    11.png

    (3)词法分析

    Nodes:html body p span ...


    12.png

    (4)DOM构建

    13.png

    优化点:
    1,标签语义化
    2,避免多级嵌套(尽量4级以下)

    7.2,CSSDOM树,link,@import

    流程和DOM一样


    14.png

    优化点:
    (1)css选择器是从右到左,比如 .div a 是先找所有的a,然后再找.div,因此选择器层级不要太多

    7.3,RENDER树

    15.png

    计算在视口的位置和大小,也就是回流(因元素位置,大小变化导致的重新布局)
    根据渲染树和回流得到的几何信息,进行绘制(宽高,大小,颜色)
    重绘不一定会流,但是会流一定重绘

    优化点:
    1,减少操作dom(react之类框架很少需要):
    (1)动画效果放在absolute上面
    (2)css3硬件加速(GPU加速),但是可能消耗过多性能,占用内存,导致字体模糊等
    (3)牺牲平滑度换取速度,也就是动画时不以1px为基准,而以3px以上,看上去略有不流畅,但可以减少因cpu打满而产生的卡顿
    (4)读写分离
    2,link是发送http请求,每个http请求都是单独线程处理,chorme可以允许6-7个http请求
    (1)@import是同步的,会导致阻塞,因此要减少使用
    (2)问:react项目中使用@import,打包之后是什么情况?
    优化点:
    1,style不需要发请求,速度比link快,如果内容不多的话
    2,减少@import
    3,link写在头部,和html并发请求

    7.4,JS加载

    优化点
    1,js也是阻塞的,需要放到底部


    16.png

    蓝色加载,红色渲染
    async是谁先加载完成,谁先渲染,不分先后顺序,不依赖其他js文件,不产生冲突的common.js可以使用。(淘宝基本都用的async,和我想的有点不一样...)
    defer会有设置依赖,有顺序,一般使用defer。(webpack打包也可以加上)

    参考资源:去b站看了下,视频凉了

    相关文章

      网友评论

          本文标题:url输入之后发生了什么以及优化点

          本文链接:https://www.haomeiwen.com/subject/zvvblktx.html