本文参加了由公众号@若川视野发起的每周源码共读活动, 点击了解详情一起参与。
本文已参与「新人创作礼」活动,一起开启掘金创作之路
前言
之前的我不知道怎么回答,但是当我读了js-cookie这篇源码的时候我就知道了为什么会有cookie,为什么又会出现js-cookie等一些问题都清楚了。当然在读的时候你都不知道cookie是什么,肯定要先去查找资料 百度 cookie是啥,我觉得就是这样 才能一步步让自己变的更强大。要不是这篇源码,可能我不知道什么时候会去百度一下cookie是什么吧。。。。。
一、什么是cookie?
我们可以把Cookie 理解为一个存储在浏览器里的一个小小的文本文件,它附着在 HTTP 请求上,在浏览器和服务器之间“飞来飞去”。它可以携带用户信息,当服务器检查 Cookie 的时候,便可以获取到客户端的状态。
当我们创建了cookie当我发送一个请求时它会附着在我们的请求上,后端会读取到我们设置的cookie
二、js-cookie
js-cookie是一个简单的,轻量级的处理cookies的js API。
三、源码知识点
- Object.assign()
合并对象 。接收两个参数第一个参数是目标对象,后面的参数都是源对象,如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。此方法实行的是浅拷贝。 - Object.create()
创建一个对象,接收两个参数第一个参数是为提供新创建的对象的__proto__,第二个是指定要添加到创建对象上的可枚举属性 - **Object.freeze()
**Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。
四、源码
导入自定义的方法
const assign = require('./assign.js') //自定义合并对象的方法
const defaultConverter = require('./converter.js') //自定义默认转换的方法
创建init方法 接收两个参数 第一个为导入的defaultConverter转换方法 第二个为默认参数{path:'/'},函数里面有一个set方法和get方法,该函数返回一个对象。
set方法
设置一个cookie 此方法接收三个参数,第一个参数为键名第二个参数为对应的值,第三个参数为此cookie的一些配置 例如 path 、 max-age
get方法
接收一个参数 为要获取cooke的键返回对应的值
set方法
合并cookie配置
对路径的配置 即那个路径下可以获取到当前设置的cookie
对时间的设置 即cookie的过期时间,默认不设置浏览器窗口关闭则cookie消失
attributes = assign({}, defaultAttributes, attributes)
判断的过期时间是否是number,是的话从当前时间开始计算cookie的过期时间
if (typeof attributes.expires === 'number') {
attributes.expires = new Date(Date.now() + attributes.expires * 864e5)
}
判断expires是否有值
if (attributes.expires) {
attributes.expires = attributes.expires.toUTCString()//转成中国标准时间
}
配置拼接成字符串
var stringifiedAttributes = ''
for (var attributeName in attributes) {
//判断当前的key是否有值 没值退出当前循环进入下一次循环
if (!attributes[attributeName]) {
continue
}
stringifiedAttributes += '; ' + attributeName // 1.'; path'2.'; path=/; expires'...
//判断值是否为true 为true 退出当前循环进入下一次循环
if (attributes[attributeName] === true) {
continue
}
// Considers RFC 6265 section 5.2:
// ...
// 3. If the remaining unparsed-attributes contains a %x3B (";")
// character:
// Consume the characters of the unparsed-attributes up to,
// not including, the first %x3B (";") character.
// ...
//拼接属性值
stringifiedAttributes += '=' + attributes[attributeName].split(';')[0] // 1.'; path=/'2.'; path=/; expires=时间'...
}
//写入到客户端本地储存
return (document.cookie =
name + '=' + converter.write(value, name) + stringifiedAttributes)
get方法
下面是在掘金上找的一些资料
.Cookie、
- Cookie的大小限制在4KB左右,对于复杂的存储需求来说是不够用的。当 Cookie 超过 4KB 时,它将面临被裁切的命运。这样看来,Cookie 只能用来存取少量的信息。此外很多浏览器对一个站点的cookie个数也是有限制的
- 这里需注意:各浏览器的cookie每一个name=value的value值大概在4k,所以4k并不是一个域名下所有的cookie共享的,而是一个name的大小。
- Cookie 是紧跟域名的。同一个域名下的所有请求,都会携带 Cookie。大家试想,如果我们此刻仅仅是请求一张图片或者一个 CSS 文件,我们也要携带一个 Cookie 跑来跑去(关键是 Cookie 里存储的信息并不需要),这是一件多么劳民伤财的事情。Cookie 虽然小,请求却可以有很多,随着请求的叠加,这样的不必要的 Cookie 带来的开销将是无法想象的。
cookie是用来维护用户信息的,而域名(domain)下所有请求都会携带cookie,但对于静态文件的请求,携 带 cookie信息根本没有用,此时可以通过cdn(存储静态文件的)的域名和主站的域名分开来解决。
- 由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题,除非用HTTPS。
LocalStorage
- 保存的数据长期存在,下一次访问该网站的时候,网页可以直接读取以前保存的数据。
- 大小为5M左右
- 仅在客户端使用,不和服务端进行通信
- 接口封装较好
sessionStorage
- 会话级别的浏览器存储
- 大小为5M左右
- 仅在客户端使用,不和服务端进行通信
- 接口封装较好
sessionStorage保存的数据用于浏览器的一次会话,当会话结束(通常是该窗口关闭),数据被清空;sessionStorage 特别的一点在于,即便是相同域名下的两个页面,只要它们不在同一个浏览器窗口中打开,那么它们的 sessionStorage 内容便无法共享;localStorage 在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的。除了保存期限的长短不同,SessionStorage的属性和方法与LocalStorage完全一样。
相关笔记链接juejin.cn/post/684490…
😄