前端随着node等JavaScript运行时平台的出现,逐渐向工程化方向发展。项目开发也越来越规范化,但是随着项目的体积越来越大,依赖库越来越多,项目的运行,热更新和打包发布也是越来越慢,甚至卡顿。这个时候就需要对项目进行“瘦身”(性能优化)了。本文就围绕着如何给前端项目进行性能优化等技术点一一展开讨论
为什么要进行项目性能优化,其实这个问题我在前言中已经简单阐述过了。优化的目的是为了改善用户的使用体验,提高用户的留存率,你的产品页面和功能的响应的速度越快,交互更加的人性化,对用户更加的友好,那自然而然的就会收到用户的青睐啦。所以对项目的优化不仅仅是要从技术思维去作为出发点,同时也要从产品思维出发站在用户的角度(也就是一个使用者的角度)作为出发点。这样的优化才是有效优化,否则就是东施效颦了,乱搞一通,随大流。。。
这里声明一下,本文只阐述web项目的性能优化。其他平台的项目是否适用,自行斟酌!
在对web项目优化之前先了解一下web的性能指标,这里引用MDN中的一段描述。
Web 性能是客观的衡量标准,是用户对加载时间和运行时的直观体验。Web 性能指页面加载到可交互和可响应所消耗的时间,以及页面在交互时的流畅度——滚动是否顺滑?按钮能否点击?弹窗能否快速打开,动画是否平滑?Web 性能既包括客观的度量如加载时间,每秒帧数和到页面可交互的时间;也包括用户的对页面内容加载时间的主观感觉。
页面响应时间越长,越多的用户就会放弃该网站。重要的是,通过使体验尽可能早地变得可用和交互,同时异步地加载长尾体验部分,来最大程度地减少加载和响应时间,并添加其他功能以降低延迟。
RAIL 是 Response、Animation、Idle 和 Load 的首字母缩写,是一种由 Google Chrome 团队于 2015 年提出的性能模型,用于提升浏览器内的用户体验和性能。
所以综上所述,所以我们优化的项主要是集中在:
这四个大的方向
当然除了这四个方向以为我觉得还可以有其他的途径去进一步的优化,当然了,这肯定也是要看应用场景的,根据业务的需要去具体问题具体分析的,不能够为了优化而去优化。
也可以换个说法:
举个栗子,从资源请求数量+代码执行效率两个角度来考虑,可以从DMO结构,JS脚本,webpack打包,服务端优化,ssr,框架(Vue,React)的优化等等
怎么做?当然是从四个大的方向先入手啦,然后在根据你的业务和场景,再细分。
优化方案:
Chrome限制每个域名最多执行6个TCP连接。如果您一次请求十二个资源,前6个将开始,后6个将排队。一旦其中一个请求完成,队列中的第一个请求项目将开始其请求过程。
浏览器发起一个http请求的过程
前端前端实现动画有三种主流的方式:csss,canvas,dom,他们在浏览器中的渲染方式有所不同,所以优化的时候也要注意区分
进行CSS的动画优化必须了解一定的浏览器的几个概念,图层、重绘、回流。
CSS虽然更加简单也更加保证性能的下限,但是要想实现更加复杂可控的动画,那就必须用到Canvas+JavaScript这个组合了.
Canvas作为浏览器提供的2D图形绘制API本身有一定的复杂度,优化的方法非常多,我们仅仅介绍几种比较主流的优化方式.
优化方案:
优化方案:
下面是一些关于前端框架项目的一些优化方法
{
path: '/',
name: 'home',
component: () => import(/* webpackChunkName: "home" */ './views/home/index.vue'),
meta: { isShowHead: true }
}
Vue 会通过 Object.defineProperty 对数据进行劫持,来实现视图响应数据的变化,然而有些时候我们的组件就是纯粹的数据展示,不会有任何改变,我们就不需要 Vue 来劫持我们的数据,在大量数据展示的情况下,这能够很明显的减少组件初始化的时间,那如何禁止 Vue 劫持我们的数据呢?可以通过 Object.freeze 方法来冻结一个对象,一旦被冻结的对象就再也不能被修改了。
Tips:这里只是冻结了 users的值,引用不会被冻结,当我们需要 reactive 数据的时候,我们可以重新给 users 赋值。
export default {
data: () => ({
users: {}
}),
async created() {
const users = await axios.get("/api/users");
this.users = Object.freeze(users);
},
methods:{
// 改变值不会触发视图响应
this.data.users[0] = newValue
// 改变引用依然会触发视图响应
this.data.users = newArray
}
};
Vue 组件销毁时,会自动清理它与其它实例的连接,解绑它的全部指令及事件监听器,但是仅限于组件本身的事件。如果在 js 内
created() {
addEventListener('click', this.click, false)
},
beforeDestroy() {
removeEventListener('click', this.click, false)
}
除了以上的一些优化方法,还有从其他维度的优化方向也可以对项目进行性能上的一些优化
服务端渲染是指 Vue 在客户端将标签渲染成的整个 html 片段的工作在服务端完成,服务端形成的 html 片段直接返回给客户端这个过程就叫做服务端渲染。
gzip 是 GNUzip 的缩写,最早用于 UNIX 系统的文件压缩。HTTP 协议上的 gzip 编码是一种用来改进 web 应用程序性能的技术,web 服务器和客户端(浏览器)必须共同支持 gzip。目前主流的浏览器,Chrome,firefox,IE等都支持该协议。常见的服务器如 Apache,Nginx,IIS 同样支持,gzip 压缩效率非常高,通常可以达到 70% 的压缩率,也就是说,如果你的网页有 30K,压缩之后就变成了 9K 左右。
为了提高用户加载页面的速度,对静态资源进行缓存是非常必要的,根据是否需要重新向服务器发起请求来分类,将 HTTP 缓存规则分为两大类(强制缓存,对比缓存),如果对缓存机制还不是了解很清楚的,可以参考作者写的关于 HTTP 缓存的文章《深入理解HTTP缓存机制及原理》。
浏览器从服务器上下载 CSS、js 和图片等文件时都要和服务器连接,而大部分服务器的带宽有限,如果超过限制,网页就半天反应不过来。而 CDN 可以通过不同的域名来加载文件,从而使下载文件的并发连接数大大增加,且CDN 具有更好的可用性,更低的网络延迟和丢包率 。
以上总结了那么多的方法 当然肯定还有许多其他方向的优化啦,本人技术有限,肯定不能够阐述完全,性能优化是个大话题,有不同意见的小伙伴可以评论区讨论一下