百度360必应搜狗淘宝本站头条
当前位置:网站首页 > SEO教程 > 正文

页面性能优化办法有哪些?| 技术头条

gaoyangw 2024-10-04 16:52 10 浏览 0 评论



作者 | 浪里行舟

责编 | 郭芮

互联网有一项著名的8秒原则。用户在访问Web网页时,如果时间超过8秒就会感到不耐烦,如果加载需要太长时间,他们就会放弃访问。大部分用户希望网页能在2秒之内就完成加载。事实上,加载时间每多1秒,你就会流失7%的用户。8秒并不是准确的8秒钟,只是向网站开发者表明了加载时间的重要性。那我们如何优化页面性能,提高页面加载速度呢?

这是本文主要要探讨的问题,然而性能优化是个综合性问题,没有标准答案,想要面面俱到罗列出来,并非易事。本文只关注一些核心要点,以下是我总结性能优化常见的办法。



资源压缩与合并

主要包括这些方面:html压缩、css 压缩、js的压缩和混乱和文件合并

资源压缩可以从文件中去掉多余的字符,比如回车、空格。你在编辑器中写代码的时候,会使用缩进和注释,这些方法无疑会让你的代码简洁而且易读,但它们也会在文档中添加多余的字节。

1.html压缩

html代码压缩就是压缩这些在文本文件中有意义,但是在HTML中不显示的字符,包括空格,制表符,换行符等,还有一些其他意义的字符,如HTML注释也可以被压缩。

如何进行html压缩:

  • 使用在线网站进行压缩(开发过程中一般不用);
  • nodejs 提供了html-minifier工具;
  • 后端模板引擎渲染压缩。

2.css代码压缩

css代码压缩简单来说就是无效代码删除和css语义合并。

如何进行css压缩:

  • 使用在线网站进行压缩(开发过程中一般不用);
  • 使用html-minifier工具;
  • 使用clean-css对css压缩。




3.js的压缩和混乱

js的压缩和混乱主要包括以下这几部分:

  • 无效字符的删除;
  • 剔除注释;
  • 代码语义的缩减和优化;
  • 代码保护(代码逻辑变得混乱,降低代码的可读性,这点很重要)。

如何进行js的压缩和混乱:

  • 使用在线网站进行压缩(开发过程中一般不用);
  • 使用html-minifier工具;
  • 使用uglifyjs2对js进行压缩。

其实css压缩与js的压缩和混乱比html压缩收益要大得多,同时css代码和js代码比html代码多得多,通过css压缩和js压缩带来流量的减少,会非常明显。所以对大公司来说,html压缩可有可无,但css压缩与js的压缩和混乱必须要有!

4.文件合并



从上图可以看出不合并请求有以下缺点:

  • 文件与文件之间有插入的上行请求,增加了N-1个网络延迟;
  • 受丢包问题影响更严重;
  • keep-alive方式可能会出现状况,经过代理服务器时可能会被断开,也就是说不能一直保持keep-alive的状态。

压缩合并css和js可以减少网站http请求的次数,但合并文件可能会带来问题:首屏渲染和缓存失效问题

那该如何处理这问题呢?——公共库合并和不同页面的合并。

如何进行文件合并:

  • 使用在线网站进行文件合并;
  • 使用nodejs实现文件合并(gulp、fis3)。




非核心代码异步加载异步加载的方式

1、异步加载的方式

异步加载的三种方式——async和defer、动态脚本创建。

① async方式

  • async属性是HTML5新增属性,需要Chrome、FireFox、IE9+浏览器支持;
  • async属性规定一旦脚本可用,则会异步执行;
  • async属性仅适用于外部脚本;
  • 如果是多个脚本,该方法不能保证脚本按顺序执行。


<script
 
type
=
"text/javascript"
 
src
=
"xxx.js"
 
async
=
"async"
></script>

② defer方式

  • 兼容所有浏览器;
  • defer属性规定是否对脚本执行进行延迟,直到页面加载为止;
  • 如果是多个脚本,该方法可以确保所有设置了defer属性的脚本按顺序执行;
  • 如果脚本不会改变文档的内容,可将defer属性加入到script标签中,以便加快处理文档的速度。

③动态创建script标签

在还没定义defer和async前,异步加载的方式是动态创建script,通过window.onload方法确保页面加载完毕再将script标签插入到DOM中。

