文章来聊聊浏览器到底是如何对待下载资源的,比如说 JS、CSS、字体、图片等文件。
CSS、JS 文件冤家路窄
HTML 在解析的过程中遇到同步的 script 会卡住 DOM 解析这个知识点我相信读者们应该都知道。
<!DOCTYPE html> <html lang="en"> <body> <script>console.log(1)</script> <div>1</div> </body> </html>
上述代码中,HTML 遇到 <script>console.log(1)</script> 代码就会停止 DOM 解析了。当然现代浏览器不是说就这样停住啥也不干了,会有个 preload scanner 去扫描底下的文件,然后根据文件类型去制定优先级(这个下面再说)。
上面举得例子是内联代码,如果是一个 JS 文件的话,那么就得等这个 JS 文件下完以后执行代码才行。
但是一般我们文件结构不会那么单一,CSS 文件也肯定是有的。因为 JS 不仅能动 DOM 也能改 style,所以如果遇到 script 之前还有别的 CSS 文件的话,浏览器还得等 CSS 文件下完以后再去执行 JS。
所以说不只是 JS 会阻塞 DOM 解析,CSS 也会。
当然我想现在应该很少再有人直接写同步的 script 了吧。
文件同时遇到,那会同时开始下载嘛?
举个例子,在可以同时下载多个文件的情况下,浏览器在 HTML、CSS 文件中解析到了 img、font、background-image 资源,那么们会同时开始下载嘛?
答案是不会!
这里只有 img 会最先开始下载,其它两块内容都得等到 layout 以后才会开始下载。不信的话我们来看图:
这里以 font 为例
图中右下角框出来的是字体文件,上面是 CSS 文件,字体是从 CSS 文件中得知需要去加载的。
大家可以在图中发现 CSS 文件早早开始下载解析了,但是 font 文件迟迟未开始下载,直到 FP 指标即将出现的时候才开始下载动作,这个时间点是在 layout 完成以后。
图中是以掘金为例,大家可以多试试别的网站,应该能发现是符合预期的。
那么读者可能会有个疑问,按照这个逻辑意思是说能用 img 的都用 img,因为background-image 不是马上开始下载的?道理是这个道理,但是还是得分情况来说,如果图片出现的位置不是首屏,用 background-image 也没啥问题,当然给 img 用上懒加载也能解决问题。
那么到底文件的优先级是如何的?
如果大家有使用过 Performance 测试网站性能的话,可以在 Network 那栏里 hover 下载的资源,此时你能发现资源有优先级的显示。
从图中大家可以发现 CSS 和字体资源的优先级的最高的,JS 文件有高有低(这和类型有关),图片、svg 的优先级为低。
这部分的优先级是指某个时间点上的优先级,而不是适应于整个周期。对于 CSS 文件优先级最高还是挺好理解的,毕竟 JS 文件依赖于 CSS 文件,更加详细的内容大家可以参考 从Chrome源码看浏览器如何加载资源 中的「3. 资源优先级」内容。
网络协议才是最大元凶
浏览器要下载资源,TCP 协议肯定得用上,但是 TCP 协议天生就是一个慢的东西。
先得握手,然后慢开始算法,就和我们用迅雷下载东西一样,带宽很大没用,速度都是得爬升上去的。如果再加个 HTTPS 的话,还得再多个 TLS 的握手。
然后说回 HTTP1.1 协议。Chrome 只支持同个 domain 同时并发 6 个请求,所以在之前的协议中一堆请求都得 block 住等之前的下载完成。
当然现在不同了,HTTP2 的概念基本大家都知道了,没见过猪跑但吃过猪肉,对于这块的知识点聊上几句没啥问题。什么多路复用,header 合并、二进制帧啥的。
得利于 HTTP2 协议中的多路复用,我们不再被浏览器的六个并发所限制,所有同一个 domain 上的请求都能跑在复用的六个网络通道上,下载耗时瞬间减少了几个量级,但是大家有没有考虑过这个 HTTP2 到底是如何对待这些资源的?
如何分配它们的优先级?依赖?带宽或者别的?毕竟一堆资源占用同一个网络通道,那么到底该谁先下载,谁享有的带宽多点都是需要协调的。否则假如一堆图片占用了大部分带宽,其他 CSS、JS 文件下的很慢的话,就会影响整个网页的性能了。
比如说我现在需要下载 CSS、JS、图片和字体这些文件。举个例子在这些文件中我希望 CSS 文件能最先开始下载,并且能分配到的带宽多点;JS 文件呢可以等 CSS 文件下完再去下;其他文件呢优先级比 CSS 文件低点,但是也能够享受到带宽去进行下载。
这个需求我们可以通过二进制帧去实现。HTTP2 协议共存在十个二进制帧,其中你可以通过 HEADERS 帧分配新的优先级,也可以通过 PRIORITY 帧更改优先级。
对于流的优先级,我们可以通过两个方式来实现调整:
如图所示(丑了点)。第一排的文件开始一起下载,weight 相加为 20,那么通过计算可得 CSS 文件享有带宽的一半,其他各占有 1 / 4,JS 文件得等 CSS 完成以后才开始。
那么该如何设置这些东西呢?当然得服务端支持啦,一般都指 CDN 服务商了。
最后
查找了很多资料,如有遗漏,还请见谅。文中如果有误,还望及时指出,感谢
AVAWEB 文件上传及下载,JAVA大文件上传,大文件下载解决方案,JAVA实现文件分片上传并且断点续传,JAVA大文件分片上传/多线程上传功能,超大文件上传和断点续传的控件,JAVA实现浏览器端大文件分片上传,JAVA实现大文件上传,JAVA WEB 实现文件上传和下载接口功能,
百度webuploader上传文件到服务器指定文件夹问题,webuploader上传文件到服务器指定文件夹问题,JSP上传文件到服务器指定文件夹问题,JAVA上传大文件实现源代码,JAVA上传大文件实现源码,JAVA上传大文件实现代码,JAVA上传大文件实现技巧,JAVA上传大文件实现技术,JAVA上传大文件实现思路,JAVA上传大文件实现解决方案,
前端上传大文件实现方案,js上传大文件实现方法,JavaScript上传大文件实现方法,vue上传大文件实现方法,前端上传大文件实现方法,html上传大文件实现方法,html5上传大文件实现方法,百度webuploader上传大文件实现方法,webuploader上传大文件实现方法,JAVA上传大文件实现方法,
大文件上传的话基本上都是分片来传,网上很多文章讲的不能说乱七八糟只能说完全没用。
JAVA的话主要是负责后端的接口,业务逻辑,功能的实现,比如文件初始化,文件分块,文件块合并,文件信息的查询等。
客户这个项目跟了很长时间了,大概有2年了。实际上客户并不在意使用哪种技术
文件比较大,有50G左右,用户希望能够在网页里面直接上传,一期的时候我们是直接用的HTML5的API,也就是chrome提供的API来做的,但是上线后用户反馈不是特别的好用,用户那边有些电脑用的是WIN7+IE9,chrome的API在ie9里面不支持。但是用户系统是支持的,这就把人整的有点不会了。二期的时候我们还是定制开发了,
前端用了JSP,VUE2,VUE3,后端用了JSP,SpringBoot,IDE用了Eclipse,MyEclipse,因为新项目和老项目都用了两种IDE。
用户要求能够在网页上面上传文件夹,文件夹里面大约有1万多个文件,有大有小,大的有1G~10G,小的有几MB,文件夹上传的时候需要保存层级结构,同时能够将层级结构信息保存到数据库中,同时还需要支持文件夹下载,下载下来的文件夹要和上传的文件夹层级结构一模一样。客户每天都会传输一些资料,功能这块使用频率非常高。
要求支持断点续传,支持进度信息离线存储,用户可能传一半没有传完,下班了,明天上班后继续上传,电脑晚上到点需要关机,支持加密传输,支持国密加密算法SM4,要求支持下载,支持非打包方式下载,浏览器要求支持包含IE在内的所有浏览器,
系统环境要求支持信创国产化,比如银河麒麟,中标麒麟,统信UOS,龙芯,数据库支持MySQL,Oracle,达梦数据库,人大金仓,需要提供前端源码,后端源码,控件源码,公司自己的项目,也有自己的产品,后续需要集成使用,
要求提供7*24小时技术支持服务,提供文档教程,视频教程,远程技术指导,1对1技术支持服务,提供手机,微信,QQ,邮箱,企业微信等联系方式。导入项目:
导入到Eclipse:http://www.ncmem.com/doc/view.aspx?id=9da9c7c2b91b40b7b09768eeb282e647
导入到IDEA:http://www.ncmem.com/doc/view.aspx?id=9fee385dfc0742448b56679420f22162
springboot统一配置:http://www.ncmem.com/doc/view.aspx?id=7768eec9284b48e3abe08f032f554ea2
下载示例:
https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.40/
工程
NOSQL
NOSQL示例不需要任何配置,可以直接访问测试
创建数据表
选择对应的数据表脚本,这里以SQL为例
修改数据库连接信息
访问页面进行测试
文件存储路径
up6/upload/年/月/日/guid/filename
相关问题:
1.javax.servlet.http.HttpServlet错误
2.项目无法发布到tomcat
3.md5计算完毕后卡住
4.服务器找不到config.json文件
相关参考:
文件保存位置
源码工程文档:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra
源码报价单:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl
OEM版报价单:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a
控件源码下载:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
首先我们看看效果:
实现这样的功能需要学习以下几点内容。
1.认识<img/><map><area/></map>基本结构
首先复制一个html框架,命名为“图片区域链接.html”,示例代码如下:
<!DOCTYPE HTML>
<html>
<head>
<title>图片区域链接</title>
<meta charset="utf-8">
</head>
<body>
</body>
</html>
向<body></body>中添加<img><map><area/></map>基本结构,示例代码如下:
<body>
<img/>
<map>
<area/>
</map>
</body>
指定要添加区域链接的图片的路径,如下:
<img src="img/image1.jpg"/>
<map>
<area/>
</map>
让<img>标签通过<map>的名字来驱使<map>为自己工作。
需要两步,第一,给<map>起名字,name=“map”,为了兼容所有的浏览器,还要加上id=“map”(有的浏览器只认id)。
第二,让<img>叫出<map>的名字或id,usemap="#map"。大家要注意,叫名字时要加#。这个在之前的教程中也经常出现。
示例代码如下:
<img src="img/image1.jpg" usemap="#map"/>
<map name="map" id="map">
<area/>
</map>
下面来划分区域。
2.为图片划分区域的方法
<area>是用来划分区域的标签,area也是“”区域“”的意思。
默认的shape(形状)属性有“矩形(rect)”、“圆形(circ)”、“多边形(poly)”三个值。
分别添加三个形状,示例代码如下:
<img src="img/image1.jpg" usemap="#map"/>
<map name="map" id="map">
<area shape="rect"/>
<area shape="circ"/>
<area shape="poly"/>
</map>
下面我们就要为区域规定参数,也就是在图像上的位置和范围大小。
为<area>添加coords属性可以指定区域的位置和范围。
如果shape="rect" 则coords由四个参数组成。例如coords="0,0,50,50"。从左到右,两两一组,组成两个平面坐标,即(0,0)和(50,50),单位是“像素”,矩形区域如下:
如果shape=“circ”,coords=“50,50,10”。(50,50)定义了圆心,10是半径。如图:
如果shape=“poly”,coords的参数不少于3对!注意是“对”!从左到右,两个数就是一组坐标,三组坐标可以确定一个三角形,多组坐标可以确定多边形。例如
这组参数画出了下图中歼20的边框线(600像素*400像素,如果图像的长宽像素数变了,参数就不正确了),如图:
这时,大家会有一个问题:如何才能知道图像中某个像素点的坐标呢?
3.使用Gimp软件精准定位图片区域
使用Gimp软件可以解决这个问题。
Gimp是一款类似于Photoshop的数字图像处理软件,不同的是,Gimp是开源免费的。
下载地址:https://www.gimp.org/
双击安装即可,注意选择一下安装目录。
完成安装之后打开,界面如下:
点击“文件”找到“打开”:
选择要打开的图片名字:
点击名称后,右边会有图像预览,点击“打开”即可:
打开后如图:
把鼠标放到图像的任意位置,看左下角:
这里就会显示我们鼠标所在的像素坐标数值。
这样我们就能方便地写“poly”的coords了。
请在空闲时找一张图片演练一下吧!
4.为区域添加链接
在<area/>标签中添加href属性即可指定链接路径,如下:
href="https://www.zhihu.com/question/284642168"
添加title属性可以在鼠标滑过链接区域时提示读者,如下:
title="歼20气动外形分析"
今天的内容结束了,图像区域链接在使用时还有一些注意事项,我们下次再详细讨论。
使用碎片时间,学习完整知识!关注大鱼师兄,一起精研技艺。
HTML序章(学习目的、对象、基本概念)——零基础自学网页制作
HTML是什么?——零基础自学网页制作
第一个HTML页面如何写?——零基础自学网页制作
HTML页面中head标签有啥用?——零基础自学网页制作
初识meta标签与SEO——零基础自学网页制作
HTML中的元素使用方法1——零基础自学网页制作
HTML中的元素使用方法2——零基础自学网页制作
HTML元素中的属性1——零基础自学网页制作
HTML元素中的属性2(路径详解)——零基础自学网页制作
使用HTML添加表格1(基本元素)——零基础自学网页制作
使用HTML添加表格2(表格头部与脚部)——零基础自学网页制作
使用HTML添加表格3(间距与颜色)——零基础自学网页制作
使用HTML添加表格4(行颜色与表格嵌套)——零基础自学网页制作
16进制颜色表示与RGB色彩模型——零基础自学网页制作
HTML中的块级元素与内联元素——零基础自学网页制作
初识HTML中的<div>块元素——零基础自学网页制作
在HTML页面中嵌入其他页面的方法——零基础自学网页制作
封闭在家学网页制作!为页面嵌入PDF文件——零基础自学网页制作
HTML表单元素初识1——零基础自学网页制作
HTML表单元素初识2——零基础自学网页制作
HTML表单3(下拉列表、多行文字输入)——零基础自学网页制作
HTML表单4(form的action、method属性)——零基础自学网页制作
HTML列表制作讲解——零基础自学网页制作
为HTML页面添加视频、音频的方法——零基础自学网页制作
音视频格式转换神器与html视频元素加字幕——零基础自学网页制作
HTML中使用<a>标签实现文本内链接——零基础自学网页制作
*请认真填写需求信息,我们会在24小时内与您取得联系。