当前位置:首页 > 科技  > 软件

我面试最喜欢问的开放题:如何严谨二次封装 localStorage?

来源: 责编: 时间:2024-03-18 09:42:55 299观看
导读在很多公司中,内部都会封装一些适用于公司内部业务的方法库来提高整个团队的开发效率,比如:防抖节流懒加载、虚拟滚动dom增删改查、移动、拖拽管理状态而在 Vue3 项目中,这种方法库表现为:hooks库,市面上有很多优秀的库,比如

在很多公司中,内部都会封装一些适用于公司内部业务的方法库来提高整个团队的开发效率,比如:EDZ28资讯网——每日最新资讯28at.com

  • 防抖节流
  • 懒加载、虚拟滚动
  • dom增删改查、移动、拖拽
  • 管理状态

而在 Vue3 项目中,这种方法库表现为:hooks库,市面上有很多优秀的库,比如:vueuse。EDZ28资讯网——每日最新资讯28at.com

最近我在面试中,喜欢问一道有关于 hooks 的开放问题:二次封装一个 loaclStorage 的 hooks 时,需要考虑哪些问题呢?EDZ28资讯网——每日最新资讯28at.com

其实这是一道很简单的题,只不过想考考面试者在做业务的时候,会不会考虑更多的边界情况~接下来说说我对这个问题的小小的理解(可能也不是很全面)。EDZ28资讯网——每日最新资讯28at.com

EDZ28资讯网——每日最新资讯28at.com

注意命名,防止污染

比如我现在一个域名下有两个子项目:EDZ28资讯网——每日最新资讯28at.com

  • A项目
  • B项目

且这两个项目都需要存储 userInfo,那要怎么防止这两组数据互相污染呢?所以需要注意命名,在存储的时候加上对应的项目名前缀,或者其他标识符,保证这组数据是唯一的EDZ28资讯网——每日最新资讯28at.com

const PROJECT_NAME = 'test-project'localStorage.setItem(  `${PROJECT_NAME}_userInfo`,  JSON.stringify({ name: 'lsx' }))

注意版本,迭代防范

请看一个例子,假如我们存储一段信息,类型是 stringEDZ28资讯网——每日最新资讯28at.com

// 存数据const set = () => {  const info = get()  if (!info) {    localStorage.setItem(      `${PROJECT_NAME}_info`,      'info_string'    )  }}// 取数据const get = () => {  const info = localStorage.getItem(    `${PROJECT_NAME}_info`  )  return info}

然后项目上线了一段时间,但是这个时候,突然决定要换成 object 类型了,这时候对应的存取方法也变了EDZ28资讯网——每日最新资讯28at.com

// 存数据const set = () => {  const info = get()  if (!info) {    localStorage.setItem(      `${PROJECT_NAME}_info`,      JSON.stringify({ name: 'lsx' })    )  }}// 取数据const get = () => {  const info = localStorage.getItem(    `${PROJECT_NAME}_info`  )  return JSON.parse(info)}

但是这样其实是有隐患的,因为项目已经上线了一段时间,有些用户已经存过这个数据了,且存的是 string 类型,但是新版本上线之后,取数据却用了 object 的方式去取数据,这就导致了JSON.parse(字符串)会报错,影响正常的业务逻辑~EDZ28资讯网——每日最新资讯28at.com

所以最好是加一个版本号,或者做一下错误兼容,这样就能避免了~EDZ28资讯网——每日最新资讯28at.com

const PROJECT_NAME = 'test-project'// 每次升级时改变版本号,规则自己定const VERSION = 1// 存数据localStorage.setItem(  `${PROJECT_NAME}_userInfo_${VERSION}`,  JSON.stringify({ name: 'lsx' }))// 取数据localStorage.getItem(  `${PROJECT_NAME}_userInfo_${VERSION}`)

时效性,私密性

时效性,那就是给存进去的数据加一个时效,过了某个时间,这个数据就时效了,方法就是每次存数据进去的时候,加一个时间戳:EDZ28资讯网——每日最新资讯28at.com

// 原来localStorage.setItem(  `${PROJECT_NAME}_userInfo`,  JSON.stringify({ name: 'lsx' }))const TIME_OUT = 3 * 60 * 60 * 1000// 加时间戳localStorage.setItem(  `${PROJECT_NAME}_userInfo`,  JSON.stringify({    data: { name: 'lsx' },    // 记录当前时间    time: new Date().getTime()  }))// 取数据时判断时间戳const get = () => {  let info = localStorage.getItem(    `${PROJECT_NAME}_userInfo_${VERSION}`  )  info = JSON.parse(info)  const now = new Date().getTime()  if (now - info.time >= TIME_OUT) {    localStorage.removeItem(      `${PROJECT_NAME}_userInfo_${VERSION}`    )    return null  }  return info}

有一些数据我们不得不存在 localStorage 中,但是又不想被用户看到,这时候就需要进行加密了(加密规则自己定):EDZ28资讯网——每日最新资讯28at.com

// 加密函数const encrypt = (v) => {}// 解密函数const decrypt = (v) => {}// 存数据localStorage.setItem(  `${PROJECT_NAME}_userInfo_${VERSION}`,  // 加密  encrypt(JSON.stringify({ name: 'lsx' })))// 取数据 解密decrypt(localStorage.getItem(  `${PROJECT_NAME}_userInfo_${VERSION}`))

兼容 SSR

SSR 就是服务端渲染,是在服务端运行代码,拼接成一个页面,发送到浏览器去展示出来,所以在服务端是使用不了 localStorage 的,因为不是浏览器环境,所以你像封装一个比较通用的 localStorage,得兼顾 SSR 的情况:EDZ28资讯网——每日最新资讯28at.com

// 在 SSR 中使用对象替代 localStorageconst SSRStorage = {  map: {},  setItem(v) {    this.map[key] = v  },  getItem(key) {    return this.map[key]  }}let storage = null// 判断环境if (!window) {  storage = SSRStorage} else {  storage = window.localStorage}

本文链接:http://www.28at.com/showinfo-26-76567-0.html我面试最喜欢问的开放题:如何严谨二次封装 localStorage?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 面试官:工作中处理过什么复杂的前端需求,如何解决的?

下一篇: Redis锁被别人释放怎么办

标签:
  • 热门焦点
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • 朋友圈可以修改可见范围了 苹果用户可率先体验

    近日,iOS用户迎来微信8.0.27正式版更新,除了可更换二维码背景外,还新增了多项实用功能。在新版微信中,朋友圈终于可以修改可见范围,简单来说就是已发布的朋友圈
  • 联想的ThinkBook Plus下一版曝光,键盘旁边塞个平板

    ThinkBook Plus 是联想的一个特殊笔记本类别,它在封面放入了一块墨水屏,也给人留下了较为深刻的印象。据有人爆料,联想的下一款 ThinkBook Plus 可能更特殊,它
  • 亲历马斯克血洗Twitter,硅谷的苦日子在后头

    文/刘哲铭  编辑/李薇  马斯克再次挥下裁员大刀。  美国时间11月14日,Twitter约4400名外包员工遭解雇,此次被解雇的员工的主要工作为内容审核等。此前,T
Top