关于html的一切(updating...)
参考https://zhuanlan.zhihu.com/p/34453198
参考https://juejin.cn/post/6844903761949753352
1.html5新特性
- 语义标签。给标签添加语义,让合适的标签做合适的事。<‘header’>,<‘footer’>,<‘nav’>。
有利于SEO(搜索引擎优化),有利于开发和维护。 - canvas,svg
- Web Storage
本地存储解决方案,就是localStorage和sessionStorage - Web Worker
Web Worker可以通过加载一个脚本文件,进而创建一个独立工作的线程,在主线程之外运行。 - WebSocket协议
建立在tcp基础之上,和http协议同属于应用层,没有同源限制
2.html解析页面过程
1. 解析html,构建DOM树
- 构建描述的节点的层级关系的树,包括可见和不可见节点。例如
2. 解析css,生成css规则树CSSOM
- 构建节点样式的层级关系树,但只包括可见节点。例如
3. 合并DOM树和CSS规则,生成render树
- 将节点的样式和其属性结合。注意是可见节点
4. 布局render树(layout/reflow),负责个元素尺寸、位置的计算
5. 绘制render树(paint),绘制页面像素信息
- 布局和绘制,主要发生过程就是计算样式,位置,尺寸等信息,最后绘制。
- reflow,即回流。某个元素发生了结构、位置、内容的变化,就需要重新计算样式和渲染树
- repaint,即重绘,某个元素只是发生了样式的变化,只需要重新绘制该元素的外观即可。
- reflow必然要引起repaint。
6. 浏览器会将各层的信息发送个GPU,GPU会将各层合成,显示在屏幕上
如何优化性能:
- 减少逐项更改样式,最好一次性更改,要么就定义class样式
- 将复杂的元素绝对定位或固定定位,使其脱离文档流。否则发生改变,回流代价很高。
- 避免循环操作dom,创建一个容器使其涵盖所有dom的操作,最后添加到window.document。
解析过程遇到的资源的处理: 主要分为3块
css样式资源。
- 不阻塞html解析(下载是异步的)
- 阻塞render渲染,也就是在构建render时,会等到css资源全部下载完毕才进行。主要是防止CSSOM不断变化,导致render树的不断重构。
- 有例外,media query(媒体查询)声明的css是不会阻塞渲染的。
js脚本资源
- 阻塞html解析,遇到js脚本,需等待下载完毕后才继续执行
- defer和async。加上这两个,可以使js脚本下载为并行,也就是不阻塞html解析。
但defer和async的区别在于js脚本的执行时机。
使用defer,js脚本的执行将会在html解析完成后。
使用async,js脚本将会在下载完后立刻执行,且阻塞html解析。
所以如果你的js脚本依赖dom元素,用defer。反之,用async。
img图片资源(异步下载,不阻塞。且下载完直接替换原src)
3.事件捕获、事件目标、事件冒泡、事件委托/代理
1.事件捕获
- 当某个元素触发某个事件(例如onclick),顶层对象document就会发出一个事件流,随着DOM树的节点向目标元素节点流去,直到到达事件真正发生的目标元素。在这个过程中,事件对应的监听的函数是不会被触发的。
2.事件目标
- 当到达目标元素之后,执行目标元素该事件对应的处理函数。如果没有绑定监听函数,就不执行
3.事件冒泡
- 从目标元素开始,往顶层元素传播。途中如果有节点绑定了相应的事件处理函数,这些函数都会被触发一次。如果想阻止,可以用e.stopPropagation()来阻止事件的冒泡传播
4.事件委托/事件代理
- 就是将一个响应事件委托到另一个元素
- 当子节点被点击时,click事件向上冒泡,父节点捕获到事件后,我们判断是否为所需的节点,然后进行处理。其优点在于减少内存消耗和动态绑定。
currentTarget和target
- currentTarget是事件的监听者,也就是绑定事件的节点
- target是事件真正出发者。
- 假设A是B的父元素,在A上绑定click事件。当我点击B时,此时target就是B,而currentTarget是A。
可以在addEventLister的第三个参数增加true,表示事件在事件捕获时发生;
为false(默认),则表示事件在事件冒泡时发生。
4.node事件循环
当node.js启动后,它会初始化事件循环,处理已提供的输入脚本,他可能会调用一些异步的API,调度定时器,或者调用process.nextTick(),然后开始处理事件循环。
注意:每一个框都被称为事件循环的一个阶段。
每个阶段都有一个FIFO队列来执行回调,当进入给定的阶段时,它将执行特定于该阶段的任何操作,然后执行该阶段队列中的回调,直到队列用尽或最大回调树已执行。当该队列已用尽或达到回调限制,事件循环将移动到下一个阶段,等等。
阶段概述:
- timers(定时器):本阶段执行已经被setTimeout()和setInterval()的调度回调函数。
- pending callbacks(待定回调):执行延迟到下一个循环迭代的I/O回调。
- idle,prepare:仅系统内部使用。
- poll(轮询):检查新的I/O事件;执行与I/O相关的回调。
- check(检测):setImmedidate()回调函数在这里执行
- close callbacks(关闭的回调函数),一些关闭的回调函数。
timer阶段:
- timer阶段会执行setTimeout和setInterval回调,并且是由poll阶段控制的。同样,在node中定时器指定的时间也不是准确时间。
poll阶段:
- 会执行两件事,1.回到timer阶段执行回调,2.执行I/O回调
- 假设没有timer的话
如果poll队列不为空,会遍历回调队列并同步执行,直到为空
如果poll队列为空,
如果有setImmediate回调需要执行,则poll阶段会停止进入check阶段执行回调 。
如果没有setImmediate回调需要执行,则会等到回调被加入队列中并立即执行,但同样设置一个超时时间以防一直等待下去。 - 假设有timer,则会等待timer超时,然后回到timer阶段进行回调。
setTimeout 和 setImmediate的区别:
二者非常相似,区别主要在于调用时间不同。
- setImmediate 设计在poll阶段完成时执行,即check阶段。
- setTimeout 设计在poll阶段为空闲时间时,且设定时间到达后执行,但他在timer阶段执行。
setTimeout(function timeout () {console.log('timeout');
},0);
setImmediate(function immediate () {console.log('immediate');
});
对于上述代码,两者执行的顺序是随机的。
而在I/O的callBack中,setImmediate永远先于setTimeout。
const fs = require('fs')
fs.readFile(__filename, () => {setTimeout(() => {console.log('timeout');}, 0)setImmediate(() => {console.log('immediate')})
})
// immediate
// timeout
process.nextTick:
- 独立于事件循环之外,可以认为它拥有自己的一个nextTick队列,当每个阶段完成后,如果存在nextTick队列,就会清空nextTick队列中的所有回调函数,并且优先于其他微任务 。
- 简单来说,nextTick就是一个拥有最高优先级的微任务。
nodejs 和 浏览器关于eventLoop的主要区别:
- 浏览器端,微任务是在每一个响应的宏任务中执行
- node端,微任务是在不同剪短之间执行的。
node11和node < 11的版本区别
setTimeout(()=>{console.log('timer1')Promise.resolve().then(function() {console.log('promise1')})
}, 0)
setTimeout(()=>{console.log('timer2')Promise.resolve().then(function() {console.log('promise2')})
}, 0)
node < 11:timer1 ,timer2,promise1,promise2
node === 11:timer1 ,promise1,timer2,promise2
可以发现node11的行为和浏览器端相同了,
这是因为在node < 11 :若第一个定时器任务出列并执行完,当它发现队首的任务仍然是一个定时器时,
那么就将微任务暂时保存,直接去执行新的定时器任务,当新的定时器执行完后,再一一执行中途产生的微任务。
关于html的一切(updating...)相关推荐
- MySQL数据库启动报The server quit without updating PID file
启动mysql时报如下错误 [root@VM_26_56_centos data]# service mysqld start Starting MySQL.. ERROR! The server q ...
- pandas基于条件判断更新dataframe中所有数据列数值内容的值(Conditionally updating all values in pandas Dataframe )
pandas基于条件判断更新dataframe中所有数据列数值内容的值(Conditionally updating all values in pandas Dataframe ) 目录
- pandas基于条件判断更新dataframe中特定数据列数值内容的值(Conditionally updating values in specific pandas Dataframe )
pandas基于条件判断更新dataframe中特定数据列数值内容的值(Conditionally updating values in specific pandas Dataframe ) 目录
- 今天安装VisualSVN 不小心删掉了安装目录,再次安装 修改 移除提示UninstallWMISchemaExecute (0x8004401e) when updating VisualSV
参考资料: UninstallWMISchemaExecute (0x8004401e) when updating VisualSVN on Windows XP 7. May 2012 by Ro ...
- MySQL启动报:[ERROR] The server quit without updating
[root@localhost mysql]# service mysql restart Starting MySQL...[ERROR] The server quit without updat ...
- Starting MySQL....The server quit without updating PID file 处理方法
报错: Starting MySQL....The server quit without updating PID file ... 查看错误日志 情景1: 120217 15:09:57[ERRO ...
- 启动mysql服务是报错找不到pid_mysql报错 The server quit without updating PID file
我的mysql总是在重启的时候mysql的数据总是会初始化,我以为是的配置问题,所以在网上找了各种方法测试都不通过,下面看我遇到的几个错误. 重启mysql失败 [root@wulaoer_mysql ...
- IDEA 出现 updating indices 卡进度条问题的解决方案并加快索引速度
IDEA 出现 updating indices 卡进度条问题的解决方案并加快索引速度 参考文章: (1)IDEA 出现 updating indices 卡进度条问题的解决方案并加快索引速度 (2) ...
- Starting MySQL... ERROR! The server quit without updating PID file 问题解决
Starting MySQL... ERROR! The server quit without updating PID file 问题解决 参考文章: (1)Starting MySQL... E ...
- vector机器人 UPDATING YOUR VECTOR ACCOUNT 更新你的 VECTOR 帐户
目录 Sections: 部分: Creating an account 创建一个帐户 Email address requirements 电邮地址要求 Username requirements ...
最新文章
- 华为手机的nfc是什么功能_华为手机NFC只用来乘车?这个功能还不会用,几千块手机亏了...
- 网络安全人才纳人"城市合伙人"计划 1亿资金招募顶尖人才
- C# 往excel出力数据
- ARMV8 datasheet学习笔记3:AArch64应用级体系结构
- python 日期处理_python 处理时间和日期
- iOS学习笔记3 - 命名空间
- 有状态容器实践:k8s集成ceph分布式存储
- POJ 2104 K-th Number (区间第k大)
- 【推导】【DFS】Codeforces Round #429 (Div. 1) B. Leha and another game about graph
- 如你以安全模式启动计算机,如何以安全模式启动计算机?
- vmospro启动黑屏_VMOSPro(com.vmos.pro) - 1.1.28 - 应用 - 酷安网
- 微博大 V 用户画像与热点话题分析
- mongodb之快速入门
- Jquery点击切换播放不同的Flv视频文件
- 网站表单自动填写【使用pyautogui 】
- javascript:alert(document.cookie)
- win10系统添加安装打印机教程
- 码支付系统 无授权—个人免签约支付系统二维码收款即时到账源码 –
- 5、Horizon 桌面模板机安装配置
- 1.1 Linux内核代码下载、编译
热门文章
- mysql数据库事务传播特性_什么是事务的传播特性?
- vim的简单使用及配置
- Linux下磁盘阵列raid
- Downloading SRA data using command line utilities
- 如何直接打开android系统的wifi设置页面,防止intent劫持
- 下载所有需要的rpm文件路径
- Win10,Win7,WinServer2012,WinServer2008内存最大支持
- 创建最原始的XMLHttprequest对象
- Ubuntu设置局域网Windows共享文件Samba
- 030、JVM实战总结:G1分代回收原理深度图解:为什么回收性能比传统GC更好?