具体代码如下:

function
 addScriptTag(src){ 
 
var
 script = document.createElement(
'script'
); 
 script.setAttribute(
"type"
,
"text/javascript"
); 
 script.src = src; 
 document.body.appendChild(script); 
} 
window.onload = 
function
(){ 
 addScriptTag(
"js/index.js"
); 
} 

2、异步加载的区别

1)defer是在HTML解析完之后才会执行,如果是多个,按照加载的顺序依次执行;

2)async是在加载完之后立即执行,如果是多个,执行顺序和加载顺序无关;



其中蓝色线代表网络读取,红色线代表执行时间,这俩都是针对脚本的;绿色线代表 HTML 解析。



利用浏览器缓存

对于web应用来说,缓存是提升页面性能同时减少服务器压力的利器。

浏览器缓存类型

1.强缓存:不会向服务器发送请求,直接从缓存中读取资源,在chrome控制台的network选项中可以看到该请求返回200的状态码,并且size显示from disk cache或from memory cache;

相关的header:

Expires :response header里的过期时间,浏览器再次加载资源时,如果在这个过期时间内,则命中强缓存。它的值为一个绝对时间的GMT格式的时间字符串, 比如Expires:Thu,21 Jan 2018 23:39:02 GMT

Cache-Control :这是一个相对时间,在配置缓存的时候,以秒为单位,用数值表示。当值设为max-age=300时,则代表在这个请求正确返回时间(浏览器也会记录下来)的5分钟内再次加载资源,就会命中强缓存。比如Cache-Control:max-age=300,

简单概括:其实这两者差别不大,区别就在于 Expires 是http1.0的产物,Cache-Control是http1.1的产物,两者同时存在的话,Cache-Control优先级高于Expires;在某些不支持HTTP1.1的环境下,Expires就会发挥用处。所以Expires其实是过时的产物,现阶段它的存在只是一种兼容性的写法。强缓存判断是否缓存的依据来自于是否超出某个时间或者某个时间段,而不关心服务器端文件是否已经更新,这可能会导致加载文件不是服务器端最新的内容,那我们如何获知服务器端内容较客户端是否已经发生了更新呢?此时我们需要协商缓存策略。

2.协商缓存:向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源;另外协商缓存需要与cache-control共同使用。

相关的header:

①Last-Modified和If-Modified-Since:当第一次请求资源时,服务器将资源传递给客户端时,会将资源最后更改的时间以“Last-Modified: GMT”的形式加在实体首部上一起返回给客户端。

Last
-
Modified
: 
Fri
, 
22
 
Jul
 
2016
 
01
:
47
:
00
 GMT

客户端会为资源标记上该信息,下次再次请求时,会把该信息附带在请求报文中一并带给服务器去做检查,若传递的时间值与服务器上该资源最终修改时间是一致的,则说明该资源没有被修改过,直接返回304状态码,内容为空,这样就节省了传输数据量 。如果两个时间不一致,则服务器会发回该资源并返回200状态码,和第一次请求时类似。

这样保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。一个304响应比一个静态资源通常小得多,这样就节省了网络带宽。



但last-modified 存在一些缺点:

Ⅰ.某些服务端不能获取精确的修改时间;

Ⅱ.文件修改时间改了,但文件内容却没有变;

既然根据文件修改时间来决定是否缓存尚有不足,能否可以直接根据文件内容是否修改来决定缓存策略?——ETag和If-None-Match

②ETag和If-None-Match:Etag是上一次加载资源时,服务器返回的response header,是对该资源的一种唯一标识,只要资源有变化,Etag就会重新生成。浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到request header里的If-None-Match里,服务器只需要比较客户端传来的If-None-Match跟自己服务器上该资源的ETag是否一致,就能很好地判断资源相对客户端而言是否被修改过了。

如果服务器发现ETag匹配不上,那么直接以常规GET 200回包形式将新的资源(当然也包括了新的ETag)发给客户端;如果ETag是一致的,则直接返回304知会客户端直接使用本地缓存即可。



