网络篇
GET和POST区别
- get用来获取数据,post用来提交数据。
- get请求使用url传参而实体部分为空,post请求中实体部分为数据。
- get请求在URL中传送的参数是有长度限制的,而post没有。
- get请求会被缓存,post不会被缓存。
- 最重要的区别—幂等性:GET 请求是一个幂等的请求,一般 Get 请求用于对服务器资源不会产生影响的场景;而 Post 不是一个幂等的请求,一般用于对服务器资源会产生影响的情景。
HTTP状态码
1xx:进一步操作
- 100:可以继续发送(POST请求会先发header后发body)
2xx 表示成功
- 200:请求成功
- 204:请求成功,但没有响应体。
一般用在只是客户端向服务器发送信息,而服务器不用向客户端返回什么信息的情况
3xx 表示需要进一步操作
- 301:永久重定向
- 302:暂时重定向
- 304:缓存命中
4xx 表示浏览器方面出错
- 400:请求报文语法错误
- 403:请求被服务器拒绝
- 404:服务器找不到指定资源
5xx 表示服务器方面出错
-
500:服务器错误
-
503:服务器停机维护
HTTP版本
更多:mp.weixin.qq.com/s/GICbiyJpI…
多路复用相关:muyiy.cn/question/ne…
HTTP /0.9
- 请求方法:GET
- 不支持请求头 / 响应头
- 仅能请求HTML格式文件
HTTP /1.0
- 请求方法:GET POST HEAD
- 支持请求头 / 响应头
- 多种content-type(不仅限于html文件)
- 支持长连接(默认短连接):connection:keep-alive
- 缓存(cache):Expire,If-modified-since
HTTP /1.1
- 请求方法:GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE、TRACE 、CONNECT
- 默认开启长连接,以及请求的流水线处理。但存在队头阻塞问题:后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时,后续请求只能被阻塞。
- 新的缓存功能:
- ETag,if-none-match:协商缓存
- cache-control:强缓存
- 新增状态码:410 - 服务器上的某个资源被永久删除。
- Host域:解决了多个主机共享一个ip的问题。
- 带宽优化:支持断点续传。
HTTP /2.0
-
二进制分帧:更加方便且健壮。
-
多路复用:
-
Header压缩:体积更小,加速传输。
-
服务端推送:服务端推送能把客户端所需要的资源伴随着index.html一起发送到客户端,省去了客户端重复请求的步骤。
总结
- http1.0 vs http1.1
- http1.0默认无连接,长连接需要使用keep-alive;http1.1默认开启长连接,但是存在队头阻塞问题。
- http1.0只支持
GETPOSTHEAD三种方法。http1.1新增了PUTOPTIONSDELETETRACE等更加细分的方法。 - http1.0使用
expire+if-modified-since关键字控制缓存;http1.1使用cache-controlif-none-match控制缓存,更加可靠。
- http1.1 vs http2.0
- http2.0采用二进制分帧,使得应用更加健壮
- http2.0使用压缩头部方法,更加高效
- http2.0采用服务端推送,将请求的html文件中引用的js、css文件一并发送,提高了效率。
- http2.0使用了多路复用的方式,解决了队头阻塞问题。
跨域
JSONP
-
原理:浏览器同源策略允许
<script>标签的跨域资源嵌套,<script>不受同源策略限制。 比如:通常为了减轻web服务器的负载,我们把js、img、css等静态资源分离到另一台独立域名的服务器上,在html页面中再通过对应的标签<script>加载不同域下的资源。 -
实现方法:前端设置好回调函数,并把回调函数当做请求url的参数;后端接受到请求后,返回回调函数名,传入所需的数据;在前端执行该函数。
http.createServer((req, res)=>{
let urlObj = url.parse(req.url, true)
if(urlObj.pathname === '/getWeather'){
let data = {city:'杭州',weather:'晴天'}
res.end(`${urlObj.query.callback}(${JSON.stringify(data)})`)
}
}).listen(2020)
<script>
function showData(data) {
console.log(data) //
}
</script>
<script src="http://127.0.0.1:2020/getWeather?callback=showData"></script>
- 优点:兼容性好。
- 缺点:只支持GET方式的HTTP请求。
CORS
- 原理:发送Ajax请求时,浏览器发现该请求不符合同源策略,会给该请求加一个请求头:
Origin。后台收到请求后,如果确定接受请求则在返回结果中加入一个响应头:Access-Control-Allow-Origin;浏览器判断该响应头中是否包含当前Origin的值,如果有则浏览器会处理响应,我们就可以拿到响应数据,如果没有浏览器则被XMLHTTPRequest的onerror捕获。
OPTIONS 方法在跨域请求中的作用 && 204状态码的应用场景
浏览器篇
浏览器的渲染原理
浏览器端的存储技术
浏览器常见的存储技术有 cookie、localStorage 和 sessionStorage。
cookies,sessionStorage 和 localStorage 的区别
-
知识点
SessionStorage, LocalStorage, Cookie 这三者都可以被用来在浏览器端存储数据,而且都是字符串类型的键值对。区别在于:
- 前两者属于H5 webStorage,创建它们的目的便于客户端存储数据。
- cookie 数据在同源(协议、主机、端口相同)http请求中强制携带,会在浏览器和服务器间双向传递。cookie是 为了标示用户身份而储存在用户本地终端上的数据(通常经过加密)
-
回答:
-
cookie 由服务器设置,在客户端存储,然后每次发起同源请求时,发送给服务器端。cookie 最多能存储 4 k 数据,它的生存时间由 expires 属性指定,并且 cookie 只能被同源的页面访问共享。
-
sessionStorage 是 h5 提供的一种浏览器本地存储的方法,它借鉴了服务器端 session 的概念,代表的是一次会话中所保存的数据。它一般能够存储 5M 或者更大的数据,它在当前窗口关闭后就失效了,并且 sessionStorage 只能被同一个窗口的同源页面所访问共享。
-
localStorage 也是 h5 提供的一种浏览器本地存储的方法,它一般也能够存储 5M 或者更大的数据。它和 sessionStorage 不同的是,除非手动删除它,否则它不会失效,并且 localStorage 也只能被同源页面所访问共享。
-
事件机制
事件触发有三个阶段:
window往事件触发处传播,遇到注册的捕获事件会触发- 传播到事件触发处时触发注册的事件
- 从事件触发处往
window传播,遇到注册的冒泡事件会触发
阻止冒泡:
event.stopPropagation()
事件委托
事件委托本质上是利用了浏览器事件冒泡的机制。
因为事件在冒泡过程中会上传到父节点,并且父节点可以通过事件对象获取到目标节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件,这种方式称为事件代理。
-
优点:性能优化。
-
实现:
ul.addEventListener('click', function(e){ if(e.target.tagName.toLowerCase() === 'li'){ fn() // 执行某个函数 } })
浏览器缓存机制
强缓存
- cache-control:绝对时间(2000s),优先级>expires
- expires:日期(2020.7.1),可能被客户端修改
弱缓存
-
if-none-match:Etag(请求资源的本地Etag)
策略:查看请求资源的本地 Etag 与服务端 Etag 是否一致
-
若一致,则说明期间文件未更改,返回304;
-
若不一致,则说明期间文件有更改,返回200和新文件;
-
-
last-modified / if-modified-since:日期(2008.1.1)
策略:初次请求文件后,服务器返回
last-modified代表文件上次的更改时间。下次客户端发送请求时,在if-modified-since字段填入last-modified的值,查看从指定日期之后是否有过更新:-
若有更新,则说明期间文件有更改,返回200和新文件;
-
若未更新,则说明期间文件未更改,返回304;
-
完整缓存机制
查强缓存 => 查若缓存 => 请求新文件
经典面试题
从输入URL到展示页面,发生了什么?
这是一道没有标答的题目,想要及格不难,但想要答出满分答案是非常考研理解深度和广度的。
在这里推荐下我的博客嘻嘻:juejin.cn/post/691709…
相信看完你会有所收获
下期预告
怎么能少了JavaScript篇呢!
由于JS可写的内容过多,单独拆出一篇文字来讲,请继续关注哦~