为什么外链css为什么要放头部?

前端开发中,将CSS放在头部、JS放在底部是为了优化页面加载和渲染体验。CSS在头部可以与HTML解析同步,避免样式闪烁;JS放底部防止阻塞HTML解析,确保先显示内容。async和defer属性用于异步加载JS,async立即执行,defer按顺序延迟执行。现代浏览器的prefetch优化使得头部分布顺序影响减小。

我们最开始学前端的时候都会看到教程在处理外部css,js的时候会将css放在header中,js放在body的最后。为什么要这样子处理,今天参考一些资料好好分析下。

为什么外链css为什么要放头部?

首先整个页面展示给用户会经过html 的解析与渲染过程。

而外链css无论放在html的任何位置都不影响html的解析,但是影响html的渲染。

如果将css放在尾部,html的内容可以第一时间显示出来,但是会阻塞html行内css的渲染。

浏览器的这个策略其实很明智的,想象一下,如果没有这个策略,页面首先会呈现出一个行内css样式,待CSS下载完之后又突然变了一个模样。用户体验可谓极差,而且渲染是有成本的。

如果将css放在头部,css的下载解析是可以和html的解析同步进行的,放到尾部,要花费额外时间来解析CSS,并且浏览器会先渲染出一个没有样式的页面,等CSS加载完后会再渲染成一个有样式的页面,页面会出现明显的闪动的现象。

为什么script要放在尾部?

因为当浏览器解析到script的时候,就会立即下载执行,中断html的解析过程,如果外部脚本加载时间很长(比如一直无法完成下载),就会造成网页长时间失去响应,浏览器就会呈现“假死”状态,这被称为“阻塞效应”。

具体的流程是这样的:

  1. 浏览器一边下载HTML网页,一边开始解析。
  2. 解析过程中,发现script标签
  3. 暂停解析,网页渲染的控制权转交给JavaScript引擎
  4. 如果script标签引用了外部脚本,就下载该脚本,否则就直接执行
  5. 执行完毕,控制权交还渲染引擎,恢复往下解析HTML网页

外链的script包含async或者defer如何处理?

这两个属性只是script标签在header标签中使用的,如果你把它放在body后面是无效的。

script 的这两个属性主要用于其js文件没有操作DOM的情况,这时候就可以将该js脚本设置为异步加载,通过asyncdefer来标记代码。

asyncdefer的区别:

0、asyncdefer都仅对外部脚本有效,对于内置而不是连接外部脚本的script标签,以及动态生成的script标签不起作用。

1、asyncdefer虽然都是异步的,不过使用async标志的脚本文件一旦加载完成就会立即执行;而使用defer标记的脚本文件,会在 DOMContentLoaded 事件之前(也就是页面DOM加载完成时)执行。

2、如果有多个js脚本文件,async标记不保证按照书写的顺序执行,哪个脚本先下载结束,就先执行那个脚本。而defer标记则会按照js脚本书写顺序执行。

3、一般来说,如果脚本之间没有依赖关系,就使用async属性,如果脚本之间有依赖关系,就使用defer属性。如果同时使用asyncdefer属性,后者不起作用,浏览器行为由async属性决定。

对于async标记,浏览器的解析过程是这样的:

  • 浏览器开始解析HTML网页
  • 解析过程中,发现带有async属性的script标签
  • 浏览器继续往下解析HTML网页,同时并行下载script标签中的外部脚本
  • 脚本下载完成,浏览器暂停解析HTML网页,开始执行下载的脚本
  • 脚本执行完毕,浏览器恢复解析HTML网页

对于defer标记,浏览器的解析过程是这样的:

  • 浏览器开始解析HTML网页
  • 解析过程中,发现带有defer属性的script标签
  • 浏览器继续往下解析HTML网页,同时并行下载script标签中的外部脚本
  • 浏览器完成解析HTML网页,此时再执行下载的脚本

由于使用了asyncdeferscript会放在header中,而header又会存在外链css,那么二者有顺序要求吗?

headerscript和外链css的位置顺序

其实js的执行是依赖css样式的。即只有css样式全部下载完成后才会执行js。

因为如果脚本的内容是获取元素的样式,宽高等CSS控制的属性,浏览器是需要计算的,也就是依赖于CSS。浏览器无法感知脚本内容到底是什么,为避免样式获取错误,因而只好等前面所有的样式下载完后,再执行JS。
也就是说,如果有外链css,那么js的执行时需要等待外链css下载完。

根据一些网友的评论与反馈,然后查了一些资料,暂时得出的结论如下:

由于现代浏览器很聪明会进行 prefetch 优化,就如 Chrome 浏览器,它会在解析 HTML 时收集外链,并在后台并行下载,由于会并行下载,那么head中外链jscss的位置其实就没有什么很大影响了。

AMEsim(Advanced Modeling Environment for Simulation)是一款强大的多领域系统建模和仿真软件,广泛应用于机械、电气、热能、流体、控制等多个工程领域。它提供了直观的图形化用户界面和丰富的模型库,使得用户无需深入编程即可进行复杂的系统仿真。在"AMEsim中文手册"中,你可以找到关于如何使用AMEsim进行建模和仿真的详细指导。以下是一些关键知识点:1. **工作空间**:在AMEsim中,工作空间是用户管理和组织模型、数据和结果的地方。你可以在这里创建、打开、保存和管理模型文件,同时查看和编辑模型参数。工作空间的熟悉和有效利用对提高工作效率至关重要。2. **模型构建**:AMEsim提供了一种拖拽式建模方式,用户可以从模型库中选择合适的组件,通过连接线来建立系统的物理关系。模型库涵盖了各种工程领域的模型,如机械、电气、热力学等,这使得跨学科的系统仿真变得简单。3. **MATLAB接口**:AMEsim可以与MATLAB无缝集成,允许用户在MATLAB环境中调用AMEsim进行仿真,或者在AMEsim中调用MATLAB函数进行计算。这种接口为用户提供了更灵活的建模和数据分析能力,特别是在处理复杂算法或后处理时。4. **实例教程**:手册中的实例部分是学习AMEsim的重要资源。通过实际操作这些示例,用户可以理解如何应用AMEsim解决具体问题,从基础模型到复杂的系统,一步步提升建模技能。5. **仿真控制**:在AMEsim中,你可以设定仿真时间范围、步长、初始条件等参数,以满足不同仿真需求。此,还有各种控制选项,如事件检测、中断条件等,用于精确控制仿真过程。6. **结果分析**:完成仿真后,AMEsim提供了丰富的结果可视化工具,包括曲线图、图表、动画等,帮助用户理解和分析仿真结果。用户还可以导出数据进行进一步的分析或与其他软件进行数据交换。7. **参数优化**:AMEsim支持参数扫描和优化功能,允许用户自动寻找最佳设计参数,这对于设计优化和系统性能评估非常有用。8. **用户自定义**:除了内置的模型库,AMEsim还允许用户创建自己的模型或子系统,这极大地扩展了软件的应用范围,并且能够满足特定项目的需求。9. **多物理场耦合**:AMEsim的强大之处在于其处理多物理场耦合的能力。它可以模拟不同领域之间的相互作用,例如机械系统与电气系统的交互,流体动力学与热力学的结合等。10. **教育与研究**:AMEsim不仅适用于工业界,也是教学和研究的理想工具。其易用性和强大的功能使其成为工程教育中的重要辅助工具,帮助学生理解和掌握系统建模与仿真。"AMEsim中文手册"是学习和掌握这款强大仿真软件的关键资源,无论你是初学者还是经验丰富的用户,都可以从中获取宝贵的知识和实践经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值