Web前端
CORS
CORS是一个W3C标准,全程是"跨域资源共享"(Cross-origin resource sharing) Access-Control-Allow-Origin:可接受的域,是一个具体域名或者,代表任意
它允许浏览器向跨源服务器发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制 #同源策略 + 如果是te'shu'qing的话 * 会在正式通信之前,增加一次HTTP查询请求,称之为”预检“请求(preflight)
浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之内,以及可以使用那些HTTP动词和头信息字段,再行判断当前的域名、请求类型和头信息是否都在许可范围之内
- 当浏览器收到答复后, 如果是的话,则正是发出XMLHttpRequest请求 否则报错
Access-Control-Allow-Credentials:是否允许携带cookie,默认情况下,cors不会携带cookie,除非这个值是true
- 浏览器会把Ajax请求分为两类 + 简单请求 HEAD、GET、POSTsan'zhong'qing'qi + 头信息不超过以下几个字段 Accept Accept-Language Content-Language Last-Event-ID ((uce-Content-Type))(
te'shu'qing + 原理 + 当浏览器发现Ajax请求是简单请求时,会在请求头携带一个字段=Origin= =Origin: http://grass.work:80= + 服务端会根据这个值是否允许其跨域 如果服务器允许跨域,
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
- 如果想在跨域请求中操作Cookie,需要同时满足3个条件 服务器的响应头中=Access-Control-Allow-Origin=true= 浏览器发起Ajax时需要制定=withCredentials=true= 响应头中的=Access-Control-Allow-Origin=不能为==,一定要为制定的域名
DOM的回流和重绘
页面呈现过程
- 根据html解析dom tree
- 根据css解析样式结构体
- 结合dom tree和样式结构体构建render tree
- 根据render tree渲染页面
当元素的位置、尺寸、布局、显示隐藏、窗口大小发生变化的时候,会引发回流,即重构dom tree或render tree * 当样式发生改变的话,会直接更新render tree,引发重绘
回流一定引发重绘,重绘不一定引发回流 * 通过构建文档片段,修改文档碎片的属性。统一插入到dom中,只会触发一次回流和重绘,否则会很多次
- vdom可以减少回流和重绘的次数
前端工程化
随着项目规模的扩大,需求越来越复杂,开发人员的增多,对质量的要求更高,会引发一些问题
重复的琐碎工作 需要自动化
- 构建
- 部署
- 测试
- 集成
沟通成本上升 需要规范化
代码冲突和重复代码 需要模块化和组件化
模块化 文件的层面上
组件化 在一个完整的开箱即用的组件的复用
目录结构的制定
编码规范
- eslint
前后端接口规范
- restful
文档规范
- jsdoc
组件管理
Git分支管理
- gitflow
Commit描述规范
- commitizen
定期CodeReview
视觉图标规范
图标合并 使用webpack
自动化集成
自动化构建
自动化部署
自动化测试
- jest
IndexedDB
特点
- 键值对存储
- 同源策略
- 异步操作
- 支持事务
- 存储空间大
- 支持二进制
基本概念
数据库:IDBDatabase 对象
每个域名(严格的说,是协议 + 域名 + 端口)都可以新建任意多个数据库
版本的概念
- 同一个时刻,只能有一个版本的数据库存在
- 如果要修改数据库结构(新增或删除表、索引或者主键),只能通过升级数据库版本完成。
对象仓库:IDBObjectStore 对象
- 每个数据库可以新建若干的对象仓库
- 类似于关系数据库中的表的概念
数据记录
对象仓库保存的是数据记录
每条记录类似于关系型数据库的行
只有主键和数据体两部分。
- 主键可以是数据记录里面的一个属性
- 也可以指定为一个递增的整数编号
索引: IDBIndex 对象
事务: IDBTransaction 对象
- 数据记录的读写和删改,都要通过事务完成。
操作请求:IDBRequest 对象
指针: IDBCursor 对象
主键集合:IDBKeyRange 对象
前端测试
- 大致分为三种
- 单元测试——主要是纯代码,或者公共的纯组件
- 集成测试——执行端到端的测试,模拟用户操作
- 自动化UI测试——自动对快照进行比较
- 测试需要考虑的问题
- 测试问题的可复现性
- 和sonar质量管理工具的集成
- 和开发流程的集成,不阻碍开发流程,并且可以帮助更好的程序设计与开发
HTTP状态码
HTTP状态码 :PROPERTIES: :CUSTOM_ID: http状态码 :END:
1xx 信息
- 100 继续,客户端继续其请求
- 101 切换协议
2xx 成功
- 200 OK,请求成功
- 201 已创建
- 202 已接受,但未处理完成
- 203
- 204 无内容
3xx 重定向
- 300 多种选择资源位置
- 301 永久移动
- 302 临时移动
- 303
- 304 文件未修改
- 305 必须使用代理
4xx 客户端错误
- 400 请求的语法错误
- 401 请求用户需要身份认证
- 403 服务端理解客户端的请求,但是拒绝执行此请求
- 404 文件未找到
5xx 服务器错误
- 500 服务器内部错误
- 502 网关收到了远程服务器的无效响应
- 503 由于超载或者系统维护,服务器暂时无法处理请求
- 504 网关超时
HTTP请求头信息
HTTP请求头信息 :PROPERTIES: :CUSTOM_ID: http请求头信息 :END: Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
Access-Control-Request-Method:接下来会用到的请求方式,比如PUT * Access-Control-Request-Headers:会额外用到的头信息
HTTP响应头信息
- Access-Control-Allow-Origin:可接受的域,是一个具体域名或者*,代表任意
Access-Control-Allow-Credentials:是否允许携带cookie,默认情况下,cors不会携带cookie,除非这个值是true
Access-Control-Allow-Methods:允许访问的方式 * Access-Control-Allow-Headers:允许携带的头
Access-Control-Max-Age:本次许可的有效时长,单位是秒,过期之前的ajax请求就无需再次进行预检了
Content-Security-Policy: 可以设置的值,require-sri-for style; require-sri-for style;
TCP
TCP :PROPERTIES: :CUSTOM_ID: tcp :END:
传输控制协议 (Transmission Control Protocol)
特点
- 传输层
- 面向连接
- 可靠
TCP传输中的三次握手和四次挥手策略
TCP传输中的三次握手和四次挥手策略 :PROPERTIES: :CUSTOM_ID: tcp传输中的三次握手和四次挥手策略 :END:
目的是为了吧数据准确无误的送达mu'biao'ch
具体流程
三次握手
- 发送端发送一个带SYN标志的数据包给接收方
- 接收方收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息
- 发送端再回传一个带ACK标志的数据包,代表握手结束
一个TCP连接建立完成,如果握手途中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包
断开一个TCP需要四次握手
主动关闭方发送一个FIN,用来关闭主东方到被动方的数据传送
- 告诉被动方,我不给你新数据了
- 如果FIN信号之前的数据没有收到确认,还是会重发的
- 主动方在FIN信号之后还是会接收数据
被动方收到FIN后,发送一个ACK给对方,确认序号为收到序号+1
- 需要SYN相同,一个SYN占用一个序号
被动方发送一个FIN,关闭到主动方的新数据传送。
- 但是还是能接收数据,比如主动方FIN之前迟到的数据
主动方收到FIN后,发送一个ACk给被动方,确认序号为收到序号+1
支持完成四次握手,结束了一次TCP对话
TCP和UDP的区别
TCP和UDP的区别 :PROPERTIES: :CUSTOM_ID: tcp和udp的区别 :END:
- TCP面向连接,而UDP无连接
- TCP可靠性高,UDP可靠性低
- TCP传输速度略慢,UDP
UDP
网络协议
用户数据报协议 (User Datagram Protocol)
特点
- 传输层
- 无连接
- 不可靠
- 快速传输
JAMStack
JAMStack(JAM 代表 JavaScript,API 和 Markup)是一种使用SSG 技术、不依赖 Web Server 的前端架构。 它的核心是:不依赖 Web Server。 +
- 优点
- 高性能:由于网页是静态生成的,没有额外的网络数据请求,它的(TTFB)性能是最佳的(因为不涉及后端、数据库等等)。
- 易部署:因为 JAMStack 不依赖 Web Server,部署就仅仅是把生成的网页放到CDN就可以了。
- 强安全:同样因为不依赖 Web Server 的原因,就导致JAMStack 网站的攻击面很小。
- 易开发:JAMStack,由于其特性,开发也极其简单,不强依赖后端,开发、测试仅仅是部署到一个静态文件服务器即可。现在「三大框架」都有相应的SSG 方案,学习成本不高。
- 三大前端框架对应的SSG方案
- Next.js 是基于React 的 SSR/SSG 框架。
- Scully 是基于 Angular 的 SSG框架。
- VitePress 是 Vue 官方推出的 SSG 框架。
小程序
步骤
- 申请小程序
- 开发代码
- 发布小程序
tips
- mpvue是支持小程序原生组件的
- mpvue不支持直接在template上直接绑定函数
生命周期
小程序框架
mpVue
Uni-App
Taro
WePy
Chamelon
小程序组件库
- vant weapp
- weui
- iview weapp
- colorui
- Wux weapp
- taroUi
- linUI
- MinUI
跨域问题
跨域问题的存在是由于浏览器对于AJAX请求的一种安全限制,一个页面发起的Ajax请求,只能是于当前页同域名的路径,这能有效的阻止跨站攻击
- 但是在实际开发中,经常会出现多台服务器之间的交互,多个内部服务的交叉调用,地址和端口都可能不同
跨域
同源策略
- 由Netscape提出的一个著名的安全策略
加载一个脚本是会判断该脚本和当前页面是否是同一个域名,只有同一个域名的脚本才会被执行,如果不同域名,浏览器会报一个异常,提示拒绝fang'wen
- 同源策略只是一个单纯的浏览器端的行为,如果使用非浏览器的方式请求非同源脚本不会触发跨域问题
- 只有协议、域名、端口全部相同时才会被认为是同源
如何解决跨域问题
原理
- =script=标签可以进行跨域请求js文件,通过执行url中的回调函数实现跨域
实现
jian'dan'shi'xian
在html页面中定义一个函数,例如=showJson=
在目标js文件中写入=showJson({a:1})=
使用js动态插入=script=标签,在url后面加入callba
- 使用js动态插入=script=标签,在url后面加入callback参数
使用js动态插入=script=标签,在url后面加入callback参数
- 使用js动态插入=script=标签,在url后面加入callback参数,前提
优点
- 简单易用
- 无依赖类库
缺点
- 只能使用GETqin
JQuery实现
=$.ajax=方式
dataType设置成jsonp
jsonp为url中的参数名,默认为callback,可以手动指定
jsonpCallback为请求返回后的回调函数名称,如果不指定默认使用success回调使
- 在url中增加=jsoncallback=?=,直接在回调函数中接收json返回值
=$.getJSON=方法
优点
- 可以有GET和POST的选择
缺点
- 返回的文件格式依旧为JSONP
优点
- 兼容性好
缺点
- 只能支持=GET=请求
CORS #解决方案
#解决方案
原理
- 所有的浏览器都支持=Headers=中的=Cross-origin=系列
实现
- 在服务器端返回中增加=Access-Control-Allow-Origin=头信息,值设置为需要允许的域名,可以使用通配符
优点
- 前端不需要额外配置和关心
- 服务端统一拦截处理
- 可以自定义跨域规则
- 支持各种qing'qiu
缺点
- 使用复杂请求是会增加一次=OPTIONS=请求
Nginx反向代理 #解决方案
IFrame+=document.domain= (仅适用同主域名) #解决方案
原理
- document.domain可以把值设置为当前域的父域
实现
- 在a.html页面中使用js动态创建并加载页面b.html
- 在b.html修改document.domain为和a.html页面相同的父域名
- 把a.html也设置一下document.domain
优点
- 不借助第三方类库
缺点
- 只适用于同一个主域名的跨域情况
- 前端和后端都需要特殊处理
SSG
Static Site Generators
博客生成程序
- Jekyllrb https://jekyllrb.com/
- Hexo https://hexo.io/
- Octopress http://octopress.org/
https://www.cnblogs.com/buyz/p/10935831.html][11个最流行的静态(博客)网站生成工具
Cookie
Cookie 安全相关的设置
HttpOnly
阻止跨站攻击,如果设置为true
,那么从客户端 (JS)就不能访问该cookie。
Secure
如果设置了,就必须使用 https 访问
SameSite
可以设置三个值:Strict、 Lax、 None
Cookie的有效期
设置Cookie的生存期。有两种存储类型的Cookie:会话性与持久性。Expires属性缺省时,为会话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效。
持久性Cookie会保存在用户的硬盘中,直至生存期到或用户直接在网页中单击"注销"等按钮结束会话时才会失效 。
Subresource Integrity 子资源完整性
通过设置 ```
Content-Security-Policy: require-sri-for style; Content-Security-Policy: require-sri-for style;
为 样式和脚本 都前置使用 哈希检查
在 script
和link
中增加 integrity
属性,值为 内容的sha1值
可以使用以下两种工具进行hash
cat **FILENAME.js** | openssl dgst -sha384 -binary | openssl enc -base64 -A
或者
shasum -b -a 384 FILENAME.js | xxd -r -p | base64
bugs
- div之间出现间隙,可能会是 font-size: 0的问题