热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浏览器加载、渲染以及优化页面的顺序和方法

1.浏览器加载和渲染html的顺序(1)IE下载的顺序是从上到

1.浏览器加载和渲染html的顺序

(1)IE下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的。
(2)在渲染到页面的某一部分时,其上面的所有部分都已经下载完成(并不是说所有相关联的元素都已经下载完)
(3)如果遇到语义解释性的标签嵌入文件(JS脚本,CSS样式),那么此时IE的下载过程会启用单独连接进行下载。
(4)并且在下载后进行解析,解析过程中,停止页面所有往下元素的下载。阻塞加载
(5)样式表在下载完成后,将和以前下载的所有样式表一起进行解析,解析完成后,将对此前所有元素(含以前已经渲染的)重新进行渲染。
(6)JS、CSS中如有重定义,后定义函数将覆盖前定义函数

2. JS的加载

(1)不能并行下载和解析(阻塞下载)
(2)当引用了JS的时候,浏览器发送1个js request就会一直等待该request的返回。因为浏览器需要1个稳定的DOM树结构,而JS中很有可能有代码直接改变了DOM树结构,比如使用 document.write 或 appendChild,甚至是直接使用的location.href进行跳转,浏览器为了防止出现JS修改DOM树,需要重新构建DOM树的情况,所以 就会阻塞其他的下载和呈现.

3.如何加快HTML页面加载速度

(1)页面减肥

页面的肥瘦是影响加载速度最重要的因素,故需要删除不必要的空格、注释。将inline的script(内联脚本)和css移到外部文件,可以使用HTML Tidy来给HTML减肥,还可以使用一些压缩工具来给Javascript减肥(HTML Tidy是一个免费的HTML检查工具,它是设计用来检查您的HTML代码,并可以指出其中没有完全符合W3C发布标准的地方,它可以用来分析一个HTML文件或者一个包含HTML语句的字符串,还可以自动进行必需的修改以使代码符合相关标准的要求。)。

(2)减少文件数量

减少页面上引用的文件数量可以减少HTTP连接数。许多Javascript、CSS文件可以合并最好合并。

(3)减少域名查询

DNS查询和解析域名也是消耗时间的,所以要减少对外部Javascript、CSS、图片等资源的引用,不同域名的使用越少越好。

(4)缓存重用数据

使用缓存机制。

(5)优化页面元素加载顺序

首先加载页面最初显示的内容和与之相关的Javascript和CSS,然后加载DHTML相关的东西,像什么不是最初显示相关的图片、flash、视频等很肥的资源就最后加载(动态HTML,即Dynamic HTML,简称DHTML,并不是一门新的语言,它只是HTML、CSS和客户端脚本的一种集成,即一个页面中包括html+css+Javascript(或其它客户端脚本),其中css和客户端脚本是直接在页面上写而不是链接上相关文件)。

(6)减少inline Javascript的数量

浏览器parser(parser:解析器,分析器,语法分析器)会假设inline Javascript会改变页面结构,所以使用inline Javascript开销较大,不要使用document.write()这种输出内容的方法,使用现代W3C DOM方法来为现代浏览器处理页面内容。

(7)使用现代CSS和合法的标签

使用现代CSS来减少标签和图像,例如使用现代CSS+文字完全可以替代一些只有文字的图片,使用合法的标签避免浏览器解析HTML时做“error correction”等操作,还可以被HTML Tidy来给HTML减肥。

(8)Chunk your content(将内容分块)

不要使用嵌套tables,而使用非嵌套table或者div。将基于大块嵌套的table的layout分解成多个小table,这样就不需要等到整个页面(或大table)内容全部加载完才显示。

(9)指定图像和tables的大小

如果浏览器可以立即决定图像或tables的大小,那么它就可以马上显示页面而不要重新做一些布局安排的工作,这不仅加快了页面的显示,也预防了页面完成加载后布局的一些不当的改变。image使用height和width。

(10)根据用户浏览器明智的选择策略

IE、Firefox、Safari等等等等。

4.HTML页面加载和解析流程

(1)用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件;
(2)浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件;
(3)浏览器又发出CSS文件的请求,服务器返回这个CSS文件;
(4)浏览器继续载入html中<body>部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了;
(5)浏览器在代码中发现一个<img>标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;
(6)服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码;
(7)浏览器发现了一个包含一行Javascript代码的<script>标签,赶快运行它;
(8)Javascript脚本执行了这条语句,它命令浏览器隐藏掉代码中的某个<div> (style.display=”none”)。杯具啊,突然就少了这么一个元素,浏览器不得不重新渲染这部分代码;
(9)终于等到了</html>的到来,浏览器泪流满面……
(10)等等,还没完,用户点了一下界面中的“换肤”按钮,Javascript让浏览器换了一下<link>标签的CSS路径;
(11)浏览器召集了在座的各位<div><span><ul><li>们,“大伙儿收拾收拾行李,咱得重新来过……”,浏览器向服务器请求了新的CSS文件,重新渲染页面。

