zoukankan      html  css  js  c++  java
  • 前端优化之JS的开销与如何缩短解析时间

    相同大小的JS代码和一个图片文件的加载,JS文件是比图片的加载要慢很多的。因为JS代码有一个编译和解析的过程。图片的解码与绘制是很快的。

    js的加载过程可能会造成阻塞,此时即使用户看到了页面,但是却无法进行交互。

    1.如何从代码层面上进行优化:

    • 外部第三方的JS文件:
      • Code splitting 代码拆分,按需加载
      • Tree shaking 代码减重 (摇树,摇掉枯萎的叶子)
    • 减少主线程工作量:
      • 避免长任务
      • 避免超过1KB的行间脚本
      • 使用rAF和rIC进行时间调度

    如:当两个不同类型的数据进行运算时,浏览器会有一个优化的过程,会增加时间

    V8的优化机制:

    • 脚本流
    • 字节码缓存
    • 懒解析

    2.函数优化

    V8这样的JS引擎,默认对函数进行懒解析(lazy parsing):只有当这个函数真正被调用的时候,才会去解析函数体。这样的解析方式会对性能有很好的提升。但是实际开发中有的情况需要JS立即去执行,此时如果是懒解析的函数但是发现需要立即执行,于是又快速的进行了一个饥饿解析(eager parsing),这样的话会先进行了一次饥饿解析,然后又进行了一次懒解析,执行效率反而降低了。

    那么如何告诉解析器某个函数需要立即解析:

    只需加一对括号:

    const add = ((a,b) => a+b)    // 这样的作用是告诉解析器,当看到这个函数的时候就对这个函数进行解析
    const n1 = 1
    const n2 = 2
    add(n1,n2)

     这样当后面需要调用的时候就可以直接调用了

    有个问题:

    • 当把代码进行压缩时(uglyfy),可能会把这对括号去掉
    • 解决:Optimize.js。可以在压缩以后把括号加回来
      • uglyfy后来把这些问题也解决了,需要兼顾老版本的可以添加

    3.对象优化

    js是一个弱类型的语言,在声明的时候不会声明这个变量的类型。但是对于编辑器而言,还是需要一个具体的类型。如何做:在解析的时候会给这个变量赋一个具体的类型(21种隐藏类型)

    对象优化可以做的事:

    • 以相同顺序初始化对象成员,避免隐藏类的调整
    • 实例化后避免添加新属性
    • 尽量使用Array代替array-like对象(如argument)
    • 避免读取超过数组的长度
      • 会造成沿原型链的查找,会增加开销(据统计会相差六倍)
    • 避免元素类型转换,如[1,2,3]push了一个1.2的元素,数组默认的类型会被更改
      • 即类型给的越具体,编译器能做的优化越多
      • 越通用,能做的优化越少

    4.HTML的优化

    HTML的大小占比较小,但是也能做:

    • 减少iframes的使用。iframes会阻塞父文档的加载。要用的话可以使用延迟加载
    • 压缩空白符
    • 避免节点深层级嵌套
    • 避免使用table布局
    • 删除注释
    • CSS&JS尽量外链
    • 删除元素默认属性

    借助工具:

    • html-minifier
    • ...

    5.CSS的优化

    • 降低CSS对渲染的阻塞  
      • 对目前用不到的CSS,可以延迟加载
    • 利用GPU进行完成动画
    • 使用contain属性
    • 使用font-display属性

    6.资源的压缩与合并

    (1)为什么要压缩&合并

    • 减少http请求数量
    • 减少请求资源的大小

    (2)HTML压缩:

    • 使用在线工具进行压缩
    • 使用html-minifier等npm工具

    (3)CSS压缩

    (4)JS压缩

    • 在线JS压缩
    • 使用webpack在构建时压缩

    7.图片资源优化

    (1)图片优化的方案

     (2)图片格式的比较

    1. jpg:有损的压缩,压缩比高且色彩还能保持的很好。web常用
      1. 压缩工具imagemin,可以对jpg图片进行进一步的压缩
      2. 缺点:压缩比较高,可能有锯齿和边缘(logo一般不用)
    2. png:
      1. 优点:
        1. 可以做透明背景的图片
        2. 对jpg的一些缺点进行弥补
      2. 体积较jpg大
      3. 常用来做小的图标
      4. 压缩png:imagequant
    3. webp:
      1. 有很多webp转换工具
      2. 问题:可能有兼容性问题
    4. 说明:普通网站上面三种都差别不大,主要体现在大小的区别

    (3)图片加载优化

    ① 图片的懒加载

    1. 原生的懒加载方案  
      1. <img loading=“lazy” src="xxx.jpg">
        问题:
        1. 自定义和可扩展性不是特别好
        2. 需要浏览器支持
    2. 第三方图片懒加载方案
      1. verlok/lazyload
      2. yall.js
      3. Blazy

    未完。。

    8.字体的优化

    (1)字体的问题:

    字体未下载完成时 ,浏览器隐藏或者自动降级

  • 相关阅读:
    ServletContext的应用
    behavior planning——11 create a cost function speed penalty
    behavior planning——10 behaior planning pseudocode
    behavior planning——inputs to transition functions
    卡尔曼滤波——20.卡尔曼预测
    卡尔曼滤波——19.卡尔曼滤波器代码
    卡尔曼滤波——18.预测函数
    卡尔曼滤波——17.高斯移动
    卡尔曼滤波——16.新的均值和方差
    卡尔曼滤波——14.—15分离的高斯分布
  • 原文地址:https://www.cnblogs.com/codexlx/p/13993878.html
Copyright © 2011-2022 走看看