DOM的构建与优化
一、构建模块
HTML描述了一个页面的结构。浏览器会将它转换成一种他们能够理解的格式——文档对象模型(DOM),浏览器引擎有一段特殊的代码叫做解析器,将数据从一种格式转换成另外一种格式。
一个HTML解析器能将数据从HTML转换成DOM。
DOM扮演着两种角色,HTML文档的对象表示,也充当着外界和页面交互的接口,比如通过Javascript。
页面上css样式会被映射到CSSDOM(css对象模型)上,跟DOM不一样的是,不能增量的构建。
二、标签的历史
浏览器构建DOM的时候,如果遇到<srcipt>标签,会立即执行,如果脚本来自外部,会首先下载脚本。为了执行脚本,HTML的解析必须暂停,只有在JavaScript引擎执行完成后他才会重新开始解析。

document.write()也会让DOM 的解析暂停。
三、css会阻塞页面吗?
javascript阻塞页面解析是因为它可以修改文档。css不能修改文档,所以看起来它应该不会阻塞页面。
background-color 属性,会阻塞页面。
即使css不阻塞DOM构建,它会阻塞DOM的渲染。知道DOM与CSSDOM准备好之前,浏览器什么都不会显示。
四、预解析
2008年前

2008年后

先并行下载,然后开始一一解析。
五、预加载
如果你想浏览器更轻易的访问到重要的资源,你可以把他们放在HTML标签当中或者将要加载的脚本内联到文档的前面。将不重要的资源晚一点加载,可以放在文档之后。
六、derfer 与async
defer 和async 属性 提供给开发者一个方式来告诉浏览器哪些脚本是需要异步加载的。
- defer 和async 的执行脚本时机不同
他们告诉浏览器在后台加载脚本的时候,继续解析HTML
defer:解析完DOM成后才执行
async:脚本下载后立即执行,可能打断DOM的构建
七、preload

告诉浏览器你需要尽快地加载他们。
预加载字体需要注意:

DOM的构建与优化的更多相关文章
- DOM操作的性能优化
DOM操作的真正问题在于 每次操作都会出发布局的改变.DOM树的修改和渲染. React解决了大面积的DOM操作的性能问题,实现了一个虚拟DOM,即virtual DOM,这个我们一条条讲. 所以关于 ...
- dom渲染方面的优化浅谈
今天分享一个面试经验,上周面试中一位印象很深的面试官(主要长得很帅),问我了一个我至今印象很深刻的问题,当然不是什么你之后的职业规划啊,你工作中遇到过哪些问题啊之类的.原起于一道面试题,小伙伴们可以想 ...
- 关于DOM操作的性能优化
最著名的有关用js操作dom的观点是:js和dom是独立的小岛,用桥实现两者的联系,但桥很窄,要过路费,所以我们要尽最大可能减少过桥的次数.下面代码演示了用js操作dom的innerHTML,且一下修 ...
- dom操作中的js优化
频繁地对于DOM进行操作的很是损耗性能,但在富网页应用中我们编写脚本无可避免地要跟DOM打交道,到底怎么才能优化这个性能瓶颈呢,大致从以下三种情况去考虑: 访问和修改DOM元素 修改DOM样式,会造成 ...
- CCNET+MSBuild+SVN实时构建的优化总结
本文不是介绍如何使用CCNET+MSBuild+SVN构建自动编译系统,相关的内容可以从很多地方获取,可以再园子里搜一下. 随着我们的SVN库日益壮大,容量达到10G,几十G 甚至更大时,我们发现自动 ...
- 前端dom元素的操作优化建议
参考自:http://blog.csdn.net/xuexiaodong009/article/details/51810252 其实在web开发中,单纯因为js导致性能问题的很少,主要都是因为DOM ...
- Kylin Cube构建过程优化
原文地址:https://kylin.apache.org/docs16/howto/howto_optimize_build.html Kylin将一个cube的build过程分解为若干个子步骤,然 ...
- vue-cli2 构建速度优化
对于使用 vue-cli 脚手架创建的前端项目,编译发布几乎是必需操作,有的编译只需要几秒钟,快如闪电,有的却需要好几分钟,慢如蜗牛.如果是线上进行热修复,那更是分秒必争,网页响应的速度直接影响了用户 ...
- kylin构建cube优化
前言 下面通过对kylin构建cube流程的分析来介绍cube优化思路. 创建hive中间表 kylin会在cube构建的第一步先构建一张hive的中间表,该表关联了所有的事实表和维度表,也就是一张宽 ...
随机推荐
- 控制面板的cpl程序列表
控制面板的cpl程序列表 学习了:https://zhidao.baidu.com/question/2141898537654796628.html 最近用来sysdm.cpl: 辅助功能选项:ac ...
- 移植opencv2.4.9到itop4412开发板
OpenCV是眼下开源项目中最著名的基于机器视觉方向的图像处理的开发包,眼下已经有被移植到嵌入式Linux环境上. 本文介绍了OpenCV交叉编译的基本步骤. 在opencv交叉编译之前要先进行依赖库 ...
- Mockito 库、powermock扩展
转载:http://blog.csdn.net/kittyboy0001/article/details/18709685 Mockito 简介 Mockito 是目前 java 单测中使用比较流行的 ...
- 关于使用Axure RP进行原型开发的一些心得体会
Axure RP(Axure Rapid Prototyping)是一款高速实现.准确表达.带有交互效果且易于上手的原型设计工具. 本人在曾參与某系统需求分析时開始接触Axure RP,初步掌握了一定 ...
- 4种使用webpack提升vue应用的方式
本文参考自:https://mp.weixin.qq.com/s?src=11×tamp=1526886111&ver=889&signature=u9SixhvlJ ...
- (二)关于jQuery
jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是“write Less, ...
- 【Web API系列教程】3.10 — 实战:处理数据(公布App到Azure App Service)
在这最后一节中.你将把应用程序公布到Azure.在Solution Explorer中,右击项目并选择Publish. 点击Publish打开Publish Web对话框. 假设你在新建项目的时候选中 ...
- Oracle更新时间字段
update field set BEGINDATE=to_date('2015-05-03 10:30:20','yyyy-mm-dd hh24:mi:ss') where NOO='01'
- 四、Silverlight中使用MVVM(四)——演练
本来打算用MVVM实现CRUD操作的,这方面例子网上资源还挺多的,毕竟CRUD算是基本功了,因为最近已经开始学习Cailburn框架了,感觉时间 挺紧的,这篇就实现其中的更新操作吧. 功能很明确,当我 ...
- 【Selenium+Python Webdriver】报错之:TypeError: user_login() missing 1 required positional argument: 'self'
先贴一下源码: base.py文件如下: from selenium import webdriver class Page(object): ''' 页面基础类,用于所有页面的继承 ''' rb_u ...