资源webpack骗

114 阅读12分钟

HTML5 新特性、语义化

概念: HTML5的语义化指的是 合理正确使用语义化的标签来创建页面结构

语义化标签: header nav main article section aside footer

语义化的优点:

  • 在没有css样式的情况下,页面整体也会呈现很好的解构效果
  • 增加代码可读性,方便阅读
  • 有利于开发和维护,方便其他设备解析(如屏幕阅读器)根据语义渲染网页
  • 有利于搜索引擎优化,搜索引擎爬虫会根据不同的标签来赋予不同的权重。

CSS选择器及优先级

选择器

从输入url到页面加载的全过程

juejin.cn/post/727909…

1.url 解析

@1 :地址解析

确定要访问的服务器和路径

image.png 协议,登录信息认证,域名,端口号,路径,查询参数,锚点

  1. 缓存检查

缓存位置: 
Memory Cache : 内存缓存
Disk Cache: 硬盘缓存

打开网页:查找 disk cache 中是否有匹配,如有则使用,如没有则发送网络请求

普通刷新 (F5):因TAB没关闭,因此memory cache是可用的,会被优先使用,其次才是disk cache

强制刷新 (Ctrl + F5):浏览器不使用缓存,因此发送的请求头部均带有 Cache-control: no-cache,服务器直接返回 200 和最新内容

浏览器缓存

强缓存 Expires / cache-Control

