day-091-ninety-one-20230613-HTTP网络-毕设总结
HTTP网络
个人网站步骤
- 买服务器 公网IP:124.23.16.8
- 基于FTP把写好的代码上传到服务器上。
- 部署项目-指定端口号
- 个人博客:80
- 毕设项目:443
- 计划管理:81
- 此时客户端-浏览器可以基于:
http://124.23.16.8:80/index.html
访问到我们的代码。- URL地址解析。
- 确认该URL是否是一个合法的地址。
- 缓存检查。
- 查看浏览器是否有该URL的资源的缓存。
- DNS解析。
- 到DNS服务器上,找到外网IP。
- TCP的三次握手。
- 浏览器与外网IP对应的服务器产生联系。
- 客户端和服务器之间的数据通信。服务器把资源给到浏览器。
- TCP四次挥手。
- 把浏览器和服务器之间的连接通道断开。
- 客户端处理并渲染服务器返回的信息。
- 可以看
《图解HTT》
这本电子书。
- URL地址解析。
- 就可以基于IP地址查看到页面了。
步骤
-
第一步:URL地址解析。
http://www.xxx.com:80/index.html?lx=1&from=weixin#video
- URI/URL/URN
- URI: 统一资源标识符。
- URL与URN的统称。
- 平时我们看到的URI,其实集散控制系统的就是URL。
- URL与URN的统称。
- URL:统一资源定位符。
- 网址。
- URN:统一资源名称。
- 如图书编号。
- URI: 统一资源标识符。
- 解析信息:
- 传输协议:
- 作用:负责客户端和服务器端之间信息的传输(可以理解为快递小哥)。
- 分类:
http
:即HyperText Transfer Protocol
,超文本传输协议。- 除传输文本内容外,还可传输图片和音视频等。
https
:即Hypertext Transfer Protocol Secure
,HTTP
+SSL
,更安全的传输协议,经过加密处理。ftp
:即File Transfer Protocol
,文件传输协议,主要用于往服务器上上传内容
和下载内容
。
- 域名:
- 端口号
- 作用:区分相同服务器上部署的不同项目的,取值范围
0~65535
之间。- 浏览器有默认端口号机制:我们在地址栏中输入URL地址,如果没有写端口号,则浏览器会根据当前的传输协议,自动把端口号加上!
- http -> 80
- https -> 443
- ftp -> 21
- 作用:区分相同服务器上部署的不同项目的,取值范围
- 请求资源的路径名称。
- 问号传参信息
- 哈希值
- Hash值。
- 传输协议:
-
第二步:缓存检查
- 通过一个url网址,首先得到的是一个html。渲染过程中,遇到link标签向服务器发送拿到css代码,遇到script标签向服务器发送拿到js代码,遇到img标签向服务器发送拿到图片文件。
- 如果浏览器上有对应的路径文件的缓存,就直接拿,而不发送请求到服务器去拿。
- 针对静态资源文件:强缓存和协商缓存。
- 例如:html、css、js、图片、音频、视频…
- 缓存存储的位置:
- 虚拟内存(Memory Cache):存储全局变量、
- 如内存条、显卡内存、CPU内存。
- 物理内存(Disk Cache):
- 硬盘:固态硬盘与机械硬盘。
- 一般情况下,物理内存与虚拟内存都存一份。
- 虚拟内存(Memory Cache):存储全局变量、
- 浏览器读取缓存的思路:
- 正常刷新页面:先从虚拟内存中获取,如果不存在,再去物理内存中查找。
- 关闭页面重新打开:直接去物理内存中查找。
- 强制刷新页面(ctrl+F5):直接去服务器获取最新的。
- 读取缓存的速度:
- 虚拟内存中读取:速度一般在0ms。
- 物理内存中读取:速度较快,一般在10ms以外。
- 服务器中读取:速度最慢,在20ms-1000ms左右。
- 不论是强缓存还是协商缓存,都是由服务器进行设置,浏览器自动配合完成相应的缓存机制!
- 强缓存:
- 第一次访问网站,本地没有任何的缓存,需要向服务器发送请求;
- 服务器在返回相应资源信息的时候,如果想开启强缓存机制。
- 会在响应头中设置相关的字段:
Expires
: 存储缓存过期的具体时间。- 这个是
http/1.0
版本的协议。
- 这个是
Cache-Control
: 存储过多久缓存将过期(单位:秒)或者其它信息。- 这个是
http/1.1
版本的协议。
- 这个是
- 后台一般这两个字段都返回。至少要设置一个,根据那个版本来做。如果两个都返回,浏览器两个都支持会以最新的
Cache-Control
来设置。
- 会在响应头中设置相关的字段:
- 服务器在返回相应资源信息的时候,如果想开启强缓存机制。
- 当浏览器获取到服务器返回的资源信息,除了正常的渲染以外,还会去看响应头中是否有强缓存标识,即
Expires
与Cache-Control
字段。- 如果没有则啥都不处理。
- 如果有,则把本次获取的资源信息和这两个响应头信息,缓存在客户端本地!
- 在虚拟内存和物理内存中都存储一份。
- 第二次及以后访问这个网站,首先看本地是否有
具备在效期的缓存信息
。- 没有具备/缓存过期了:重新向服务器发送请求,来获取最新的资源。
- 有:则直接渲染缓存中的信息,无需再向服务器发送请求了。
- 强缓存的几个特点:
- 可以不和服务器通信,直接就能拿到资源文件了。
- 导致可能和服务器失联,用的都是第一次缓存的文件。
- 想拿到服务器上最新的资源文件:需要html不做强缓存,及用webpack打包文件时,给文件名加上根据内容所生成的hash值。
- 不论从服务器还是缓存中获取,只要可以拿到,HTTP状态码都是200。
- html页面千万不要做强缓存,以此来保证,即便本地有生效的缓存,但是只要服务器资源更新了,也要从服务器实时获取最新的资源进行渲染!
- html文件不做缓存,但js及css及图片等要做。
- 我们平时开发的时候,需要基于webpack/vite等前端工具,对代码进行编译打包,把编译后的内容部署到服务器上!
- 在webpack编译的时候,我们可以设置一个规则:根据文件的内容,让生成的文件名带唯一hash值。
- 例如:main.sae3fd9jk.js。
- 在输入文件名称中加一个
[name].[hash:8].js
。
- 这样只要代码修改了,每次打包都会创建不同的文件出来,而html页面中导入的也是最新的文件!
- 这样只要html不做强缓存,就可以保证,服务器资源一旦更新,我们获取的是最新资源,而不是本地缓存!
- 在webpack编译的时候,我们可以设置一个规则:根据文件的内容,让生成的文件名带唯一hash值。
- 第一次访问网站,本地没有任何的缓存,需要向服务器发送请求;
- 协商缓存:
- 该做通信还是要做的,只不过可能要返回的数据变少了。
- 不用做处理,都能保证浏览器渲染的资源是服务器上最新的。
- 协商缓存是强缓存的一种补充。
- 如果强缓存还在有效期,即便服务器设置了协商缓存,那么协商缓存的机制也不会触发。
- 只有没有设置强缓存或者强缓存失效了,设置的协商缓存机制才会生效!
- 步骤:
- 第一次访问网站,本地啥缓存都没有,需要从服务器获取。
- 如果服务器想对当前的资源设置协商缓存,则在响应头中返回或设置相关的字段:
Last-Modified
:存储该资源在服务器最后一次修改的时间,HTTP/1.0
。ETag
:存储该资源在服务器中最后一次修改的标识(唯一的),HTTP/1.1
。
- 如果服务器想对当前的资源设置协商缓存,则在响应头中返回或设置相关的字段:
- 浏览器获取资源信息的同时,观察响应头信息,如果具备这两个字段,则把资源和标识都缓存在本地!
- 第二次访问网站,不论本地缓存是否生效。
- 前提是:强缓存肯定是没有或者失效了!
- 都需要重新向服务器发送请求。并且在请求头中携带两个字段:
If-Modified-Since
:存储的值是Last-Modified的值。If-None-Match
:存储的值是ETag的值。
- 服务器接收传递的信息及标识,用
If-Modified-Since
/If-None-Match
和当前服务器上最新的资源进行对比。- 对比后是一样的:说明服务器上的这个资源没有更改过,则服务器直接返回304-即
Not-Modified
,浏览器接收到这个状态码,则从本地缓存中获取资源信息进行渲染。 - 对比后是不一样的:说明服务器上的这个资源更改过,此时服务器返回状态码200、最新的资源信息、最新的
Last-Modified
/ETag
值!- 浏览器获取最新的信息后,除了渲染,再把最新的信息和标识缓存在本地!
- 对比后是一样的:说明服务器上的这个资源没有更改过,则服务器直接返回304-即
- 第一次访问网站,本地啥缓存都没有,需要从服务器获取。
- 建议:html不设置强缓存,只设置协商缓存。其它资源如js、css、图片等都设置强缓存及协商缓存。
- 强缓存:
- 针对ajax数据:本地存储。
- 基于ajax/fetch从服务器获取的数据,不能设置强缓存和协商缓存,如果需要对不经常更新的数据进行缓存,需要开发者基于本地存储进行处理!
- 最好的数据缓存方案是:vuex/redux;
- 既可以避免频繁向服务器发送请求,也可以保证在用户刷新后,可以及时从服务器获取到最新的信息。
- 但是对于一些不经常更新的数据,基于localStorage来存储-即自己设定时效性,也是不错的选择!
-
实现具备有效期的localStorage存储方案:
/* //实现具备有效期的localStorage存储方案; - localStorage.setItem()/localStorage.getItem()/localStorage.removeItem(); - 设置的值,都只能是字符串格式的; */ const storage = { // 存储信息的时候,记录一下存储的时间。 /** * @param {string} key * @param {any} value */ set(key, value) { let obj = { time: +new Date(), //存储时,当前日期的时间戳。 value: value, }; localStorage.setItem(key, JSON.stringify(obj)); }, // 获取存储信息的时候,判断一下时效性。 /** * @param {string} key */ get(key, expires = 30 * 24 * 60 * 60 * 1000) { let obj = localStorage.getItem(key); if (!obj) { return null; //传递的key压根不存在。 } let { time, value } = JSON.parse(obj); if (+new Date() - time > expires) { // 存储的信息已经地了指定的时效:移除存储的信息、返回null。 storage.remove(key); return null; } return value; }, // 移除指定信息。 /** * @param {string} key */ remove(key) { localStorage.removeItem(key); }, };
-
无缓存方案:
//无缓存方案: const query = async function query() { try { let result = await axios.get("/api/list", { params: { lx: "my", }, }); console.log(`result-->`, result); } catch (error) { console.log(`error-->`, error); } }; query()
-
有缓存方案-本地存储:
/* //实现具备有效期的localStorage存储方案; - localStorage.setItem()/localStorage.getItem()/localStorage.removeItem(); - 设置的值,都只能是字符串格式的; */ const storage = { // 存储信息的时候,记录一下存储的时间。 /** * @param {string} key * @param {any} value */ set(key, value) { let obj = { time: +new Date(), //存储时,当前日期的时间戳。 value: value, }; localStorage.setItem(key, JSON.stringify(obj)); }, // 获取存储信息的时候,判断一下时效性。 /** * @param {string} key */ get(key, expires = 30 * 24 * 60 * 60 * 1000) { let obj = localStorage.getItem(key); if (!obj) { return null; //传递的key压根不存在。 } let { time, value } = JSON.parse(obj); if (+new Date() - time > expires) { // 存储的信息已经地了指定的时效:移除存储的信息、返回null。 storage.remove(key); return null; } return value; }, // 移除指定信息。 /** * @param {string} key */ remove(key) { localStorage.removeItem(key); }, }; //有缓存方案-本地存储: const query = async function query() { let result = storage.get("CACHE", 7 * 24 * 60 * 60 * 1000); if (result) { //本地是具备有效缓存的,则停止向服务器发送请求。 console.log(`result-->`, result); return; } // 数据没有缓存过:则向服务器发送请求。 try { let result = await axios.get("/api/list", { params: { lx: "my", }, }); console.log(`result-->`, result); // 请求成功就:把请求的结果存储到本地。 storage.set("CACHE", result); } catch (error) { console.log(`error-->`, error); } }; query();
-
- 最好的数据缓存方案是:vuex/redux;
- 基于ajax/fetch从服务器获取的数据,不能设置强缓存和协商缓存,如果需要对不经常更新的数据进行缓存,需要开发者基于本地存储进行处理!
- 通过一个url网址,首先得到的是一个html。渲染过程中,遇到link标签向服务器发送拿到css代码,遇到script标签向服务器发送拿到js代码,遇到img标签向服务器发送拿到图片文件。
-
第三步:DNS解析
- 所谓DNS解析,就是去DNS服务器上,基于域名获取服务器的外网IP地址-即主机地址。
- DNS解析也是有缓存机制的:
- 比如谷歌浏览器记录
DNS解析
的缓存时间,大概是1分钟左右。 - dns缓存刷新时间是多久?dns本地缓存时间介绍
- 比如谷歌浏览器记录
- DNS解析步骤:
- 基于
递归查询
在本地缓存中查找DNS解析记录。- 这个是找缓存的方式的。
- 浏览器的DNS解析缓存。
- 本地Host文件。
- 关于修改host文件:
- 假设个人在本地host中加一条记录:
www.qq.com 127.0.0.1
- 导致:以后只要在这台电脑上访问
www.qq.com
,都相当于在访问127.0.0.1
。 - 我在本地启动一个项目 ,假设
http://127.0.0.1:80/index.html
为我开发的页面
。 - 后期我基于
http://www.qq.com
访问的也是本地的这个项目
。
- 很久之前,也是基于这个方式来解决跨域问题的。
- 开发环境上才用的,部署到同源环境下。
- 假设个人在本地host中加一条记录:
- 关于修改host文件:
- 本地DNS解析器缓存。
- 本地DNS服务器。
- 基于
迭代查询
到DNS服务器
上查找DNS解析记录
。- 根域名服务器。
- 顶级域名服务器。
- 权威域名服务器。
- 每一次DNS解析的时间,大概在20~120毫秒左右。
- 基于
- 单纯这样看,减少DNS的解析次数,会提高页面的加载速度!
- 想要减少DNS的解析次数,需要把所有的资源部署在相同服务器的相同服务下!
- 比如html与js与css与图片等,都放在同一台服务器的同一个服务下。
- 这样一台服务器可以访问一个页面,就要十多个请求进该服务器了。
- 在线人数一多,该服务器的压力就比较大。服务器就可能有并发压力,比如一台服务器只能同时处理2000多个请求。
- 所以在真实的项目中,我们往往要把不同的资源部署到不同的服务器上。
- 例如:
- 静态资源服务器。
- 图片和音视频服务器。
- 数据请求服务器。
- …
- 这样会导致网站中出现多个域名请求,也就是需要多个DNS解析!
- 这样做的好处:
- 资源的合理利用。
- 比如:
- 图片处理服务器:比较大,需要内存大的服务器。网络需要带宽大。
- 数据处理服务器:要处理的压力比较大,CPU要好。
- 比如:
- 降低单一服务器的压力,提高并发上限。
- …
- 资源的合理利用。
- 例如:
- 想要减少DNS的解析次数,需要把所有的资源部署在相同服务器的相同服务下!
- 在DNS解析次数增加的情况下,我们可以基于dns-prefetch即DNS预解析,来提高网站的加载速度!
-
如:
```html <link rel="dns-prefetch" href="//dss0.bdstatic.com"> ``` ```html <link rel="dns-prefetch" href="//static.360buyimg.com"> ```
- 浏览器解析时,看到link标签,会分配一个线程去解析该link标签。拿到DNS地址。
- 当渲染到img及script标签遇到那些域名时,就会使用之前所解析好的DNS地址去到指定IP地址去拿具体资源。
- 浏览器解析时,看到link标签,会分配一个线程去解析该link标签。拿到DNS地址。
-
…
-
DNS预解析的原理:
- 就是利用浏览器的多线程机制,在GUI渲染的同时,开辟新的线程去解析域名。
- 解析的结果会缓存在浏览器中。
- 这样当GUI渲染到一定的阶段,遇到新的资源请求的时候,可能域名已经解析过它了,直接用缓存中存储的外网IP,去服务器发送请求即可,不用再去DNS服务器中找到IP地址去解析了!
- 就是利用浏览器的多线程机制,在GUI渲染的同时,开辟新的线程去解析域名。
-
本地存储方案
- 本地存储方案
- cookie
- 本地存储:有期限的限制,可以自己设置过期期限。在期限内,不论页面刷新还是关闭,存储的信息都还会存在。
- localStorage
- 本地持久化存储:页面刷新或者关闭,存储的信息一直存在,除非手动清除或者卸载浏览器,而且没有有效期的限制。
- sessionStorage
- 本地会话存储,传话结束-即浏览器页面关闭,存储的信息会自动清除。
- 但是刷新页面,会话不算结束,基于sessionStorage存储的信息还是会存在的。
- 比如网页小游戏,游戏窗口没关,都先在本地存。窗口关闭,就把数据存到服务器上。新打开窗口,从服务器拿到数据,再存在会话中。
- IndexedDB/WebSQL
- 本地数据库存储:利用浏览器自带的数据库,基本上都是非关联型数据库。
- 相对于其它的本地存储方案,其可以存储更多的数据。
- 虚拟内存存储
- 特点:页面刷新或者关闭,存储的信息都会清除掉。
- 类型
- 全局变量
- vuex
- redux
- …
- …
- 无论那一种本地存储方案,都受到浏览器和源的限制!
- 源:就是域名。
- 浏览器就是谷歌浏览器与IE浏览器这类的区别。
- 不论那一种本地存储方案,都是以明文形式进行存储的!
- 尽可能不存储
需要安全限定的数据
,即便要存储,一定要记得加密处理。
- 尽可能不存储
- cookie与localStorage区别:
- 时效性:cookie可以设置过期时间,而localStorage是持久化存储。
- 用于灵活控制时效性。
- 真实项目中,我们需要自己实现一套具备有效期的localStorage存储方案。
- 存储大小:
- 同源下,cookie最多只允许存储4kb内容。
- 而localStorage允许最多存储5MB。
- 稳定性:
- cookie是不稳定的。
- 超过大小,有些浏览器是存不进去新的。有些是清除一些旧的cookie的。
- 基于
清除历史记录
、安全卫士清扫垃圾
等操作,都可能会把存储的cookie给干掉。- 但这些操作对localStorage无效!
- localStorage是比较稳定的。
- 限制规则:某些浏览器具备
隐私模式
/无痕浏览模式
,在这种模式下,cookie存储的信息不会被保留,但是localStorage在新版本浏览器中也会受到影响。 - 和服务器端的关系:cookie和服务器之间是有猫腻的,而localStorage和服务器端没有直接的关系。
- 基于cookie存储的信息:
- 服务器返回给客户端信息的时候,如果有响应头中携带了Set-Cookie字段,则客户端浏览器,会自动在本地设置一个cookie,把Set-Cookie字段中的信息进行存储!
- 客户端本地只要存储了cookie,不论服务器是否需要,每一次向服务器发请求的时候,浏览器都会自动在请求头中,基于Cookies字段,把本地存储的cookie信息,都传递给服务器!
- 但是以上的处理,仅限同源访问!
- 因为在浏览器的非同源策略中,默认是禁止Cookie的传输的!
- 但是可以在axaj请求中设置一个请求头,让Cookie可以携带给非同源浏览器。
- 因为在浏览器的非同源策略中,默认是禁止Cookie的传输的!
- 基于localStorage存储的信息,除非手动发送给服务器,否则和服务器没有半毛钱关系!
- 可以手动从本地存储中取出来,在ajax中附带发送给服务器。
- 也可以在处理ajax请求函数中,把服务器发送的数据存储到本地存储中。
- 基于cookie存储的信息:
- cookie可以兼容到IE5,但是localStorage是H5新增的,只能兼容到IE9及以上浏览器!
- cookie是不稳定的。
- 时效性:cookie可以设置过期时间,而localStorage是持久化存储。
- cookie
实现具备有效期的localStorage存储方案
-
实现具备有效期的localStorage存储方案:
/* //实现具备有效期的localStorage存储方案; - localStorage.setItem()/localStorage.getItem()/localStorage.removeItem(); - 设置的值,都只能是字符串格式的; */ const storage = { // 存储信息的时候,记录一下存储的时间。 /** * @param {string} key * @param {any} value */ set(key, value) { let obj = { time: +new Date(), //存储时,当前日期的时间戳。 value: value, }; localStorage.setItem(key, JSON.stringify(obj)); }, // 获取存储信息的时候,判断一下时效性。 /** * @param {string} key */ get(key, expires = 30 * 24 * 60 * 60 * 1000) { let obj = localStorage.getItem(key); if (!obj) { return null; //传递的key压根不存在。 } let { time, value } = JSON.parse(obj); if (+new Date() - time > expires) { // 存储的信息已经地了指定的时效:移除存储的信息、返回null。 storage.remove(key); return null; } return value; }, // 移除指定信息。 /** * @param {string} key */ remove(key) { localStorage.removeItem(key); }, };
前端性能优化方案
-
前端性能优化方案:
- 减少 HTTP 请求:合并和压缩文件、使用雪碧图或字体图标减少图片请求、使用 CSS 和 JavaScript 文件的最小化版本等。
- 使用缓存:使用浏览器缓存和服务器缓存来减少对服务器的请求,减少重复加载资源的次数。
- 延迟加载:对于大型的或不是首要显示的内容,延迟加载可以提高初始页面加载速度,例如图片懒加载、按需加载等。
- 压缩资源:压缩 HTML、CSS、JavaScript 和图片等资源,减小文件大小,提高加载速度。
- 使用 CDN 加速:使用内容分发网络(CDN)来加速静态资源的传输,将资源分发到离用户更近的服务器上。
- 预加载和预渲染:通过预加载相关资源或预渲染页面来提前获取所需内容,减少用户操作时的延迟。
- 使用响应式设计:通过响应式布局和媒体查询,使网页能够适应不同屏幕大小的设备,提供更好的用户体验。
- 优化图片:使用适当的图片格式、压缩图片大小、使用懒加载或按需加载等技术来优化图片加载。
- 优化 JavaScript 执行:避免长时间执行的 JavaScript 代码,使用节流和防抖等技术控制事件频率,减少不必要的计算和操作。
- 使用异步加载:使用异步加载 JavaScript 和 CSS 文件,避免阻塞页面渲染。
- 优化渲染性能:减少重排和重绘,使用 CSS 动画代替 JavaScript 动画,使用虚拟列表或分页加载等技术优化大量数据的展示。
- 优化字体加载:使用字体子集、使用适当的字体格式,避免在页面加载时阻塞渲染。
- 监控和优化网页性能:使用性能监控工具分析网页加载过程中的性能瓶颈,进行针对性的优化。
-
按步骤来做:
- URL地址解析。
- 要请求地址写好,最好先预编码好。
- 方便浏览器减少地址的解析时间。(感觉没能提高多少速度)。
- 减少HTTP请求-使用雪碧图或字体图标减少图片请求。
- 而不是一个文字编码或一个小图,都要请求一次。
- 减少HTTP请求-合并文件,比如把几个css文件合并成一个css文件。把多个js文件合并成一个。
- 这个是借由weback及模块引入来完成的。
- 减少HTTP请求-优化字体加载:使用字体子集、使用适当的字体格式,避免在页面加载时阻塞渲染。
- 字体文件一般都有点大,以M为单位,最好少使用一点。或者直接使用系统字体。
- 字体子集化:只加载页面中使用到的字体字符,可以减小字体文件大小,提高页面加载速度。
- 把页面使用到的字体组合打包到一块,类似于pdf一样。直接把字体单个扣下来,而不是只用到了几个字就直接引入一个有多个字的字体文件。
- 减少HTTP请求-按需加载资源:根据用户行为或页面需要,动态加载资源,可以减少页面加载时间和资源浪费。
- 要请求地址写好,最好先预编码好。
- 缓存检查。
- 使用缓存-使用浏览器缓存和服务器缓存来减少对服务器的请求,减少重复加载资源的次数。
- 如使用get类型加查询字符串或数据参数这类请求来请求如json这类静态文件。
- 设置缓存策略:通过设置HTTP响应头中的Cache-Control和Expires字段,可以控制浏览器缓存的时间和方式。
- 版本控制:通过在文件名中添加版本号或使用文件内容的哈希值作为版本号,可以避免浏览器缓存旧版本的文件。
- 使用公共的文件,如react.js这一类,那么如果上一个页面也使用同样的地址,浏览器根据地址的一样,直接命中缓存,就不必向后面请求了。
- 缓存策略设置:根据页面特点和用户行为,设置合适的缓存策略,可以提高页面加载速度和用户体验。
- 条件请求:使用条件请求技术,如ETag、Last-Modified等,可以减少HTTP请求次数,提高页面加载速度。
- 使用缓存-使用浏览器缓存和服务器缓存来减少对服务器的请求,减少重复加载资源的次数。
- DNS解析。
- 使用CDN加速:使用内容分发网络(CDN)来加速静态资源的传输,将资源分发到离用户更近的服务器上。
- 将静态资源(如图片、CSS、JavaScript文件)托管到CDN上,可以加速资源的加载速度,减轻服务器负担。
- 使用DNS预解析:通过在页面中添加DNS预解析标签,可以提前解析页面中需要的域名,减少DNS查询时间,提高页面加载速度。
- 使用CDN加速:使用内容分发网络(CDN)来加速静态资源的传输,将资源分发到离用户更近的服务器上。
- TCP的三次握手。
- 浏览器与外网IP对应的服务器产生联系。
- 客户端和服务器之间的数据通信。服务器把资源给到浏览器。
- 压缩代码文件:使用CSS和JavaScript文件的最小化版本等,即使用.min.js这类文件。
- 这个也是由webpack等自动完成,去除console.log()等打印信息,以及把长变量名变短这类。
- 如UglifyJS、CSSNano等,可以减小文件大小,提高页面加载速度。
- 优化JavaScript代码:使用优化工具,如Closure Compiler、Terser等,可以减小文件大小,提高页面加载速度。
- 这个也是由webpack等自动完成,去除console.log()等打印信息,以及把长变量名变短这类。
- 压缩资源:压缩 HTML、CSS、JavaScript 和图片等资源,减小文件大小,提高加载速度。
- 如使用gzip来处理html文件的传输。
- 优化图片:使用适当的图片格式、压缩图片大小、使用懒加载或按需加载等技术来优化图片加载。
- 使用图片压缩工具,如TinyPNG、ImageOptim等,可以减小图片文件大小,提高页面加载速度。
- 可以选择jpg代替png。
- 这个也应该是webpack来做处理。
- 使用本地存储:使用浏览器的本地存储,可以减少HTTP请求次数,提高页面加载速度和用户体验。
- 使用服务器端缓存技术,如Memcached、Redis等,可以减少数据库查询次数,提高页面加载速度。
- 用https代替http,因为https一次可以请求多个。
- 压缩代码文件:使用CSS和JavaScript文件的最小化版本等,即使用.min.js这类文件。
- TCP四次挥手。
- 把浏览器和服务器之间的连接通道断开。
- 客户端处理并渲染服务器返回的信息。
- 使用异步加载:使用异步加载JavaScript和CSS文件,避免阻塞页面渲染。
- 减少首屏空白时间。虽然都是一开始就要加载,但一般是先优先加载好DOM及css。
- 使用异步加载技术,如script标签的defer、async属性等,可以减少页面加载时间。
- 预加载和预渲染:通过预加载相关资源或预渲染页面来提前获取所需内容,减少用户操作时的延迟。
- 比如下载好了表格的第一页数据,就先下载第二页的数据。
- 优化JavaScript执行:避免长时间执行的JavaScript代码,使用节流和防抖等技术控制事件频率,减少不必要的计算和操作。
- 优化渲染性能:减少重排和重绘,使用CSS动画代替JavaScript动画,使用虚拟列表或分页加载等技术优化大量数据的展示。
- 使用CSS3动画:使用CSS3动画代替JavaScript动画,可以减少页面重排和重绘,提高页面性能。
- 避免频繁的DOM操作:减少DOM操作的次数和频率,可以减少页面重排和重绘,提高页面性能。
- 图片懒加载,图片在浏览器页面中显示时才开始请求。
- 延迟加载:对于大型的或不是首要显示的内容,延迟加载可以提高初始页面加载速度。
- 如vue组件懒加载、react组件懒加载。
- 如点击进某个页面后,才需要使用某些字体或某个第三方插件如pdf.js。
- 使用响应式设计:通过响应式布局和媒体查询,使网页能够适应不同屏幕大小的设备,提供更好的用户体验。
- 不用移动端的请求一次,PC端的也请求一次。
- 减少DOM操作:减少DOM操作的次数和频率,可以减少页面重排和重绘,提高页面性能。
- 移动优化:针对移动设备的特点和用户行为,进行页面和资源的优化,提高页面加载速度和用户体验。
- 如不使用jQuery,而是使用jquery-mobile。
- 预渲染:使用预渲染技术,将页面预先生成为静态HTML文件,可以提高页面加载速度和SEO效果。
- 服务端渲染:使用服务端渲染技术,将页面在服务器端生成为HTML文件,可以提高页面加载速度和SEO效果。
- 预加载关键资源:提前加载页面中必要的资源,可以提高页面加载速度和用户体验。
- 使用异步加载:使用异步加载技术,如AJAX、Web Workers等,可以减少页面加载时间。
- 而不是使用同步加载,在请求过程中,页面卡死。
- 选择轻量级框架:选择适合项目需求和页面特点的轻量级框架,可以提高页面加载速度和用户体验。
- 使用异步加载:使用异步加载JavaScript和CSS文件,避免阻塞页面渲染。
- 页面整体流程中:
- 监控和优化网页性能:使用性能监控工具分析网页加载过程中的性能瓶颈,进行针对性的优化。
- 性能调试工具:使用性能调试工具,如Chrome DevTools、Firebug等,可以分析页面的性能瓶颈和优化方案。
- 即在浏览器控制台的网络面板中,可以看到网页文件的具体传输时间。
- 在浏览器控制台的性能面板中,可以看到一个过程中,那个组件用的时间多。
- 借助vue-devtools及react-devtools辅助插件,也可以看到一些组件的性能及渲染时间。
- 性能调试工具:使用性能调试工具,如Chrome DevTools、Firebug等,可以分析页面的性能瓶颈和优化方案。
- 性能监控:使用性能监控工具,如Google Analytics、WebPagetest等,可以监控页面的加载速度和性能指标。
- 用户行为分析:使用用户行为分析工具,如Google Analytics、Mixpanel等,可以分析用户行为和需求,优化页面和资源。
- 监控和优化网页性能:使用性能监控工具分析网页加载过程中的性能瓶颈,进行针对性的优化。
- URL地址解析。
同步与异步
-
同步与异步
- 同步:同时只能干一件事。
- 异步:同时可以干多件事。
-
进程和线程:一个进程中可能包含多个线程。
- 进程类似于一个程序。
- 线程类似于这个程序中干活的。
-
浏览器中:
- 打开一个页面,相当于开辟一个进程。
- 在页面中干活的是线程。
-
浏览器是多线程的!所以可以同时做多件事情!
- GUI渲染线程:自上而下解析HTML/CSS,绘制页面的。
- HTTP网络线程:向服务器发送请求,获取资源/数据的。
- js引擎线程:渲染和解析js代码的。
- 定时器监听线程
- 事件监听线程
- …
毕设总结
-
毕设说明:
- 毕设是非常重要的,如果毕设都完不成,也不需要去面试了,直接重听就好了!
- 只有完成毕设,和写完简历,并且我审核过了,才能毕业「我给你看简历之前,先看毕设」
-
毕设要求:
- 不限技术框架「Vue2、Vue3、React 皆可」,但是建议:你想用啥技术作为主栈去找工作,那么就先以啥技术框架去做毕设!!
- 一个人 / 两个人:自愿结组「三个人结组的,需要我审核」
- 毕设需要是一个完整的项目「包含前后端的各种通信问题」
如果自己可以写后台,自己写也可以,如果不会后端,则找开源的后端!!
-
毕设参考案例:
- 知乎日报「只许一个人开发」
- 新蜂APP「ToC」「只许一个人开发」
http://47.99.134.126:5008/#/home
- 新蜂CMS系统「ToB」
http://vue3-admin.newbee.ltd/
- 账号:
admin
密码:123456
- 网易云「PC或者移动端」
- 物美系统「可以允许三个人」
https://iot.fastbee.cn/login
-
或者自己去 github 上找开源的项目!!
-
明天上课前,报备给我你的选择「各组长收集」,毕设需要在 7.23 之前完成!