Ⅰ 前端渲染是静态页面吗
渲染。。。是从后台获取到数据后渲染到页面显示。。。。这个不是静态页面吧
Ⅱ 渲染的工作流程
前端web页面的渲染流程
1、构建DOM与 CSSOM
浏览器通过http请求,获得静态资源后,进行页面渲染时,构建dom与cssom是同时进行的。
html 构建dom
构建dom时,按照html页面中标签的顺序,由上向下渲染。
css 构建cssom
html构建cssom的同时,将css样式构建为cssom
2、渲染树 Render Tree
该过程中DOM与CSSOM合并,生成渲染树,树中包含了渲染页面所需要的节点。
3、布局Layout
计算出每个节点对象的精确位置和大小
4、绘制Paint
使用上面准备好的节点信息,绘制出页面
javascript
我们看到,在构建DOM和CSSOM阶段,会有javascript进入
1、当浏览器遇到一个 script 标记时,DOM 构建历贺肢拍慧将暂停,直至脚本完成执行。
2、JavaScript 可以查询和修改 DOM 与 CSSOM。
3、JavaScript 执行将暂停,直至肢世 CSSOM 就绪。
————————————————
原文链接: https://blog.csdn.net/_30891377/article/details/106313534
Ⅲ “Android渲染”图像是怎样显示到屏幕上的
我们每天花很多时间盯着手机屏幕,不知道你有没有好奇过:
这时候来了一位Android程序员(当然也可以是iOS或者是前端程序员)说: 这里显示的其实是一个View树,我们看到的都是大大小小的View。
。。。听起来很有道理,我们也经常指着屏幕说这个View怎么怎么样,可问题又来了:
程序员老兄又来了: 屏幕当然不能识别View,它作为一个硬件,只能根据收到的数据改变每个像素单元的数据,这样整体来看,用户就发现屏幕上的内容变化了。至于View的内容是如何一步一步转化成屏幕可是识别的数据的,简单讲可以分成三步:
。。。听起来很有道理,可问题又来了:
那可就说来话长了。。。
对于 measure layout 和 draw ,Android工程师(大都)非常熟悉,我们常常在执行了 onDraw() 方法后,一个让人自豪的自定义View就显示出来了。在实际的Android绘制流程中,第一步就是通过 measure layout 和 draw 这些步骤准备了下面的材料:
在清芹Android的绘制中,我们使用Canvas API进行来告诉表示画的内容,如 drawCircle() drawColor() drawText() drawBitmap() 等,也是这些内容最终呈现在屏幕上。
在当前应用中,View树中所有元素的材料最终会封装到 DisplayList 对象中(后期版本有用 RenderNode 对 DisplayList 又做了一层封装,实现了更好的性能),然后发送出去,这样第一阶段就完成了。
当然就有一个重要的问题:
会将Bitmap复制到下一个阶段(准确地讲就是复制到GPU的内存中)。
现在大多数设备使用了GPU硬件加速,而GPU在渲染来自Bitmap的数据时只能读取GPU内存中的数据, 所以需要赋值Bitmap到GPU内存,这个阶段对应的名称叫 Sync&upload 。另外,硬件加速并不支持所有Canvas API,如果自定义View使用了不支持硬件加速的Canvas API(参考 Android硬件加速文档 ),为了避免出错就需要对View进行软件绘制,其处理方式就是生成一个Bitmap,然后复制到GPU进行处理。
这时可能会有问题:如果Bitmap很多或者单个Bitmap尺寸很大,这个过程可能会时间比较久,那有什么办法吗?
当然有(做作。。。)
关于Bitmap这里再多说一句:
Bitmap的内存管理一直是Android程序员很关心的问题,毕竟它是个很占内存的大胖子,在Android3.0~Android7.0,Bitmap内存放在Java堆中,而android系统中每个进程的Java堆是有严格限制的,处理不好这些Bitmap内存,容易导致频繁GC,甚至触发Java堆的 OutOfMemoryError 。从Android8.0开始,bitmap的像素数据放入了native内存,于是Java Heap的内存问题暂时缓解了。
Tip:
现在材料已经备好,我们要真正地画东西了。
接下来就要把东西画出来了,画出来的过程就是把前面的材料转化成一个堆像素数据的过程,也叫 栅格化 ,那这个活儿谁来干呢?
候选人只有两个:
大拍正厅部分情况下,都是GPU来干这个活儿,因为GPU真的特别快!!!
所谓的“画”,对于计算机来讲就是处理图像,其实就是根据需要(就是DisplayList中的命令)对数据做一些特定类型的数学运算,最后输出结果的过程。我们看到的每一帧精美界面,(几乎)都是GPU吭哧吭哧"算"出来的,这个就有疑问了:
我们简单地聊聊CPU与GPU的区别:
CPU的核心数通常是几个,单个核心的主频高,功能强大,擅长串行处理复杂的流程;
GPU ( Graphics Processing Unit ) 有成百上千个核心,单个核心主频低,功能有限,擅长(利用超多核心)大量并行简单运算;正如它的名字一样,GPU就是为图像绘制这个场景量身定做的硬件(所以使用GPU也叫硬件加速),后来也被用到挖矿和神经网络中。
图袭隐片肯定没有视频直观,我们从感性的角度感受一下GPU到底有多快,我想下面的视频看过就不会忘掉,你会被GPU折服:
Mythbusters Demo GPU versus CPU
看这个视频,我们对于“加速”应该有了更深刻的印象,这里不再进一步分析CPU和GPU更微观的差别(因为不懂),我想已经讲明白为什们GPU更快了。
另外,在GPU开始绘制之前,系统也做了一些优化(对DisplayList中的命令进行预处理),让整个绘制流程更加高效:
第二步的具体过程还是很复杂的,比如涉及到Alpha绘制,相关的优化会失效,详情查看文章 为什么alpha渲染性能低 .
至于画在哪里,我们现在理解为一个缓冲(Buffer)中就可以了,具体的机制放在第三步讲。
到此,我们已经画(绘制)完了图像内容,把这个内容发送出去,第二步的任务就完成了。
Tip:
我们知道,除了我们的应用界面,手机屏幕上同时显示着其他内容,比如SystemUI(状态栏、导航栏)或者另外的悬浮窗等,这些内容都需要显示到屏幕上。所以要先 把这些界面的内容合成,然后再显示到屏幕 。
在讲合成图像之前,我们有必要知道这些界面图像(Buffer)是怎么传递的:
Android图形架构中,使用生产者消费者模型来处理图像数据,其中的图像缓冲队列叫 BufferQueue , 队列中的元素叫 Graphic Buffer ,队列有生产者也有消费者;每个应用通常会对应一个 Surface ,一个 Surface 对应着一个缓冲队列,每个队列中 Graphic Buffer 的数量不超过3个, 上面两步后绘制的图像数据最终会放入一个 Graphic Buffer ,应用自身就是队列的生产者( BufferQueue 在Android图形处理中有广泛的应用,当前只讨论界面绘制的场景)。
每个 Graphic Buffer 本身体积很大,在从生产者到消费者的传递过程中不会进行复制的操作,都是用匿名共享内存的方式,通过句柄来跨进程传递。
我们可以通过以下命令来查看手机当前用到的 Graphic Buffer 情况:
关于上面的命令,你可能会好奇这个 SurfaceFlinger 是什么东西啊?
上文提到过每个应用(一般)对应一个 Surface ,从字面意思看, SurfaceFlinger 就是把应用的 Surface 投射到目的地。
实际上, SurfaceFlinger 就是界面(Buffer)合成的负责人,在应用界面绘制的场景, SurfaceFlinger 充当了 BufferQueue 的消费者。绘制好的 Graphic Buffer 会进入(queue)队列, SurfaceFlinger 会在合适的时机(这个时机下文讨论),从队列中取出(acquire)Buffer数据进行处理。
我们知道,除了我们的应用界面,手机屏幕上同时显示着其他内容,比如SystemUI(状态栏、导航栏)或者另外的悬浮窗等,这些部分的都有各自的Surface,当然也会往对应的 BufferQueue 中生产 Graphic Buffer 。
如下图所示, SurfaceFlinger 获取到所有Surface的最新Buffer之后,会配合HWComposer进行处理合成,最终把这些Buffer的数据合成到一个 FrameBuffer 中,而FrameBuffer的数据会在另一个合适的时机(同样下文讨论)迅速地显示到屏幕上,这时用户才观察到屏幕上的变化。
关于上图中的 HWComposer ,它是Android HAL接口中的一部分,它定义了上层需要的能力,让由硬件提供商来实现,因为不同的屏幕硬件差别很大,让硬件提供商驱动自己的屏幕,上层软件无需关心屏幕硬件的兼容问题。
事实上,如果你观察足够仔细的话,可能对上图还有疑问:
同学你观察很仔细(...),事实上,这是 SurfaceFlinger 合成过程中重要的细节,对于不同 Surface 的Buffer, 合成的方法有两种:
显然第一种方法是最高效的,但为了保证正确性,Android系统结合了两种方法。具体实现上, SurfaceFlinger 会询问( prepare ) HWComposer 是否支持直接合成,之后按照结果做对应处理。
有的朋友憋不住了:
Good question! (太做作了。。。)
为了保证最好的渲染性能,上面各个步骤之间并不是串行阻塞运行的关系,所以有一个机制来调度每一步的触发时机,不过在此之前,我们先讲介绍一个更基础的概念:
屏幕刷新率
刷新率是屏幕的硬件指标,单位是Hz(赫兹),意思是屏幕每秒可以刷新的次数。
回到问题,既然屏幕这个硬件每隔一段时间(如60Hz屏幕是16ms)就刷新一次,最佳的方案就是屏幕刷新时开始新一轮的绘制流程,让一次绘制的流程尽可能占满整个刷新周期,这样掉帧的可能性最小。基于这样的思考,在Android4.1(JellyBean)引入 VSYNC(Vertical Synchronization - 垂直同步信号)
收到系统发出的VSYNC信号后, 有三件事会同时执行(并行) :
下图描述了没有掉帧时的VSYNC执行流程,现在我们可以直接回答问题了: 合适的时机就是VSYNC信号 。
从上图可以看出,在一次VSYNC信号发出后,屏幕立即显示2个VSYNC周期(60Hz屏幕上就是32ms)之前开始绘制的图像,这当然是延迟,不过这个延迟非常稳定, 只要前面的绘制不掉链子 ,界面也是如丝般顺滑。当然,Android还是推出一种机制让延迟可以缩小到1个VSYNC周期,详情可参考 VSYNC-offset 。
实际上,系统只会在需要的时候才发出VSYNC信号,这个开关由SurfaceFlinger来管理。应用也只是在需要的时候才接收VSYNC信号,什么时候需要呢?也就是应用界面有变化,需要更新了,具体的流程可以参考 View.requestLayout() 或 View.invalidate() 到 Choreographer (编舞者)的调用过程。这个过程会注册一次VSYNC信号,下一次VSYNC信号发出后应用就能收到了,然后开始新的绘制工作;想要再次接收VSYNC信号就需要重新注册,可见,应用界面没有改变的时候是不会进行刷新的。
我们可以看到,无论是VSYNC开关,还是应用对VSYNC信号的单次注册逻辑,都是秉承着按需分配的原则,这样的设计能够带来Android操作系统更好的性能和更低的功耗。
Tip:
终于。。。说完了
我们简单回顾一下,
更形象一点就是:
之所以有这一节,是因为随着Android版本的更替,渲染方案也发生了很多变化。为了简化表达,我们前文都以当前最新的方案来讲解,事实上,部分流程的实现方式在不同版本可能会有较大的变化,甚至在之前版本没有实现方案,这里我尽可能详细地列出Android版本更迭过程中与渲染相关的更新(包括监控工具)。
如果你居然能读到这里,那我猜你对下面的参考文章也会感兴趣:
https://source.android.com/devices/graphics
https://hencoder.com/tag/hui-/
https://www.youtube.com/watch?v=wIy8g8yNhNk&feature=emb_logo
https://www.youtube.com/watch?v=v9S5EO7CLjo
https://www.youtube.com/watch?v=zdQRIYOST64&t=177s
https://www.youtube.com/watch?v=we6poP0kw6E&index=64&list=
https://developer.android.com/topic/performance/rendering
https://developer.android.com/guide/topics/graphics/hardware-accel
https://developer.android.com/topic/performance/rendering/profile-gpu#su
https://mp.weixin.qq.com/s/0OOSmrzSkjG3cSOFxWYWuQ
Android Developer Backstage - Android Rendering
Android Developer Backstage - Graphics Performance
https://elinux.org/images/2/2b/Android_graphics_path--chis_simmonds.pdf
Ⅳ app如何查看前端渲染时间记录
app查看前端渲染时间记录步骤如下:
1、打开开发者工具。
2、找到Performance,点击录制按钮。
3、F5刷新页面,点击关闭录制(同录滚闹制按钮)。
4、帆滚找到Summary(console只上偏大轿罩中部左侧位置)。
Ⅳ 华为webview有什么用渲染
webview渲染的作用是:webview可以内嵌在移动端,实现前端的混合式开发,大多数混合式开发框架都是基于webview模式进行二次开发的。webview可以直接使用html文件(网络上或本地assets中)作布局,可和JavaScript交互调用。webview是一个基于webkit的引擎。
一、webview基本介绍
webview 是一个基于webkit的引擎,可以解析DOM 元素,展示html页面的控件,它和浏览器展示页面的原理是相同的,所以可以把它当做浏览器看待。(chrome浏览器也是基于webkit引擎开发的,Mozilla浏览器是基于Gecko引擎开发的)
二、使用webview的好处
原生APP是将页面的布局设计,以及业务代码打包然后用户下载安装使用,而webview是通过加载html文件来进行页面的展示,当需要更新页面的布局或者业务逻辑变更时,如果是原生的APP就需要修改前端内容,升级打包,重新发布才可以使用最新蚂迅的。
而通过webview方式的页面则只需要修改html代码或者js文件(如果是从服务器端获取,只要新的文件部署完成),用户重新刷新就可以使用更新后的,无需通过下载安装的方式完成升级。
三、webview渲染的作用
webview渲染是用于展现web页面的控件。webview可以内嵌在移动端,实现前端的混合式开发,大多数混合式开发框架都是基于webview模式进行二次开发的。
webview可以直接使用html文件(网络上或本地assets中)作布局,可和JavaScript交互调用。webview控件功能强大,除了具有一般View的属性和设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理。
webview是chrome浏览器的内核,所有腊物州安卓手机必须预装,用于显示网页,手机的APP可以调用它显示网页而不需要浏览器,升级以提升系统整体集成应用的网页性能。此应用缺失会导致手机功能故障。
海报分享
收藏
0
0
行业动态
后端技术栈有哪些
2022-12-22 16:40:00
行业动态
什么是业务层
2022-12-22 17:20:00
0 条回复
A
文章作者
M
管理员
您必须登录或注册以后才能发表评论
登录轮蔽
欢迎您,新朋友,感谢参与互动!
确认修改
称呼
邮箱
说说你的看法
提交
暂无讨论,说说你的看法吧
标签
google Google SEO NFT seo tiktok 互联网+ 亚马逊 亚马逊网络 倪叶明 创业 创业商机 副业 副业赚钱 副业项目 加盟代理 地摊创业 域名 小程序 小红书 工具类 常识 开店指南 抖音 抖音小店 抖音带货 抖音电商 招商加盟 推广 教程 新视点 海外赚钱 独立站 网络 直播带货 短视频 网络创业 老李谈销售 营销推广 行业报告 视频号 谷歌seo 财税代账 赚钱 跨境电商 门路
Copyright © 2023 水源智库
查询 97 次,耗时 1.0783 秒
首页
专题
圈子
Ⅵ 前端大量数据一次渲染的写法
您好,前端大量数据一次渲染的写法主要有以下几种:
1. 使用懒加载:懒加载可以有效地减少页面渲染时间,只有当用户滚动到特定位置时,才会加载需要渲染的数据,从而减少页面渲染时间。
2. 使用分页:分页可以有效地减少页面渲染时间,只有当用户滚动到特定位置时,才会加载需要渲染的数据,从而减少页面渲染时间。
3. 使用缓存:缓存可以有效地减少页面渲染时间,只有当用户滚动到特定位置时,才会加载需要渲染的数据,从而减少页面渲染时间。
4. 使用算法:使用算法可以有效地减少页面渲染时间,只有当用户滚动到特定位置时,才会加载需要渲染的数据,从而减少页面渲染时间。
5. 使用延迟加载:延迟加载可以有效地减少页面渲染时间,只有当用户滚动到特定位置时,才会加载需要渲染的数据,从而减少页面渲染时间。
Ⅶ 最全从输入URL到浏览器显示页面都发生了什么前端浏览器渲染流程
首先了解一下URL的组成:
从上面的URL可以看出,一个完整的URL包括以下几部分:
1、协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符
2、域名部分:该URL的域名部分为“www..com”。一个URL中,也可以使用IP地址作为域名使用
3、端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口80
4、虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”
5、文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名
6、锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分
7、参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。
很多大公司面试喜欢问这样一道面试题, 输入URL到看见页面发生了什么? ,今天我们来总结一下。 简单来说,共有以下几个过程
下面我们来看看具体的细节
输入 www.google.com 网址后,首先在本地的域名服务器中查找,没找到去根域名服务器查找,没有再去 com 顶级域名服务器查找,,如此的类推下去,直到找到IP地址,然后把它记录在本地,供下次使用。大致过程就是 . -> .com -> google.com. -> www.google.com. 。 (你可能觉得我多写 .,并木有,这个.对应的就是根域名服务器,默认情况下所有的网址的最后一位都是.,既然是默认情况下,为了方便用户,通常都会省略,浏览器在请求DNS的时候会自动加上)
既然已经懂得了解析的具体过程,我们可以看到上述一共经过了N个过程,每个过程有一定的消耗和时间的等待,因此我们得想办法解决一下这个问题!
DNS存在着多级缓存,从离浏览器的距离排序的话,有以下几种: 浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存。
在你的chrome浏览器中输入:chrome://dns/,你可以看到chrome浏览器的DNS缓存。
系统缓存主要存在/etc/hosts(Linux系统)中
检查浏览器是否有缓存
通过 Cache-Control 和 Expires 来检查是否命中强缓存,命中则直接取本地磁盘的html(状态码为200 from disk(or memory) cache,内存or磁盘);
如果没有命中强缓存,则会向服务器发起请求(先进行下一步的TCP连接),服务器通过 Etag 和 Last-Modify 来与服务器确认返回的响应是否被更改(协商缓存),若无更改则返回状态码(304 Not Modified),浏览器取本地缓存;
若强缓存和协商缓存都没有命中则返回请求结果。
不知道你们有没有注意这样一件事,你访问http://.com的时候,每次响应的并非是同一个服务器(IP地址不同),一般大公司都有成百上千台服务器来支撑访问,假设只有一个服务器,那它的性能和存储量要多大才能支撑这样大量的访问呢?DNS可以返回一个合适的机器的IP给用户,例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等,这种过程就是DNS负载均衡
TCP 协议通过三次握手建立连接。
翻译成大白话就是:
为什么是3次? :避免 历史 连接,确认客户端发来的请求是这次通信的人。
为什么不是4次? :3次够了第四次浪费
建立连接的过程是利用客户服务器模式,假设主机A为客户端,主机B为服务器端。
采用三次握手是为了防止失效的连接请求报文段突然又传送到主机B,因而产生错误。失效的连接请求报文段是指:主机A发出的连接请求没有收到主机B的确认,于是经过一段时间后,主机A又重新向主机B发送连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,主机A第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到主机B,主机B以为是主机A又发起的新连接,于是主机B同意连接,并向主机A发回确认,但是此时主机A根本不会理会,主机B就一直在等待主机A发送数据,导致主机B的资源浪费。
采用两次握手不行,原因就是上面说的失效的连接请求的特殊情况。而在三次握手中, client和server都有一个发syn和收ack的过程, 双方都是发后能收, 表明通信则准备工作OK.
为什么不是四次握手呢? 大家应该知道通信中着名的蓝军红军约定, 这个例子说明, 通信不可能100%可靠, 而上面的三次握手已经做好了通信的准备工作, 再增加握手, 并不能显着提高可靠性, 而且也没有必要。
第一次握手 :
客户端发送syn包(Seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:
服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(Seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:
客户端收到服务器的SYN ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
要先申请CA证书,并安装在服务器上(一个文件,配置nginx支持监听443端口开启ssl并设置证书路径)
浏览器发送请求;
网站从浏览器发过来的加密规则中选一组自身也支持的加密算法和hash算法,并向浏览器发送带有公钥的证书,当然证书还包含了很多信息,如网站地址、证书的颁发机构、过期时间等。
浏览器解析证书。
验证证书的合法性。如颁发机构是否合法、证书中的网站地址是否与访问的地址一致,若不合法,则浏览器提示证书不受信任,若合法,浏览器会显示一个小锁头。
若合法,或用户接受了不合法的证书,浏览器会生成一串随机数的密码(即密钥),并用证书中提供的公钥加密。
使用约定好的hash计算握手消息,并使用生成的随机数(即密钥)对消息进行加密,最后将之前生成的所有消息一并发送给网站服务器。
网站服务器解析消息。用已有的私钥将密钥解密出来,然后用密钥解密发过来的握手消息,并验证是否跟浏览器传过来的一致。然后再用密钥加密一段握手消息,发送给浏览器。
浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。
发送HTTP请求
首先科补一个小知识,HTTP的端口为80/8080,而HTTPS的端口为443
发送HTTP请求的过程就是构建HTTP请求报文并通过TCP协议中发送到服务器指定端口 请求报文由 请求行 , 请求抱头 , 请求正文 组成。
请求行
请求行的格式为 Method Request-URL HTTP-Version CRLF eg: GET index.html HTTP/1.1 常用的方法有: GET , POST , PUT , DELETE , OPTIONS , HEAD 。
常见的请求方法区别
这里主要展示 POST 和 GET 的区别
常见的区别
注意一点你也可以在GET里面藏body,POST里面带参数
重点区别
GET 会产生一个 TCP 数据包,而 POST 会产生两个 TCP 数据包。
详细的说就是:
注意一点,并不是所有的浏览器都会发送两次数据包,Firefox就发送一次
请求报头
请求报头允许客户端向服务器传递请求的附加信息和客户端自身的信息。
从图中可以看出,请求报头中使用了Accept, Accept-Encoding, Accept-Language, Cache-Control, Connection, Cookie等字段。Accept用于指定客户端用于接受哪些类型的信息,Accept-Encoding与Accept类似,它用于指定接受的编码方式。Connection设置为Keep-alive用于告诉客户端本次HTTP请求结束之后并不需要关闭TCP连接,这样可以使下次HTTP请求使用相同的TCP通道,节省TCP连接建立的时间。
请求正文
当使用POST, PUT等方法时,通常需要客户端向服务器传递数据。这些数据就储存在请求正文中。在请求包头中有一些与请求正文相关的信息,例如: 现在的Web应用通常采用Rest架构,请求的数据格式一般为json。这时就需要设置 Content-Type: application/json 。
更重要的事情-HTTP缓存
HTTP属于客户端缓存,我们常认为浏览器有一个缓存数据库,用来保存一些静态文件,下面我们分为以下几个方面来简单介绍HTTP缓存
缓存的规则
缓存规则分为 强制缓存 和 协商缓存
强制缓存
当缓存数据库中有客户端需要的数据,客户端直接将数据从其中拿出来使用(如果数据未失效),当缓存服务器没有需要的数据时,客户端才会向服务端请求。
又称对比缓存。客户端会先从缓存数据库拿到一个缓存的标识,然后向服务端验证标识是否失效,如果没有失效服务端会返回304,这样客户端可以直接去缓存数据库拿出数据,如果失效,服务端会返回新的数据
强制缓存
对于强制缓存,服务器响应的header中会用两个字段来表明——Expires和Cache-Control。
Expires
Exprires的值为服务端返回的数据到期时间。当再次请求时的请求时间小于返回的此时间,则直接使用缓存数据。但由于服务端时间和客户端时间可能有误差,这也将导致缓存命中的误差,另一方面,Expires是HTTP1.0的产物,故现在大多数使用Cache-Control替代。
Cache-Control
Cache-Control有很多属性,不同的属性代表的意义也不同。
协商缓存
协商缓存需要进行对比判断是否可以使用缓存。浏览器第一次请求数据时,服务器会将缓存标识与数据一起响应给客户端,客户端将它们备份至缓存中。再次请求时,客户端会将缓存中的标识发送给服务器,服务器根据此标识判断。若未失效,返回304状态码,浏览器拿到此状态码就可以直接使用缓存数据了。
对于协商缓存来说,缓存标识我们需要着重理解一下,下面我们将着重介绍它的两种缓存方案。
Last-Modified
Last-Modified:服务器在响应请求时,会告诉浏览器资源的最后修改时间。
从字面上看,就是说:从某个时间节点算起,是否文件被修改了
这两个的区别是一个是修改了才下载一个是没修改才下载。
Last-Modified 说好却也不是特别好,因为如果在服务器上,一个资源被修改了,但其实际内容根本没发生改变,会因为Last-Modified时间匹配不上而返回了整个实体给客户端(即使客户端缓存里有个一模一样的资源)。为了解决这个问题,HTTP1.1推出了Etag。
Etag
Etag:服务器响应请求时,通过此字段告诉浏览器当前资源在服务器生成的唯一标识(生成规则由服务器决定)
但是实际应用中由于Etag的计算是使用算法来得出的,而算法会占用服务端计算的资源,所有服务端的资源都是宝贵的,所以就很少使用Etag了。
缓存的优点
不同刷新的请求执行过程
浏览器地址栏中写入URL,回车
F5
Ctrl+F5
服务器处理请求并返回HTTP报文
它会对TCP连接进行处理,对HTTP协议进行解析,并按照报文格式进一步封装成HTTP Request对象,供上层使用。这一部分工作一般是由Web服务器去进行,我使用过的Web服务器有Tomcat, Nginx和Apache等等 HTTP报文也分成三份, 状态码 , 响应报头 和 响应报文
状态码
状态码是由3位数组成,第一个数字定义了响应的类别,且有五种可能取值:
平时遇到比较常见的状态码有:200, 204, 301, 302, 304, 400, 401, 403, 404, 422, 500
常见状态码区别
200 成功
请求成功,通常服务器提供了需要的资源。
204 无内容
服务器成功处理了请求,但没有返回任何内容。
301 永久移动
请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 临时移动
服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
304 未修改
自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
400 错误请求
服务器不理解请求的语法。
401 未授权
请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 禁止
服务器拒绝请求。
404 未找到
服务器找不到请求的网页。
422 无法处理
请求格式正确,但是由于含有语义错误,无法响应
500 服务器内部错误
服务器遇到错误,无法完成请求。
响应报头
常见的响应报头字段有: Server, Connection...。
响应报文
你从服务器请求的HTML,CSS,JS文件就放在这里面
就是 Webkit 解析渲染页面的过程。
这个过程涉及两个比较重要的概念 回流 和 重绘 ,DOM结点都是以盒模型形式存在,需要浏览器去计算位置和宽度等,这个过程就是回流。等到页面的宽高,大小,颜色等属性确定下来后,浏览器开始绘制内容,这个过程叫做重绘。浏览器刚打开页面一定要经过这两个过程的,但是这个过程非常非常非常消耗性能,所以我们应该尽量减少页面的回流和重绘
这个过程中可能会有dom操作、ajax发起的http网络请求等。
web-socket、ajax等,这个过程通常是为了获取数据
setTimeout、setInterval、Promise等宏任务、微任务队列
当Render Tree中部分或全部元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程称为回流。
会导致回流的操作:
一些常用且会导致回流的属性和方法:
当页面中元素样式的改变并不影响它在文档流中的位置时(例如:color、background-color、visibility等),浏览器会将新样式赋予给元素并重新绘制它,这个过程称为重绘。
JS的解析是由浏览器的JS引擎完成的。由于JavaScript是单线程运行,也就是说一个时间只能干一件事,干这件事情时其他事情都有排队,但是有些人物比较耗时(例如IO操作),所以将任务分为 同步任务 和 异步任务 ,所有的同步任务放在主线程上执行,形成执行栈,而异步任务等待,当执行栈被清空时才去看看异步任务有没有东西要搞,有再提取到主线程执行,这样往复循环(冤冤相报何时了,阿弥陀佛),就形成了Event Loop事件循环,下面来看看大人物
先看一段代码
结果我想大家都应该知道。主要来介绍JavaScript的解析,至于Promise等下一节再说
JavaScript是一门单线程语言,尽管H5中提出了 Web-Worker ,能够模拟实现多线程,但本质上还是单线程,说它是多线程就是扯淡。
既然是单线程,每个事件的执行就要有顺序,比如你去银行取钱,前面的人在进行,后面的就得等待,要是前面的人弄个一两个小时,估计后面的人都疯了,因此,浏览器的JS引擎处理JavaScript时分为 同步任务 和 异步任务
这张图我们可以清楚看到
js引擎存在monitoring process进程,会持续不断的检查主线程执行栈是否为空,一旦为空,就会去Event Queue那里检查是否有等待被调用的函数。 估计看完这些你对事件循环有一定的了解,但是事实上我们看对的没这么简单,通常我们会看到Promise,setTimeout,process.nextTick(),这个时候你和我就懵逼。
不同任务会进入不同的任务队列来执行。 JS引擎开始工作后,先在宏任务中开始第一次循环( script里面先执行,不过我喜欢把它拎出来,直接称其进入执行栈 ),当主线程执行栈全部任务被清空后去微任务看看,如果有等待执行的任务,执行全部的微任务(其实将其回调函数推入执行栈来执行),再去宏任务找最先进入队列的任务执行,执行这个任务后再去主线程执行任务(例如执行```console.log("hello world")这种任务),执行栈被清空后再去微任务,这样往复循环(冤冤相报何时了)
下面来看一段代码
我们看看它的执行情况
具体的执行过程大致就是这样。
Ⅷ 后端渲染html,前端模板渲染html,jquery的html,各有什么区别
对于网页而言者烂枯,无论后端程序是多么的复杂,最终返回给客户端的还是HTML文件。页面渲历罩染模式主要分:服务器端渲染、客户端(前端)渲染。不管哪种渲染模式,其实都是基于模板引擎而言的。
对于普通用户而言,采用哪种渲染模式似乎并不重要,但对于网站架构而言其中区别还是很大的。
服务器端渲染(SSR)
服务器端渲染其实就是服务器端在返回HTML给客户端之前,先将HTML模板上特定区域填充上数据后生成完整的HTML返回给客户端。
此时模板文件存储首洞在服务器端。
1、优点:由服务器端进行数据填充工作,不会影响前端性能(解析模板是有性能开销的)、SEO友好、首屏渲染快;
2、缺点:占用了服务器端运算资源,响应体较大(因为返回的是完整的HTML文本)。
客户端渲染
客户端渲染指的就是借助前端的JavaScript调用后端API来实现页面渲染。前端也是有模板引擎的,而前端模板引擎在填充数据时也是靠JS来操作DOM节点的。
此时模板文件存储在前端。
1、优点:不占用服务器端资源,模板在前端改起来更容易,不用麻烦后端联调;
2、缺点:由前端JS负责数据解析和填充工作,在弱网环境下页面加载时可能会出现乱版现象,渲染起来速度可能会慢一些。另外使用前端渲染很多数据都是动态调用API进行填充的,所以不利于SEO。
以上就是我的观点,对于这个问题大家是怎么看待的呢?欢迎在下方评论区交流~我是科技领域创作者,十年互联网从业经验,欢迎在线咨询Ⅸ scrapy爬取前端渲染页面
ok,现在我们就可以愉快的抓取动态渲染的页面了,溜了。
Ⅹ 客户端渲染和服务端渲染的区别(转)
服务端渲染 :DOM树在服务端生成,然后返回给前端。
客户端渲染 (SSR):前端去后端取数据生成DOM树。
服务端渲染的优点 :
1、尽量不占用前端的资源,前端这块耗时少胡埋,速度快。
2、有利于SEO优化,因为在后端有完整的html页面,所以爬虫更容易爬取信息。
服务端渲染的缺点 :
1、不利于前后端分离,开发的效率降低了。历粗
2、对html的解析,对前端来说加快了速度,但是加大了服务器的压力。
客户端渲染的优点 :
1、前后端分离,开发效率高。
2、用户体验更好,我们将网站做成SPA(单页面应用)或者部分内容做成SPA,当用户点击时,不会形成频繁的跳转。
客户端渲染的缺点 :
1、前端响应速度慢,特别是首屏,这样用户是受不了的。
2、不利于SEO优化,因为爬虫不认识SPA,所以它只是记录了一个页面。
服务端和客户端渲染的区别 :
1、二者本质的区别:是谁来完成了html的完整拼接,服务端渲染是在服务端生成DOM树,客户端渲染是在客户端生成DOM树。
2、响应速度:服务端渲染会加快页面的响应速度,客户端渲染页面的响应速度慢。
3、SEO优化:服务端渲染因为是多个页面,更有利于爬虫爬取信息,客户端渲染不利于SEO优化。
4、开发效率:服务端渲染逻辑分离的不好,不利于前后端分离,开发效率低,客户端渲染是采用前后端分离的方式开发,效率更高,也是大部分业务采取的渲染方式。
直观的区分服务端渲染和客户端渲染:
源码里如果能找到前端页面中的内容文字,那就是在服务端构建的DOM,就是服务端渲染,反之是客户端渲染。
应该使用服务端渲染还是客户端渲染:
我们要根据业务场景去选择渲染的方式。
如果是企业级网站,主要功能是页面展示,它没有复杂的交互,并且需要良好的SEO,那我们应该使用服务端渲染。
如果是后台管理页面,交互性很强,它不需要考虑到SEO,那我们应该使用客户端渲染。
具体使用哪种渲染方式也不是绝对的,现在很多肢做镇网站使用 服务端渲染和客户端渲染结合 的方式:首屏使用服务端渲染,其他页面使用客户端渲染。这样可以保证首屏的加载速度,也完成了前后端分离。