两者之间对比首先在精确度上,Etag要优于Last-Modified。Last-Modified的时间单位是秒,如果某个文件在1秒内改变了多次,那么他们的Last-Modified其实并没有体现出来修改,但是Etag每次都会改变确保了精度;如果是负载均衡的服务器,各个服务器生成的Last-Modified也有可能不一致。第二在性能上,Etag要逊于Last-Modified,毕竟Last-Modified只需要记录时间,而Etag需要服务器通过算法来计算出一个hash值。第三在优先级上,服务器校验优先考虑Etag

缓存的机制

强制缓存优先于协商缓存进行,若强制缓存(Expires和Cache-Control)生效则直接使用缓存,若不生效则进行协商缓存(Last-Modified / If-Modified-Since和Etag / If-None-Match),协商缓存由服务器决定是否使用缓存,若协商缓存失效,那么代表该请求的缓存失效,重新获取请求结果,再存入浏览器缓存中;生效则返回304,继续使用缓存

主要过程如下:



用户行为对浏览器缓存的影响

  • 地址栏访问,链接跳转是正常用户行为,将会触发浏览器缓存机制;
  • F5刷新,浏览器会设置max-age=0,跳过强缓存判断,会进行协商缓存判断;
  • ctrl+F5刷新,跳过强缓存和协商缓存,直接从服务器拉取资源。




使用CDN

大型Web应用对速度的追求并没有止步于仅仅利用浏览器缓存,因为浏览器缓存始终只是为了提升二次访问的速度,对于首次访问的加速,我们需要从网络层面进行优化,最常见的手段就是CDN(Content Delivery Network,内容分发网络)加速。

通过将静态资源(例如javascript,css,图片等等)缓存到离用户很近的相同网络运营商的CDN节点上,不但能提升用户的访问速度,还能节省服务器的带宽消耗,降低负载。



CDN是怎么做到加速的呢?

其实这是CDN服务商在全国各个省份部署计算节点,CDN加速将网站的内容缓存在网络边缘,不同地区的用户就会访问到离自己最近的相同网络线路上的CDN节点,当请求达到CDN节点后,节点会判断自己的内容缓存是否有效,如果有效,则立即响应缓存内容给用户,从而加快响应速度。如果CDN节点的缓存失效,它会根据服务配置去我们的内容源服务器获取最新的资源响应给用户,并将内容缓存下来以便响应给后续访问的用户。

因此,一个地区内只要有一个用户先加载资源,在CDN中建立了缓存,该地区的其他后续用户都能因此而受益



预解析DNS

资源预加载是另一个性能优化技术,我们可以使用该技术来预先告知浏览器某些资源可能在将来会被使用到。通过 DNS 预解析来告诉浏览器未来我们可能从某个特定的 URL 获取资源,当浏览器真正使用到该域中的某个资源时就可以尽快地完成 DNS 解析。例如,我们将来可从 example.com 获取图片或音频资源,那么可以在文档顶部的 标签中加入以下内容:

<link
 
rel
=
"dns-prefetch"
 
href
=
"//example.com"
>

当我们从该 URL 请求一个资源时,就不再需要等待 DNS 的解析过程。该技术对使用第三方资源特别有用。通过简单的一行代码就可以告知那些兼容的浏览器进行 DNS 预解析,这意味着当浏览器真正请求该域中的某个资源时,DNS 的解析就已经完成了,从而节省了宝贵的时间。

另外需要注意的是,浏览器会对a标签的href自动启用DNS Prefetching,所以a标签里包含的域名不需要在head中手动设置link。但是在HTTPS下不起作用,需要meta来强制开启功能。这个限制的原因是防止窃听者根据DNS Prefetching推断显示在HTTPS页面中超链接的主机名。

下面这句话作用是强制打开a标签域名解析:

<meta
 
http-equiv
=
"x-dns-prefetch-control"
 
content
=
"on"
>
作者:浪里行舟,硕士研究生,专注于前端,运营有个人公众号前端工匠,致力于打造适合初中级工程师能够快速吸收的一系列优质文章。

相关推荐

如何找到满意的工作:定位,技能与实践的三要素

在当今竞争激烈的职场环境中,找到一份满意工作是许多职场人追求的目标。它不仅是经济收入的来,更是实现个人价值,获得成就感的途径。然而,如何才能在众多求职者中脱颖而出,找到那份心仪的工作呢?关键在于明确职...

网络营销板块大涨 值得买涨幅居前

