参考https://zhuanlan.zhihu.com/p/34453198
参考https://juejin.cn/post/6844903761949753352

1.html5新特性

  1. 语义标签。给标签添加语义,让合适的标签做合适的事。<‘header’>,<‘footer’>,<‘nav’>。
    有利于SEO(搜索引擎优化),有利于开发和维护。
  2. canvas,svg
  3. Web Storage
    本地存储解决方案,就是localStorage和sessionStorage
  4. Web Worker
    Web Worker可以通过加载一个脚本文件,进而创建一个独立工作的线程,在主线程之外运行。
  5. 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样式资源。

    1. 不阻塞html解析(下载是异步的)
    2. 阻塞render渲染,也就是在构建render时,会等到css资源全部下载完毕才进行。主要是防止CSSOM不断变化,导致render树的不断重构。
    3. 有例外,media query(媒体查询)声明的css是不会阻塞渲染的。
  • js脚本资源

    1. 阻塞html解析,遇到js脚本,需等待下载完毕后才继续执行
    2. 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...)相关推荐

  1. MySQL数据库启动报The server quit without updating PID file

    启动mysql时报如下错误 [root@VM_26_56_centos data]# service mysqld start Starting MySQL.. ERROR! The server q ...

  2. pandas基于条件判断更新dataframe中所有数据列数值内容的值(Conditionally updating all values in pandas Dataframe )

    pandas基于条件判断更新dataframe中所有数据列数值内容的值(Conditionally updating all values in pandas Dataframe ) 目录

  3. pandas基于条件判断更新dataframe中特定数据列数值内容的值(Conditionally updating values in specific pandas Dataframe )

    pandas基于条件判断更新dataframe中特定数据列数值内容的值(Conditionally updating values in specific pandas Dataframe ) 目录

  4. 今天安装VisualSVN 不小心删掉了安装目录,再次安装 修改 移除提示UninstallWMISchemaExecute (0x8004401e) when updating VisualSV

    参考资料: UninstallWMISchemaExecute (0x8004401e) when updating VisualSVN on Windows XP 7. May 2012 by Ro ...

  5. MySQL启动报:[ERROR] The server quit without updating

    [root@localhost mysql]# service mysql restart Starting MySQL...[ERROR] The server quit without updat ...

  6. Starting MySQL....The server quit without updating PID file 处理方法

    报错: Starting MySQL....The server quit without updating PID file ... 查看错误日志 情景1: 120217 15:09:57[ERRO ...

  7. 启动mysql服务是报错找不到pid_mysql报错 The server quit without updating PID file

    我的mysql总是在重启的时候mysql的数据总是会初始化,我以为是的配置问题,所以在网上找了各种方法测试都不通过,下面看我遇到的几个错误. 重启mysql失败 [root@wulaoer_mysql ...

  8. IDEA 出现 updating indices 卡进度条问题的解决方案并加快索引速度

    IDEA 出现 updating indices 卡进度条问题的解决方案并加快索引速度 参考文章: (1)IDEA 出现 updating indices 卡进度条问题的解决方案并加快索引速度 (2) ...

  9. Starting MySQL... ERROR! The server quit without updating PID file 问题解决

    Starting MySQL... ERROR! The server quit without updating PID file 问题解决 参考文章: (1)Starting MySQL... E ...

  10. vector机器人 UPDATING YOUR VECTOR ACCOUNT 更新你的 VECTOR 帐户

    目录 Sections: 部分: Creating an account 创建一个帐户 Email address requirements 电邮地址要求 Username requirements ...

最新文章

  1. 华为手机的nfc是什么功能_华为手机NFC只用来乘车?这个功能还不会用,几千块手机亏了...
  2. 网络安全人才纳人"城市合伙人"计划 1亿资金招募顶尖人才
  3. C# 往excel出力数据
  4. ARMV8 datasheet学习笔记3:AArch64应用级体系结构
  5. python 日期处理_python 处理时间和日期
  6. iOS学习笔记3 - 命名空间
  7. 有状态容器实践:k8s集成ceph分布式存储
  8. POJ 2104 K-th Number (区间第k大)
  9. 【推导】【DFS】Codeforces Round #429 (Div. 1) B. Leha and another game about graph
  10. 如你以安全模式启动计算机,如何以安全模式启动计算机?
  11. vmospro启动黑屏_VMOSPro(com.vmos.pro) - 1.1.28 - 应用 - 酷安网
  12. 微博大 V 用户画像与热点话题分析
  13. mongodb之快速入门
  14. Jquery点击切换播放不同的Flv视频文件
  15. 网站表单自动填写【使用pyautogui 】
  16. javascript:alert(document.cookie)
  17. win10系统添加安装打印机教程
  18. 码支付系统 无授权—个人免签约支付系统二维码收款即时到账源码 –
  19. 5、Horizon 桌面模板机安装配置
  20. 1.1 Linux内核代码下载、编译

热门文章

  1. mysql数据库事务传播特性_什么是事务的传播特性?
  2. vim的简单使用及配置
  3. Linux下磁盘阵列raid
  4. Downloading SRA data using command line utilities
  5. 如何直接打开android系统的wifi设置页面,防止intent劫持
  6. 下载所有需要的rpm文件路径
  7. Win10,Win7,WinServer2012,WinServer2008内存最大支持
  8. 创建最原始的XMLHttprequest对象
  9. Ubuntu设置局域网Windows共享文件Samba
  10. 030、JVM实战总结:G1分代回收原理深度图解:为什么回收性能比传统GC更好?