成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我面試最喜歡問的開放題:如何嚴謹二次封裝 localStorage?

開發(fā) 前端
最近我在面試中,喜歡問一道有關(guān)于 hooks 的開放問題:二次封裝一個 loaclStorage 的 hooks 時,需要考慮哪些問題呢?

在很多公司中,內(nèi)部都會封裝一些適用于公司內(nèi)部業(yè)務(wù)的方法庫來提高整個團隊的開發(fā)效率,比如:

  • 防抖節(jié)流
  • 懶加載、虛擬滾動
  • dom增刪改查、移動、拖拽
  • 管理狀態(tài)

而在 Vue3 項目中,這種方法庫表現(xiàn)為:hooks庫,市面上有很多優(yōu)秀的庫,比如:vueuse。

最近我在面試中,喜歡問一道有關(guān)于 hooks 的開放問題:二次封裝一個 loaclStorage 的 hooks 時,需要考慮哪些問題呢?

其實這是一道很簡單的題,只不過想考考面試者在做業(yè)務(wù)的時候,會不會考慮更多的邊界情況~接下來說說我對這個問題的小小的理解(可能也不是很全面)。

注意命名,防止污染

比如我現(xiàn)在一個域名下有兩個子項目:

  • A項目
  • B項目

且這兩個項目都需要存儲 userInfo,那要怎么防止這兩組數(shù)據(jù)互相污染呢?所以需要注意命名,在存儲的時候加上對應(yīng)的項目名前綴,或者其他標識符,保證這組數(shù)據(jù)是唯一的

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

注意版本,迭代防范

請看一個例子,假如我們存儲一段信息,類型是 string

// 存數(shù)據(jù)
const set = () => {
  const info = get()
  if (!info) {
    localStorage.setItem(
      `${PROJECT_NAME}_info`,
      'info_string'
    )
  }
}

// 取數(shù)據(jù)
const get = () => {
  const info = localStorage.getItem(
    `${PROJECT_NAME}_info`
  )
  return info
}

然后項目上線了一段時間,但是這個時候,突然決定要換成 object 類型了,這時候?qū)?yīng)的存取方法也變了

// 存數(shù)據(jù)
const set = () => {
  const info = get()
  if (!info) {
    localStorage.setItem(
      `${PROJECT_NAME}_info`,
      JSON.stringify({ name: 'lsx' })
    )
  }
}

// 取數(shù)據(jù)
const get = () => {
  const info = localStorage.getItem(
    `${PROJECT_NAME}_info`
  )
  return JSON.parse(info)
}

但是這樣其實是有隱患的,因為項目已經(jīng)上線了一段時間,有些用戶已經(jīng)存過這個數(shù)據(jù)了,且存的是 string 類型,但是新版本上線之后,取數(shù)據(jù)卻用了 object 的方式去取數(shù)據(jù),這就導(dǎo)致了JSON.parse(字符串)會報錯,影響正常的業(yè)務(wù)邏輯~

所以最好是加一個版本號,或者做一下錯誤兼容,這樣就能避免了~

const PROJECT_NAME = 'test-project'
// 每次升級時改變版本號,規(guī)則自己定
const VERSION = 1

// 存數(shù)據(jù)
localStorage.setItem(
  `${PROJECT_NAME}_userInfo_${VERSION}`,
  JSON.stringify({ name: 'lsx' })
)

// 取數(shù)據(jù)
localStorage.getItem(
  `${PROJECT_NAME}_userInfo_${VERSION}`
)

時效性,私密性

時效性,那就是給存進去的數(shù)據(jù)加一個時效,過了某個時間,這個數(shù)據(jù)就時效了,方法就是每次存數(shù)據(jù)進去的時候,加一個時間戳:

// 原來
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()
  })
)

// 取數(shù)據(jù)時判斷時間戳
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
}

有一些數(shù)據(jù)我們不得不存在 localStorage 中,但是又不想被用戶看到,這時候就需要進行加密了(加密規(guī)則自己定):

// 加密函數(shù)
const encrypt = (v) => {}
// 解密函數(shù)
const decrypt = (v) => {}

// 存數(shù)據(jù)
localStorage.setItem(
  `${PROJECT_NAME}_userInfo_${VERSION}`,
  // 加密
  encrypt(JSON.stringify({ name: 'lsx' }))
)

// 取數(shù)據(jù) 解密
decrypt(localStorage.getItem(
  `${PROJECT_NAME}_userInfo_${VERSION}`
))

兼容 SSR

SSR 就是服務(wù)端渲染,是在服務(wù)端運行代碼,拼接成一個頁面,發(fā)送到瀏覽器去展示出來,所以在服務(wù)端是使用不了 localStorage 的,因為不是瀏覽器環(huán)境,所以你像封裝一個比較通用的 localStorage,得兼顧 SSR 的情況:

// 在 SSR 中使用對象替代 localStorage
const SSRStorage = {
  map: {},
  setItem(v) {
    this.map[key] = v
  },
  getItem(key) {
    return this.map[key]
  }
}
let storage = null
// 判斷環(huán)境
if (!window) {
  storage = SSRStorage
} else {
  storage = window.localStorage
}
責任編輯:趙寧寧 來源: 前端之神
相關(guān)推薦

2016-03-02 15:13:54

面試開發(fā)者問題

2020-08-06 15:14:07

D語言編程語言

2022-04-30 18:42:38

Go編程語言

2024-11-05 09:42:59

開發(fā)軟件命令行

2024-03-25 11:03:38

Vue修飾符lazy

2022-01-05 08:56:20

Vue修飾符面試

2012-04-28 09:14:50

編程編程語錄

2021-10-27 14:55:57

Mark TextMarkdown編輯器

2021-01-14 23:14:40

開源Linux生產(chǎn)力應(yīng)用

2021-12-25 22:31:10

MarkWord面試synchronize

2021-11-08 09:18:01

CAS面試場景

2022-01-03 07:46:36

Linux應(yīng)用程序操作系統(tǒng)

2022-10-17 08:03:47

封裝vue組件

2021-12-16 18:38:13

面試Synchronize

2021-12-05 21:05:49

前端JSON API

2012-03-30 13:56:17

編程開發(fā)

2021-12-02 18:20:25

算法垃圾回收

2013-10-08 09:34:57

編程漫畫編程漫畫

2014-06-16 13:22:35

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美性生活一区二区三区 | 亚洲一区中文字幕 | 中文字幕高清免费日韩视频在线 | 欧美一级黄色免费 | 爽爽免费视频 | 黄色视频a级毛片 | 香蕉视频在线播放 | 99精品福利视频 | 国产高清精品在线 | 99一级毛片 | 韩国精品一区二区三区 | 国产欧美日韩综合精品一区二区 | 91久久国产综合久久91精品网站 | 国产视频一区二区 | 日韩av在线一区 | 亚洲视频中文 | 91久久| 天天操天天射综合网 | 亚洲视频免费在线播放 | 久久精品国产精品青草 | 色资源在线视频 | 91秦先生艺校小琴 | 色吧综合网 | 国产福利视频在线观看 | 日韩人体视频 | 亚洲欧美日韩精品久久亚洲区 | 久久久www成人免费无遮挡大片 | 欧美综合在线视频 | 日韩亚洲欧美综合 | 国产蜜臀97一区二区三区 | 精品美女| 欧美久久国产 | 成人a网| 天天色图 | 天堂资源最新在线 | 久草网免费 | 亚洲成av人片在线观看 | 五月综合久久 | 国产精品久久久久婷婷二区次 | 亚洲视频在线一区 | 日韩在线免费 |