5.提高网站访问速度的34条军规

(1)减少HTTP请求数量

(2)使用内容分布式网络

CDN(Content Distribution Network),即内容分发网络,其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘",使用户可以就近取得所需的内容,从更本上解决Internet网络拥塞状况,提高用户访问网站的响应速度(基本工作原理就是广泛采用各种Cache服务器,将这些Cache服务器分布到用户访问相对集中的地区或网络中)。

(3)给头部添加一个失效期或者cache-control

(4)压缩组件

(5)把样式表放于前面

(6)把脚本放在最后

(7)不使用CSS表达式

(8)使用外部的Javascript和CSS

(9)减少DNS的查询

(10)缩小Javascript和CSS

(11)避免重定向

(12)移除重复的脚本

(13)设定ETags

ETag,全称为:Entity Tag,意思是实体标签,从名字上看,是对于某种实体的一个标识。它属于HTTP协议的一部分,也就是所有的Web服务器都应该(也确实能)支持这个特性。它的作用是用一个特殊的字符串来标识某个资源的“版本”,客户端(浏览器)来请求的时候,可以比较,如果ETag一致,则表示该资源并没有修改过,客户端(浏览器)可以使用自己缓存的版本。

(14)让Ajax可以缓存

(15)更早的刷新缓冲区

(16)在Ajax请求中使用GET方法

(17)后加载组件

(18)预先加载组件

(19)减小DOM元素的数量

(20)分域部署部件:Split Components Across Domains

将部件分割能使你获得最大的并行下载效率。但你同时需要注意不使用多于2~4个域名,以避免DNS查询导致的问题。例如,你可以将HTML内容和动态的组建放于www.example.org域名下,将静态组件分别放于static1.example.org和static2.example.org之下。

(21)减少Iframe的数量 Minimize the Number of iframes

Iframes 能够使HTML文档被插入进父级文档中。首先需要明确iframe的工作方式,才能有效的利用这一形式。

的优点:
a、对于第三方内容,比如广告,能够在不影响父级设计的情况下快捷插入。
b、提供安全沙箱,不影响父级。
c、能够并行下载脚本。

的缺点:
a、即使是空的也会有消耗。
b、会锁住页面的onload事件。
c、不支持语义表达。

(22) 避免404错误 No 404s

一个获得没用的404响应的HTTP请求对于宝贵的HTTP请求资源来说是完全不必要的,而且这样还会减慢用户的体验。
有的网站提供了有帮助的404错误信息,比如"你是否在寻找……?",这样虽然能提高用户体验,但同样浪费了服务端资源(比如数据库)。尤其不妙的是在请求一个外部的Javascript脚本文件失败时获得的一个404错误,因为这样不但会堵塞并行的下载,而且浏览器会尝试分析404响应的内容,来辨识它是否是有用的Javascript代码。

(23)减少COOKIE的大小 Reduce COOKIE Size

有多种理由让我们应用HTTP COOKIE,比如身份验证,或者个性化设置。COOKIE中的信息在服务端和浏览器间被放在HTTP头中交换。尽量减少COOKIE的体积对减少用户获得响应的时间十分重要。
a、去除不必要的COOKIE。
b、尽量减少COOKIE的大小。
c、留心将COOKIE设置在适当的域名下,避免影响到其他网站。
d、设置适当的过期时间。一个较早的过期时间或者不设置过期时间会更快的删除COOKIE,从而减少用户的响应时间。

(24)为部件使用没有COOKIE的域名 Use COOKIE-free Domains for Components

当浏览器请求一个静态图片并一同发送COOKIE时,服务器并不需要这些COOKIE。这样只是毫无益处的创建了多余的网络流量。应当保证静态的部件在请求时没有携带COOKIE,所以需要把你的静态部件放在另一个子域名下。

如果你的域名是www.example.org,你可以将你的静态部件放在static.example.org中。如果你把COOKIE设置在顶级域名example.org上而不是www.example.org,那么所有发送至static.example.org的请求会包括那些COOKIE。在这种情况下,你可以买一个全新的没有COOKIE的域名来放置你的静态部件。Yahoo!使用了yimg.com,YouTube试用了ytimg.com,Amazon使用的是images-amazon.com。