来源:新浪证券-红岸工作室04月14日消息,截止10:15,网络营销板块大涨,新华都、齐心集团、实益达、广博股份涨停,值得买、壹网壹创、凯淳股份、丽人丽妆、青木科技、星徽股份等个股涨幅居前。...

强化网络销售监管、保障公众药械安全,国家药监局发布管理规范

为规范医疗器械网络销售行为,保障公众用械安全,国家药品监督管理局今天正式发布《医疗器械网络销售质量管理规范》(以下简称《规范》)。该《规范》将于2025年10月1日起施行,从资质审核、信息展示、风险防...

优化SEM着陆页面的几点感悟(sem优化策略)

如果我们想在着陆页上,实现更好的转化,一定让访客把眼光专注于利益,尽量避免强调需要访客做的事情。相反,要强调他们通过做了以后可以获得的利益。比如将“填写申请表”(听起来像工作的这句话,改为“今天就开始...

重庆网络营销优化公司浅谈SEM技巧品牌词到底投还是不投

在SEM技巧中,品牌词是否要购买?这是重庆网络公司很多客户在建站推广初期都会问到的问题,如果品牌知名度不高,会不会白花钱呢?其实类似话题已经有很多人讨论过了,一般如果品牌知名度比较低,没有别的同行投你...

原创:沃尔玛自助搜索引擎营销(SEM)

“本公众号主要分享北美跨境电商平台运营类教程,所有教程都是原创,旨在为新手卖家提供更多更准确的信息,如果您也是Amazon、Walmart、wayfair、Homedepot卖家,欢迎一起交流。”...

3大方向,有效提高SEM推广咨询量(sem推广策略的关键点)

在咨询行业,不管你是刚接手一个新账户,还是要自己从零开始搭建账户,老板都会问你能带来多少咨询量,什么时候能够见成效。今天仅以我自己的经验给大家提供一点思路,希望以后大家能多多交流。1账户层级...

砂轮修整需要调转速吗?美国发明砂轮修整技术,实现摩擦力提升

文\万物知识局编辑\万物知识局砂轮修整是一种常用的金属表面处理技术,广泛应用于航空、汽车、机械等行业。将重点讨论砂轮修整对钛合金Ti-6Al-4V的可磨性的影响。Ti-6Al-4V合金是一种...

竞价员日常工作内容,资深sem优化师需要做什么?

很多初入竞价行业的小白对竞价员日常工作内容,资深sem优化师需要做什么一直抱有疑问,不知道合格的竞价员每天都应该做些什么工作,或者迷茫的看着账户消费和查排名调价。所以下面就来给大家聊一聊竞价员的一天!...

东莞推广公司详细解析:SEM竞价推广如何优化关键词质量度?米可

在SEM竞价推广中,关键词质量度是影响广告效果的关键因素之一。然而,很多企业却常常遇到关键词质量度不高,导致广告点击率和转化率下降的问题。那么,如何SEM竞价推广优化关键词质量度呢?今天,东莞推广公司...

SEM案例-如何快速在3个月降低50%的转化成本?

今天分享一个招聘行业的sem案例。此项目是一个老账户,客户的KPI要求是在3个月内降低50%的注册成本,可是客户并不打算给我们之前的转化数据,以防我们根据之前的数据做预估,做成本,而不是尽力降成本。那...

GEO vs SEO:AI时代如何让内容既上搜索榜又进AI回答?

1.什么是GEO?GEO(生成引擎优化)就像给AI“投简历”——它专门优化内容,让AI在回答用户问题时优先引用你的信息。比如,当你问AI“德国展会搭建哪家好”,AI可能会直接推荐你优化过的内容,而不...

百度推送收录工具【2025最全教程】

目录第一步:百度推送token获取...

百度jingj优化流程(百度点击优化)

首要在这儿我先普及一下本钱概念。许多人在调价时下意识会觉得账户里核心的关键词一定要排到榜首,笔者在这想要提醒的是,一切的排名都是和本钱挂钩的,排榜首的出价本钱永远是最高的。  假如你并没有核算你的R...

百度SEO必备:无害化WordPress数据库优化与索引添加策略&quot;

前提描述表现症状cpu和负载100%或者mysql占用直接超过100%,wordpress的慢日志提示如下。...

取消回复欢迎 发表评论: