Nextjs实现Cookie、Localstorage、SessionStorage通用的方法

在使用Nextjs时,针对服务端和客户端实现统一调用本地存储信息,实现维护的统一管理,方便整个项目的维护拓展

js 复制代码
export type StorageType = 'local' | 'session' | 'cookie'

class UniversalStorage {
  private isServer = typeof window === 'undefined'

  /**
   * 设置存储
   * @param type 存储类型
   * @param key 键
   * @param value 值
   * @param days Cookie 特有的过期时间(天)
   */
  set(type: StorageType, key: string, value: any, days: number = 7): void {
    if (this.isServer) return

    const stringValue =typeof value === 'string' ? value : JSON.stringify(value)

    switch (type) {
      case 'local':
        window.localStorage.setItem(key, stringValue)
        break
      case 'session':
        window.sessionStorage.setItem(key, stringValue)
        break
      case 'cookie':
        const expires = new Date(Date.now() + days * 864e5).toUTCString()
        document.cookie = `${key}=${encodeURIComponent(stringValue)}; expires=${expires}; path=/; SameSite=Lax`
        break
    }
  }

  /**
   * 读取存储
   * @param type 存储类型
   * @param key 键
   */
  get<T>(type: StorageType, key: string): T | null {
    if (this.isServer) return null

    let val: string | null = null

    switch (type) {
      case 'local':
        val = window.localStorage.getItem(key)
        break
      case 'session':
        val = window.sessionStorage.getItem(key)
        break
      case 'cookie':
        const match = document.cookie.match(
          new RegExp('(^| )' + key + '=([^;]*)(;|$)'),
        )
        val = match ? decodeURIComponent(match[2]) : null
        break
    }

    try {
      return val ? JSON.parse(val) : null
    } catch (e) {
      return val as unknown as T // 如果不是 JSON 字符串则直接返回
    }
  }

  /**
   * 删除存储
   */
  remove(type: StorageType, key: string): void {
    if (this.isServer) return

    switch (type) {
      case 'local':
        window.localStorage.removeItem(key)
        break
      case 'session':
        window.sessionStorage.removeItem(key)
        break
      case 'cookie':
        document.cookie = `${key}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`
        break
    }
  }
}

export const storage = new UniversalStorage()

调用方法示例:

js 复制代码
import { storage, StorageType } from './storageutil'

export const TokenStorage = {
  name: 'token',
  get: async function (type: StorageType = 'local') {
    return await storage.get(type, this.name)
  },
  set: function (value: string, type: StorageType = 'local') {
    storage.set(type, this.name, value)
  },
  remove: function (type: StorageType = 'local') {
    storage.remove(type, this.name)
  },
}

通过上面的方法实现调用本地缓存数据方法的统一,也保证了缓存名称的可维护性。避免在每个组件中散落着cookie、localStorage、sessionStorage的读取以及名称的不可控。

相关推荐
moMo5 天前
NestJS 入门:用"模块化 + 装饰器"读懂大型后端框架
next.js
天道kabuto6 天前
前端每日知识点:Next.js 渲染与缓存:从 Pages Router 到 Cache Components 的范式迁移
next.js
名字还没想好☜8 天前
React 实现暗黑模式切换:localStorage 持久化、SSR 首屏闪烁与跟随系统主题
前端·javascript·react.js·ecmascript·react·next.js
Linguwen8 天前
AI外贸建站04|三个账号第一次联动:让Codex写一个网页,从生成到上线走完整条流水线
next.js·外贸独立站·企业官网·外贸建站·ai建站
Linguwen9 天前
AI外贸建站03|建站三件套:GitHub、Next.js、Codex各干什么,为什么别再用模板建站
next.js·外贸独立站·企业官网·外贸建站·ai建站
古夕11 天前
my-first-ai-web_学习记录05——NextAuth Adapter 存储用户信息
typescript·全栈·next.js
10年前端老司机11 天前
别卷CRUD了!前端用Next.js+LangChain.js,低成本冲进AI高薪赛道
前端·langchain·next.js
为你学会写情书13 天前
用 Redis 当数据库?Next.js 笔记系统的数据层设计
next.js
为你学会写情书13 天前
Next.js 16 全栈实战:从零搭一个 Markdown 笔记系统
next.js
Asize14 天前
框架的说明书是写给 AI 看的:我用 Next.js 搭了个博客
人工智能·代码规范·next.js