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

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

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

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

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

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

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

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

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

注意命名,防止污染

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

  • A项目
  • B项目

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

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

注意版本,迭代防范

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

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

时效性,私密性

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

标签:
  • 热门焦点
  • 6月iOS设备性能榜:M2稳居榜首 A系列只能等一手3nm来救

    没有新品发布,自然iOS设备性能榜的上榜设备就没有什么更替,仅仅只有跑分变化而产生的排名变动,毕竟苹果新品的发布节奏就是这样的,一年下来也就几个移动端新品,不会像安卓厂商,一
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的“新电商三兄弟”成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 郭明錤称华为和江淮汽车合作开发问界MPV,定价100万左右、计划明年量产

    8 月 1 日消息,郭明錤今天在 Medium 平台发布博文,称华为正在和江淮汽车合作,开发售价在 100 万元的问界 MPV,预计在 2024 年第 2 季度量产,销量目标为
Top