将静态部件放于没有COOKIE的域名下的另一个好处是一些代理服务器会拒绝缓存有COOKIE的部件。与此相关的一点是,如果你怀疑你应该为你的首页使用example.org还是www.example.org,考虑COOKIE的赢下。省略www会让你不得不把COOKIE写到*.example.org下,所以考虑性能,最好使用www.子域名,然后把COOKIE写到这个子域名下。

(25) 减少DOM的读取 Minimize DOM Access

利用Javascript读取DOM元素很慢,所以为了获得响应更快的页面,你应该:
a、缓存被读取的元素的引用。
b、脱机更新节点然后把它们加回到树结构中。
c、避免利用Javascript定位布局。

提高网站访问速度的34条军规 20-25
提高网站访问速度的34条军规 26-30
提高网站访问速度的34条军规 31-34

(26)开发灵巧的事件处理程序 Develop Smart Event Handlers

如果有太多的事件处理逻辑部署在DOM树的不同元素上,它们的频繁执行会拖慢页面的响应速度。而使用事件委托是一个好的解决方法。如果在一个Div中有10个按钮,与其在每个按钮上都放一个事件处理程序,步入只在Div上放一个事件处理程序。事件会冒泡上溯,这样你就会捕获这一事件,并找出是哪个按钮发起的它。

同样,你并不需要等待onload事件来启动一些操作DOM树的程序。你只需要保证你需要操作的元素可用就可以了。你不需要等待所有的图片下载完毕,你应当使用DOMContentLoaded事件来替代onload事件,当然,目前并不是所有浏览器都支持这一事件,你可以使用YUI Event组件,其中包含了一个onAvailable函数。

(27) 选择而不是@import Choose over @import

前面提到把CSS应当放在最顶端来提供预显。在IE中,放在页面底部的@import和效果是一样的,所以最好不要用它。

(28) 不使用过滤器 Avoid Filters

IE专有的AlphaImageLoader过滤器是为了解决半透明真色PNG图片在IE7之前的版本中显示的问题。这个过滤器会在图片下载时堵塞住展示。而且它会消耗内存并影响每个元素而不仅仅是每张图片,所以这个过滤器的问题很多。

所以最好在IE中完全不使用AlphaImageLoader过滤器,而使用渐淡的PNG8图片。如果你明确需要AlphaImageLoader,请使用hack _filter,从而不影响到你的IE7+的用户。

(29)优化图片 Optimize Images

当设计师制作好网站的图片后,还有些事情应该是你在把这些图片上传到服务器之前做的。

a、你可以检查GIF图片中的调色板是否和图片中的色彩数一致。使用imagemagick来帮助你方便的检查:
identify -verbose image.gif
如果你看到一个4色的图片却有一个256色的调色板,那么还有很大的空间来做性能优化。
b、试试把GIF转换成PNG是否会节省空间,这是常有的事情。由于浏览器支持的限制,开发者往往怀疑是否该使用PNG,但这是过去的事情了。唯一的问题是真色的PNG图片的半透明问题,但同样,GIF不是真色的而且也不支持丰富的透明效果。所以GIF可以做的,PNG或者PNG8同样可以做到(除了动画)。一条简单的imagemagick语句就可以提供可用的PNG:
convert image.gif image.png
“我们强调的是,给PNG一个机会!”
c、使用pngcrush或者任何的PNG优化工具,例如:
pngcrush image.png -rem alla -reduce -brute result.png
d、使用jpegtran处理JPEG图片。这个工具会无损操作JPEG图片,比如旋转,而且可以用来优化图片,比如去除图片中的注释和其他无用的信息(比如EXIF信息)。
jpegtran -copy none -optimize -perfect src.jpg dest.jpg

(30)优化CSS精灵 Optimize CSS Sprites

横向布局Sprite中的图片往往比纵向布局会减少文件大小。
在一个Sprite中组合相近的颜色会降低颜色的数量,从而达到适合PNG8的低于256色的标准。
“对移动设备友好”,不在Sprite里留下大的空隙。这并不十分影响文件的大小,但会减少客户端代理将图片解压为像素映射的内存消耗,100100的图片是一万像素,而10001000则是一百万像素。

(31)不要在HTML中缩放图片 Don’t Scale Images in HTML

不要使用大小超过需要的图片,即使你能够在HTML中设置它的属性。如果你需要

版权声明:本文为chaopingyao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/chaopingyao/article/details/103777294
推荐阅读
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
author-avatar
小力维2010_622_531
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有