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

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

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

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

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

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

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

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

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

注意命名,防止污染

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

  • A项目
  • B项目

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

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

注意版本,迭代防范

请看一个例子,假如我们存储一段信息,类型是 stringZBu28资讯网——每日最新资讯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 类型了,这时候对应的存取方法也变了ZBu28资讯网——每日最新资讯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(字符串)会报错,影响正常的业务逻辑~ZBu28资讯网——每日最新资讯28at.com

所以最好是加一个版本号,或者做一下错误兼容,这样就能避免了~ZBu28资讯网——每日最新资讯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}`)

时效性,私密性

时效性,那就是给存进去的数据加一个时效,过了某个时间,这个数据就时效了,方法就是每次存数据进去的时候,加一个时间戳:ZBu28资讯网——每日最新资讯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 中,但是又不想被用户看到,这时候就需要进行加密了(加密规则自己定):ZBu28资讯网——每日最新资讯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 的情况:ZBu28资讯网——每日最新资讯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锁被别人释放怎么办

标签:
  • 热门焦点
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之“想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!”曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大“烤”之下的除了众生,还有各大企业发布的ESG报告。ESG是“环境保
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己“当家”的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
  • OPPO K11采用全方位护眼屏:三大护眼能力减轻视觉疲劳

    日前OPPO官方宣布,全新的OPPO K11将于7月25日正式发布,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼IMX890主摄,堪称是2000档位影像表
Top