web前端性能优化方案

主要优化手段有:浏览器访问优化、使用反向代理、CDN等


浏览器访问优化

  1. 减少HTTP请求

    ​ 主要方式有脚本合并、图片合并、文件压缩、避免重定向、使用浏览器缓存、减少cookie传输

    • 脚本合并

      • 通常一个大型网站需要依赖多个JS文件。可以把多个文件合并成一个,这样只需要引用一个,只需要一次请求。使用自动化构建工具例如gulp、Grunt和 JSCompress进行自动合并。

      • (自动化构建工具可以用来自动编译、压缩、合并、单元测试)

    • 图片合并

      • 图片合并用精灵图,把多张图片合并成一张。

    • 文件压缩

      • 包括CSS、JavaScript、图片的压缩。

      • 在服务器端对文件进行压缩,在浏览器端对文件解压缩,可有效减少通信传输的数据量。 HTML、CSS、javascript文件启用GZip压缩可达到较好的效果。

    • 避免重定向

    • 使用浏览器缓存

      • CSS、javascript、logo、图标这些静态资源文件更新的频率都比较低,可以利用强缓存的方式来设定浏览器缓存,把缓存时间设置得长一些。强缓存就是利用http头中的cache-control和expires属性。

      • 更新静态资源时,采用逐量更新的方法,比如需要更新10个图标文件,不宜把10个文件一次全部更新,而是应该一个文件一个文件逐步更新,并有一定的间隔时间,避免服务器负载骤增和网络拥堵。

      • 协商缓存ETag/If-None-Match;Last-Modified/If-Moidfied-Since

    • 减少cookie传输

      • cookie包含在每次请求和响应中,太大的cookie会严重影响数据传输,因此哪些数据需要写入cookie需要慎重考虑,尽量减少cookie中传输的数据量。

  2. 懒加载

    • 首先只加载第一屏的图片,当用户滚动访问后面的内容时在加载相应图片。

    • 方法:先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次,俗称占位图),将图片的src属性值存放在一个非src的自定义属性中,判断图片进入可视区域后将路径赋值给src属性。

  3. CSS放在页面最上部,javascript放在页面最下面

    • 如果将 CSS放在其他地方比如 body中,则浏览器有可能还未下载和解析到 CSS就已经开始渲染页面了,这就导致页面由无 CSS状态跳转到 CSS状态,用户体验比较糟糕,所以可以考虑将CSS放在head中。

    • 浏览器在加载javascript后立即执行,有可能会阻塞整个页面,造成页面显示缓慢,因此javascript最好放在页面最下面。

代码优化

  1. JS代码优化

    • 减少对DOM的操作

      • 对DOM的操作代价是昂贵的,这在网页中通常是一个性能瓶颈。

      • 减少对DOM元素的查询与修改:

        • 查询:需多次访问的可以保存在变量中。

        • 修改:使用innerHTML代替DOM操作。

    • 减少重排和重绘

      • 不要一条一条地修改 DOM 的样式。与其这样,还不如预先定义好 css 的 class,然后修改 DOM 的 className,即将多次改变样式属性的操作合并成一次操作

      • 如果要对一个元素进行多次操作,先将元素设为display: none(需要1次重排和重绘),然后对这个节点进行100次操作,最后再恢复显示(需要1次重排和重绘)。这样一来,你就用两次重新渲染,取代了可能高达100次的重新渲染。

      • 脱离文档流的元素重排开销较小【如:position为absolute或fixed,float元素】,因为对文档流中元素无影响;

    • 慎用with。使用 with相当于增加了作用域链长度。查找作用域链是要消耗时间的,过长的作用域链会导致查找性能下降。

    • 慎用eval和Function。每次 eval 或 Function 构造函数作用于字符串表示的源代码时,脚本引擎都需要将源代码转换成可执行代码。这是很消耗资源的操作。通常比简单的函数调用慢 100倍以上。

    • 减少作用域链查找。如果在循环中需要访问非本作用域下的变量时请在遍历之前用局部变量缓存该变量,并在遍历结束后再重写那个变量。

  2. CSS代码优化

    • 不要用CSS通配符 *,

    • CSS选择器层叠不要超过三层

    • 关键选择器(key selector)。选择器的最右边的部分为关键选择器(即用来匹配目标元素的部分);如果规则拥有 ID 选择器作为其关键选择器,则不要为规则增加标签。过滤掉无关的规则(这样样式系统就不会浪费时间去匹配它们了);

    • 提取项目的通用公有样式,增强可复用性,按模块编写组件;增强项目的协同开发性、可维护性和可扩展性;

    • 使用预处理工具例如Less/Sass或自动化构建工具(gulp对css进行语法检查、自动补前缀、打包压缩、自动优雅降级);

CDN加速

  • CDN(content distribute network,内容分发网络)的本质仍然是一个缓存,而且将数据缓存在离用户最近的地方,使用户以最快速度获取数据。

  • (通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上,让用户可就近取得所需内容。)

反向代理

  • 传统代理服务器位于浏览器一侧,代理浏览器将http请求发送到互联网上,而反向代理服务器位于网站机房一侧,代理网站web服务器接收http请求。

  • 当用户第一次访问静态内容的时候,静态内容就被缓存在反向代理服务器上,这样当其他用户访问该静态内容的时候,就可以直接从反向代理服务器返回,加速web请求响应速度,减轻web服务器负载压力。

参考资源:

    https://www.2cto.com/kf/201604/498725.html

    https://blog.csdn.net/Vivian_jay/article/details/58308434?locationNum=11&fps=1

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页