浏览器对于强缓存的处理: 根据第一次请求资源时返回的响应头来确定的

  Expires:缓存过期时间,用来指定资源到期的时间(HTTP/1.0Cache-Control:cache-control: max-age=2592000第一次拿到资源后的2592000秒内(30天),再次发送请求,读取缓存中的信息(HTTP/1.1)
  两者同时存在的话,Cache-Control优先级高于Expires

客户端检测缓存信息和缓存标识 Expires Cache-Control

有(且未过期):客户端直接读取渲染缓存信息

没有(或者过期):客户端重新向服务器发送新的 HTTP请求

返回该请求结果和缓存标识 Cache-control Expires

把请求结果和缓存标识存储到浏览器中

协商缓存 Last-Modified / ETag

协商缓存就是强缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据标识决定是否使用缓存的过程

客户端携带获取缓存标识发送HTTP请求 If-Modified-Since / If-None-Match

服务器根据资源文件是否更新

 没更新 返回 304, 通知客户端读取缓存信息
 
 更新过 返回200及最新资源信息,以及 Last-Modified / ETag

200: 直接渲染,并且把最新的结果和表示缓存到本地

304: 从本地缓存中获取内容进行渲染

  1. DNS 解析

DNS(Domain Name System)域名解析是将域名转换为 IP 地址的过程。

当用户在浏览器中输入一个网址时,例如 www.example.com,浏览器会首先将这个域名发送给 本地 DNS 服务器,进行解析。

DNS 解析的过程大致如下:

@1. 本地 DNS 缓存查询:浏览器首先会检查本地 DNS 缓存中是否有该域名对应的 IP 地址,如果有,则直接返回该 IP 地址,不需要进行后续的查询。

@2. 递归查询:如果本地 DNS 缓存中没有对应的记录,本地 DNS 服务器会向根域名服务器发起递归查询。根域名服务器负责返回顶级域名服务器的地址,如 .com、.org、.net 等。

@3顶级域名服务器查询:本地 DNS 服务器收到根域名服务器返回的顶级域名服务器地址后,会向顶级域名服务器发送查询请求。顶级域名服务器负责返回二级域名服务器的地址,如 example.com 的域名服务器。

@4 权限域名服务器查询:本地 DNS 服务器收到顶级域名服务器返回的域名服务器地址后,会向权限域名服务器(即存储了该域名具体信息的服务器)发送查询请求。权限域名服务器返回该域名对应的 IP 地址。

返回结果:最终,本地 DNS 服务器将获取到的 IP 地址返回给浏览器,浏览器可以使用该 IP 地址建立连接并访问网站。

  1. TCP 三次握手 第一次握手:客户端发送一个 SYN=1(请求建立连接),seq=x(随机序列号)的数据包到服务器端口

第二次握手: 服务端收到后,返回一个带有 SYN=1,ACK=1(确定字符),seq=y,ack=x+1(上一次的seq+1)的响应数据包到客户端,已传达确认信息

第二次握手,有服务器发起,告诉客户端我准备接受了,你可以发送了

第三次握手:客户端再回传一个带 ACK=1,seq=x+1,ack=y+1的数据包,代表握手结束

第三次握手,由浏览器发送,告诉服务器,我马上就发了,准备接受了

然后双方就建立连接,开始传输数据

  1. 数据传输 连接建立成功了,浏览器向服务器发送 HTTP 请求报文,获取想要的数据

请求报文

    1.请求行
        请求方法,请求url,http协议等
    2.请求头
        浏览器的一些基础信息告诉服务器
    空行
    请求体
        当使用post或者put方法是,需要传递数据,就放在请求正文中

响应报文

    1. 状态行
        http版本一些字段,状态码和状态码描述
    2. 响应头
        用于指示浏览器如何处理响应体
    3. 空行
    4. 响应体
        返回客户端所需要的数据
  1. TCP四次挥手 任何一方都可以在数据传送结束后发出连接释放的通知,所以主动发起关闭请求可以是客户端,也可以是服务端

第一次挥手:主动方发送TCP连接释放报文段(FIN=1 ACK=1 seq=u ack=v),并进入终止等待1(FIN-WAIT-1)状态,并且停止发送数据

第二次挥手: 接收方收到TCP连接释放报文段后,会发送一个确认报文段,(ACK=1 seq=v ack=u+1)并进入关闭等待(CLOSE-WAIT)状态

第三次挥手:接收方将最后的数据发送完毕后,就向主动方发送连接释放报文,( FIN=1 ACK=1 seq=w ack=u+1)

第四次挥手: 主动方收到接收方的连接释放报文后,发出确认报文(ACK=1 seq=w+1),接收方收到确认报文段后就进入关闭状态。主动发等待2MSL(MSL)后进入关闭状态

  1. 页面渲染

当我们从服务器获取HTML代码之后,浏览器需要按照代码规则,绘制出对应的页面

@1 创建“DOM TREE”

GUI渲染线程会自上而下,一行行的渲染解析页面中的代码;当渲染到底部的时候,浏览器已经规划出:当前页面的结构和层级嵌套关系(节点和节点之间的关系) -> 这就是DOM树

@2 创建“CSSOM TREE”

在DOM TREE生成后,浏览器把(从服务器获取的)样式代码进行渲染,生成CSSOM树!

在GUI渲染过程中,我们会遇到、、@import、、...等标签,遇到不同的标签有不同的处理方案!!

@3 把“DOM TREE”和“CSSOM TREE”合并在一起,生成“RENDER TREE”

@4 Layout布局:根据视口大小,计算出每一个节点在视口中的具体位置及大小等

@5 分层:规划出对应的层级,以及节点该在哪一个层级上「脱离文档流」

@6 Painting绘制:按照所有解析出来的规则,一层层的开始绘制

浏览器内容:

juejin.cn/post/735130…

HTTP 和 HTTPS

http 是超文本传输协议,信息是明文传输,https 协议要比http协议安全

https 是以安全为目标的HTTP通道,即 http 下加入了 SSL层进行加密。其作用是建立一个信息安全通道,来确保数据的传输,确保网站的真实性。

http协议的默认端口号 80, https的默认端口号 443

http 的连接很简单,是无状态的。

https协议需要ca证书,费用较高;ssl证书需要绑定域名

http/1 的缺陷

延迟——对头阻塞
    `队头阻塞`是指当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,
    在后面排队的所有请求也一并被阻塞,会导致客户端迟迟收不到数据
无状态特性-阻碍交互
    无状态是指协议对于连接状态没有记忆能力
明文传输-不安全性
    所有`传输的内容都是明文`,户端和服务器端都无法验证对方的身份
不支持服务端推送

http/2

新的二进制格式3
    http/1 是基于文本的,http/2采用的事二进制格式,实现方便且
header压缩
    http/1header带有大量信息,而且每次都要重复发送,
    HTTP/2使用 encoder来减少需要传输的header大小
服务端推送
    例如我的网页有一个style.css的请求,在客户端收到 style.css数据的同时,
    服务端会将style.js的文件推送给客户端
多路复用
    多个请求可同时在一个连接上并行执行,某个请求任务耗时严重,不会影响到其它连接的正常执行
    

GET和POST有什么区别

请求参数的位置
    get请求的请求参数会附加在url之后,参数之间使用 & 连接。多个参数会造成
    url长度增加,而post请求的参数则包含在请求体重
请求长度的限制
    由于get请求的参数附加在url之后,因此其请求长度受限于浏览器对URL长度的限制
安全性
    get请求的参数会暴露在URL中,而post请求的参数放在请求体中
缓存
    get请求可以被浏览器缓存,可以通过点击后退活刷新按钮来重复执行。

http状态码有哪些?并代表什么意思?

    1xx  
        101  ws升级协议中有
    2xx
        200 请求成功
        201 请求已经被实现,并因此创建了一个新的资源
        204 服务器成功处理了请求,但是没有返回任何内容
    3xx
        301 请求的资源已被永久移动到新的 url 上
        302 请求的资源现在临时从不同的url响应请求
        304 协商缓存,资源没有改变(客户端已经执行了GET请求,但是文件未发生变化)
    4xx
        400 服务器无法理解请求
        401 请求要求进行身份验证
        403 服务器理解请求,但拒绝执行它
        404 服务器无法找到请求的资源
        405 请求中指定的方法不被允许
    5xx
        500 服务器遇到了一个未曾预料的情况,导致其无法完成对应请求的处理
        501 服务器不支持当前请求所需要的某个功能
        503 由于临时的服务器维护或者过载,服务器当前无法处理请求

loader和plugins的区别

loader是文件加载器,能够加载资源文件,并对这些文件进行一些处理,诸如编译、压缩等,最终一起打包到指定的文件中;

plugin赋予了webpack各种灵活的功能,例如打包优化、资源管理、环境变量注入等,目的是解决 loader无法实现的其他事。

在运行时机上,loader 运行在打包文件之前;plugin则是在整个编译周期都起作用。

在配置上,loader在module.rules中配置,作为模块的解析规则,类型为数组。每一项都是一个 Object,内部包含了 test(类型文件)、loader、options (参数)等属性;

plugin在 plugins中单独配置,类型为数组,每一项是一个 plugin 的实例,参数都通过构造函数传入。

常见的loader

vue-loader: 加载编译Vue组件
url-loader: 处理图片和字体
image-loader: 加载并且压缩图片文件
less-loader: 加载并编译LESS文件
css-loader: 加载css,必须配合使用 style-loader
style-loader: 用于将css 编译完成后的样式,挂载到页面的style标签上
postcss-loader: 一般配合autoprefixer 插件自动补齐css3前缀
babel-loader: 将es6转换成es5

常见的plugin有哪些

BundleAnalyzerPlugin: 包分析工具
HtmlWebpackPlugin: 快速创建HTML文件
CleanWebpackPlugin: 目录清理
CompressionWebpackPlugin: 准备好用指定格式传送的压缩版资源包
MinCssExtractPlugin: 为每个包含cssde JS文件创建一个css文件
TerserPlugin: 压缩js, warning,drop_debugger,drop_console
CommonsChunkPlugin:提取chunk之间的公共模块用以共享
HotModuleReplacementPlugin: 启用热更新 HMR

如何提高webpack的构建速度

1.代码压缩
    js压缩: terser-webpack-plugin
    css压缩: css-minimizer-webpack-plugin
    html压缩: HtmlWebpackPlugin插件来生成HTML模版
2. 图片压缩
    image-webpack-plugin
3. tree shaking
    消除死代码,依赖ES Module 的静态语法分析(不执行任何代码,可以明确知道模块的依赖关系)。在webpack实现 TreeShaking 有两种方案
    usedExports通过标记某些函数是否被使用,之后通过 Terser 来进行优化的
    sideEffects; 跳过整个模块、文件,直接查看该文件是否有副作用
4. 减少打包域
    排除webpack 不需要解析的模块,即在loader的时候,在尽量少的模块中去使用,可以借助include 和 exclude 这两个参数,规定loader 只在哪些模块应用和在哪些模块不应用
5. 减少ES6 转为 ES5的冗余代码
    使用bable-plugin-transform-runtime 插件
6. 提取公共代码
    通过配置COMMONSChunkPlugin插件,将多个页面的公共代码抽历程单独的文件
7.splitChunks
    通过optimization中使用splitchunks进行拆分包,cacheGroups
8. 代码懒加载
    当异步加载的文件比较大时,配合使用preload和prefetch
    preload: 提前加载后面用到的关键资源,通过 rel和as属性
        <link rel='preload' href='path/to/resource' as="script(style/font)">
    prefetch:浏览器空闲的时候进行资源的加载
        <link rel='prefetch' href='path/to/resource'>