前端项目优化之我的浅见

3,558 阅读5分钟

有感而发

做前端开发,也有些年头了。除了垒代码之外,也非常重视自己开发的项目的用户体验,经常会以纯用户的角度,去体验自己开发出来的项目。综合自己在项目开发过程中遇到的问题,尤其是合作开发的过程中遇到的情况,以及作为用户的感受,特别想写一点关于项目优化的东西,如有不合适的地方,欢迎批评指正。

8秒原则

我们都知道,互联网圈内有一条著名的 8秒原则,即用户在浏览一个网页的时候,如果等待时间超过 8秒,可能就会放弃访问,作为网站端,我们就会有用户流失。事实上,亲测,一般不会等到 8秒,超过 6秒,我就会放弃访问这个页面(也可能是我太急躁)。也就是说 6秒起,每多等待一秒,就会有一定数量的用户流失。所以,页面性能优化,显得尤为重要。

但是,目前没有相对成熟的前端代码检测工具,来帮助我们去检测我们的代码质量,这就要求我们自己从各个维度查看自己的代码,经常 review 自己的代码,鞭驽策蹇,来提高自己。本文主要是以自身实践角度,探讨一些可行的优化点:

  • 资源压缩/合并

    压缩代码,缩小文件体积,加快页面的加载速度,这些是提高页面访问体验的基本操作。现在的主流框架,像 vue 引用 webpack 工具,在生成打包文件的时候,都已经做了代码压缩合并的操作,不需要我们单独处理(react、angular 也一样)。

  • 代码尽量简洁,减少冗余代码量

    说简单点的,能一行代码解决的问题,不要绕大圈子。现在有许多公司,都会把冗余代码量,作为 KPI 考核的一个标准

  • 优化 dom 操作:

    • 尽量减少 浮动 / 定位 的使用(动画除外)

      处于文档流以内的元素或节点,加载速度更快,同时元素更加易于控制。现在有了 flex 布局以后,页面元素几乎不需要再浮动/定位去实现特殊的排版需求。元素脱离文档流,真心不好控制

    • 使用动画时,让元素脱离文档流,动画的定位,尽量多用 fixed / absout

      此时让元素脱离文档流,是为了减少触发动画时,页面频繁的 重排 / 重绘,关于页面的重排(relayout/reflow)/ 重绘(repain),请前往查阅 前端性能优化:细说浏览器渲染的重排与重绘

    • css 尽量使用 id 或者 class,避免过度层叠

      道理很简单,好比你到公司前台找人,你直接说出对方的名字,前台就可以快速的帮你找到他,非必要的情况下,不用报他是哪个部门的,哪个组,是男是女。能一步到位的,不用绕多步。给大家看一个错误示例:

      错误示例
      这是我们公司写了6、7年前端的,所谓前端大佬的写法……非常不应该,诸位引以为戒

    • 公共样式,千万不要嵌套写

      这应该是常识。公共样式,如果用嵌套写,就表示在用到某一个类名的时候,必须同时使用他的父级的类名,但是如果两个父级有样式上的冲突呢?

  • 数据交互方面,降低接口请求频次,减少无关的第三方引用

  • 降低请求量,减小引用文件体积

  • 合理运用 CDN 加速请求

  • 非核心代码,合理使用异步加载

    尤其是加载 js 文件的时候,格外突出,合理使用 async 或 defer 加载 js 文件

  • 内存资源优化

    • 及时清理无用的定时器

    • 及时关闭无用的监听

    • 及时释放无效的内存占用 - - 比如,闭包

  • 图片的处理

    图片始终是最消耗资源的,对图片的处理,是重中之重

    • 图片服务和应用服务分离(从架构的角度)

      图片服务和应用服务放在同一服务器上,应用服务很容易因为图片的高 I/O 负责崩溃,服务分离,适用于图片较多的网站,比如电商、购物网站

    • 个人处理 - 简单粗暴的图片压缩

      在不损坏质量的情况下,减小图片的体积

    • 图片转成 base 64 编码

      vue.js 其实已经帮我们做了这件事。但是要注意,图片转成 base64 编码,其实是在一定程度上增大了文件的体积,并且,vue.js 对被转码的图片是有要求的,只转10K以下的图片,超过10K,就只是静态引用。一定注意,并不是所有图片都放到 assets 文件夹内,vue就一定会对其 base64 转码

    • 合理使用 cssSprites(图片精灵)

      小图片整合到一张大图上,可以降低请求频次,不过多解释

    • 图片预加载 / 懒加载

      提高用户体验的,不用过多解释


写在最后

以上啰啰嗦嗦这么多,是我个人在项目开发中,非常注意的地方。

非核心代码的异步加载,是最近在看文章的时候,才学到的技术点,详细内容可参考 你不知道的浏览器页面渲染机制

如果有不合理的地方,欢迎大佬留言,欢迎批评指正