// app.js
const express = require(‘express’)
const fs = require(‘fs’)
const app = new express()
const port = 3000
const sleepFun = time => {
return new Promise(res => {
setTimeout(() => {
res()
}, time)
})
}
const filter = (req, res, next) => {
const { sleep } = req.query || 0
if (sleep) {
sleepFun(sleep).then(() => next())
} else {
next()
}
}
app.use(filter)
app.use(‘/static/’, express.static(‘./static/’))
app.get(‘/’, function (req, res, next) {
fs.readFile(‘./index.html’, ‘UTF-8’, (err, data) => {
if (err) return
res.send(data)
})
})
app.listen(port, () => {
console.log(app is running at http://127.0.0.1:${port}/
)
})
// static/index.js
var p = document.querySelector(‘p’);
console.log§;
// static/index.css
p { color: lightblue; }
复制代码
接着就是index.html
的准备工作,其中HTML
部分的架子就长下面那样,然后你只需要记住DOMContentLoaded
事件将在页面DOM
解析完成后触发。
hello world
复制代码
CSS 不会阻塞 DOM 解析,但是会阻塞 DOM 渲染
首先在index.html
插入如下<link>
标签,然后在浏览器输入http://127.0.0.1:3000/
访问此页面。
hello world
复制代码
页面初始显示为空白,控制台打印出了p
元素,同时浏览器标签页上加载loading
,3s
后页面显示出浅蓝色的hello world
。
在这里插入图片描述
以上情况也就说明,CSS
不会阻塞DOM
的解析,如果说CSS
阻塞DOM
解析的话,那么p
标签不会被解析,进而DOM
不会被解析完成,CSS
请求过程中也不可能会触发DOMContentLoaded
事件。而且在css
请求过程中,控制台立即打印出了p
元素,由此也验证了此结论的正确性。
另一个情况就是,虽然DOM
很早就被解析完成,但是p
标签却迟迟没有渲染,原因在于CSS
样式还未请求完成,在样式获取后hello world
才被渲染出来,所以说CSS
会阻塞页面渲染。
简单阐述一下浏览器的解析渲染过程,解析DOM
生成DOM Tree
,解析CSS
生成CSSOM Tree
,两者结合生成render tree
渲染树,最后浏览器根据渲染树渲染至页面。由此可以看出DOM Tree
的解析和CSSOM Tree
的解析是互不影响的,两者是并行的。因此CSS
不会阻塞页面DOM
的解析,但是由于render tree
的生成是依赖DOM Tree
和CSSOM Tree
的,因此CSS
必然会阻塞DOM
的渲染。
更为严谨一点的说,CSS
会阻塞render tree
的生成,进而会阻塞DOM
的渲染。
JS 会阻塞 DOM 解析
为了避免加载CSS
造成的干扰,如下仅关注JS
的执行情况,其中for
循环的循环体中逻辑暂不考虑,仅仅是让JS
执行更多时间。
hello world
复制代码
浏览器访问页面,初始时为空白且控制台打印null
,浏览器loading
短暂延时后,控制台打印出p
标签同时页面渲染出hello world
。
在这里插入图片描述
以上情况很容易说明JS
会阻塞DOM
解析了,JS
执行初控制台打印null
,因为此时p
标签还未被解析,for
循环执行时,可以明显感觉到执行耗时,执行完成p
标签被解析,此时触发DOMContentLoaded
事件,控制台打印出p
标签,同时页面渲染出hello world
。
比较合理的解释就是,首先浏览器无法知晓JS
的具体内容,倘若先解析DOM
,万一JS
内部全部删除掉DOM
,那么浏览器就白忙活了,所以就干脆暂停解析DOM
,等到JS
执行完成再继续解析。
CSS 会阻塞 JS 的执行
如下在页内JS
脚本前插入<link>
标签,并且延时3s
获取CSS
样式。
hello world
复制代码
初始页面空白,浏览器loading
加载3s
后,控制台打印出null
,紧接着打印出p
标签,同时页面渲染出浅蓝色p
标签。
在这里插入图片描述
此情况好像是CSS
不仅阻塞了DOM
的解析,而且也阻塞了DOM
渲染。
但是首先要思考下是什么阻塞了DOM
的解析,刚刚已经证明了CSS
不会阻塞DOM
的解析,所以只可能是JS
阻塞了DOM
解析。但是JS
只有两行代码,不会阻塞长达3s
左右的时间。所以只有一个可能就是CSS
会阻塞JS
的执行。
因此输出结果也能大致分析出来了,首先解析到第一个<script>
标签,document
绑定上DOMContentLoaded
事件,紧接着解析到link
标签,浏览器请求CSS
样式,由于CSS
不会阻塞DOM
解析,因此浏览器继续向下解析,发现第二个<script>
标签,浏览器请求JS
脚本,此时JS
获取完成,但是由于CSS
还在获取,所以不能立即执行。
而第二个<script>
不能立即执行,导致它后面的p
标签也没办法解析,原因则是JS
会阻塞DOM
解析。只有等待到CSS
样式获取成功后,此时JS
立即执行,控制台输出null
,然后浏览器继续解析到p
标签,解析完成,DOMContentLoaded
事件触发,控制台输出p
标签,最后浅蓝色hello world
渲染至页面。
其实这样做也是有道理的,设想JS
脚本中的内容是获取DOM
元素的CSS
样式属性,如果JS
想要获取到DOM
最新的正确的样式,势必需要所有的CSS
加载完成,否则获取的样式可能是错误或者不是最新的。因此要等到JS
脚本前面的CSS
加载完成,JS
才能再执行,并且不管JS
脚本中是否获取DOM
元素的样式,浏览器都要这样做。
回溯文章开头的那个疑问,所以一般将<script>
放在<link>
标签前面是有道理的。
JS 会触发页面渲染
如下CSS
采用页内方式,其中颜色名及其rgb
值分别为浅绿色lightblue
(rgb(144, 238, 144)
)、粉色pink
(rgb(255, 192, 203)
)。
// index.html
hello
beautiful
world
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是附赠给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等
详细大厂面试题答案、学习笔记、学习视频等资料领取,点击资料领取直通车免费领取!
前端视频资料:
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是附赠给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等
详细大厂面试题答案、学习笔记、学习视频等资料领取,点击资料领取直通车免费领取!
[外链图片转存中…(img-mUwtJL7p-1712303776275)]
前端视频资料: