ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

VueUse useJwt 响应式 JWT 解码指南:在 Vue 3 中优雅地解析 Token

2026/10/3 17:27:28 拓冰建站 浏览量
VueUse useJwt 响应式 JWT 解码指南:在 Vue 3 中优雅地解析 Token 前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载导读useJwt是 VueUse Integrations 集合中用于**响应式解码 JWTJSON Web Token**的工具函数它是对jwt-decode库的一层薄封装。在 Vue 3 应用中无论 Token 来自登录响应、LocalStorage 还是状态管理你都可以把它放进ref让header与payload自动随之更新。读完本文你将掌握useJwt的安装方式、完整用法、选项配置、泛型类型定制、响应式原理以及容错机制并了解它在仓库源码与测试中的真实实现。安装与依赖要求useJwt本身位于vueuse/integrations包中同时以可选方式依赖jwt-decode。根据 packages/integrations/useJwt/index.md 中的说明需要单独安装jwt-decodenpm install jwt-decode^4在 packages/integrations/package.json 中jwt-decode被声明为可选 peer 依赖jwt-decode: ^4且peerDependenciesMeta.jwt-decode.optional为true这意味着只有当你实际使用useJwt时才需要安装它不影响其他集成函数。如果你使用 pnpm还可以通过pnpm add jwt-decode^4安装。基本用法按照官方文档最简单的用法是将编码后的 JWT 字符串放入ref解构出header与payloadimport { useJwt } from vueuse/integrations/useJwt import { ref } from vue const encodedJwt ref(eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaWF0IjoxNTE2MjM5MDIyfQ.L8i6g3PfcHlioHCCPURC9pmXT7gdJpx3kOoyAfNUwCc) const { header, payload } useJwt(encodedJwt)这里传入的是jwt.io上经典的示例 Token解码后header.value{ alg: HS256, typ: JWT }payload.value{ sub: 1234567890, iat: 1516239022 }header与payload都是ComputedRef计算属性在模板中可以直接使用例如payload.value.sub。源码剖析useJwt 是如何工作的从源码 packages/integrations/useJwt/index.ts 可以看到useJwt的完整实现非常简洁核心是两层computed包住jwt-decode的解码函数import { jwtDecode } from jwt-decode import { computed, toValue } from vue const decodeWithFallback T extends object(encodedJwt: string, options?: JwtDecodeOptions): T | Fallback { try { return jwtDecodeT(encodedJwt, options) } catch (err) { onError?.(err) return fallbackValue as Fallback } } const header computed(() decodeWithFallbackHeader(toValue(encodedJwt), { header: true })) const payload computed(() decodeWithFallbackPayload(toValue(encodedJwt)))其中值得注意的三个实现细节toValue统一取值参数类型为MaybeRefOrGetterstring即普通字符串、ref或 getter 函数都可以传入toValue会在每次计算时取到最新值这是响应式的关键。header通过{ header: true }解码jwt-decode的JwtDecodeOptions.header选项让useJwt能把 Token 的 Header 段算法、类型等单独解码出来。错误兜底统一走decodeWithFallback解码失败时不会抛错而是触发onError回调并返回fallbackValue保证 UI 层始终能拿到稳定的值。此外在 packages/integrations/index.ts 中useJwt被统一 re-export因此你也可以直接import { useJwt } from vueuse/integrations。配置选项fallbackValue 与 onErroruseJwt接受第二个参数options类型为UseJwtOptionsFallback包含两个可选配置选项类型默认值作用fallbackValueFallbacknull解码遇到错误时返回的兜底值onError(error: unknown) void无解码失败时的错误回调接收原始异常例如想用空对象兜底并记录日志const { header, payload } useJwt(tokenRef, { fallbackValue: {}, onError: (err) console.warn(JWT 解码失败:, err), })测试用例 packages/integrations/useJwt/index.test.ts 验证了错误处理行为当传入bad-token时header.value与payload.value均为null且onError回调用vi.fn()监控会被调用说明解码失败时默认返回null并回调错误而不是抛出异常。泛型定制解码自定义字段JWT 的payload往往包含自定义 claim如name、role、foo等。useJwt支持通过泛型约束解码结果的类型且header与payload的类型可以分别指定interface CustomJwtHeader extends JwtHeader { foo: string } interface CustomJwtPayload extends JwtPayload { foo: string } const { header, payload } useJwtCustomJwtPayload, CustomJwtHeader(tokenRef) // header.value?.foo 与 payload.value?.foo 均获得类型提示默认泛型参数为Payload extends object JwtPayload、Header extends object JwtHeader、Fallback null其中JwtHeader、JwtPayload来自jwt-decode的内置类型定义。测试中通过传入带foo: bar自定义字段的 TokeneyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImZvbyI6ImJhciJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJmb28iOiJiYXIifQ.S5QwvREUfgEdpB1ljG_xN6NI3HubQ79xx6J1J4dsJmg断言header.value?.foo与payload.value?.foo均为bar验证了泛型解码的可行性。响应式更新机制useJwt的响应式能力由两个测试用例共同保障见 packages/integrations/useJwt/index.test.ts 的reactivity用例const jwt deepRef(encodedJwt.value) const { header, payload } useJwtCustomJwtPayload, CustomJwtHeader(jwt) // 初始 Token 无 foo 字段值为 undefined jwt.value encodedCustomJwt.value // 更换 Token 后header.value?.foo 与 payload.value?.foo 变为 bar也就是说只要传入的是ref或 getterToken 一变header与payload便自动重新解码。这与toValuecomputed的实现密不可分——计算属性会在依赖的响应式源变化时惰性重算。官方示例 packages/integrations/useJwt/demo.vue 中即用shallowRef持有 Token并将header、payload通过JSON.stringify(..., 2)渲染到页面上方便直观查看解码结果。在组件中实战登录态解析示例综合以上能力一个典型的应用场景是登录后把 Token 存入ref在页面中读取用户信息import { useJwt } from vueuse/integrations/useJwt import { shallowRef } from vue interface AuthPayload extends JwtPayload { sub: string name: string } // 假设来自登录接口或 localStorage const token shallowRef(localStorage.getItem(token) || ) const { header, payload } useJwtAuthPayload(token, { fallbackValue: { sub: , name: }, onError: () localStorage.removeItem(token), }) // 模板中{{ payload.name }}配套的demo.vue展示了同样思路的最小实现——持有 Token 的shallowRef加上useJwt的解构配合pre标签展示格式化后的 JSON。注意事项useJwt只负责解码不负责验签jwt-decode与useJwt都只做 base64 解码不校验签名签名验证应由后端完成如持有密钥的 Node.js 服务。版本匹配请使用jwt-decode^4与vueuse/integrations的 peer 依赖范围^4保持一致。导出路径可单独导入vueuse/integrations/useJwt也可以从vueuse/integrations整体导入见 packages/integrations/index.ts 的 re-export。解码失败不抛错默认返回null并回调onError需要区分未登录与Token 损坏场景时可通过fallbackValue提供语义化兜底值。总结useJwt以不足 60 行的源码见 packages/integrations/useJwt/index.ts把jwt-decode的静态解码升级为 Vue 3 响应式能力MaybeRefOrGetter入参、双computed输出、fallbackValue兜底、onError回调与泛型类型定制一应俱全并有完整的单元测试packages/integrations/useJwt/index.test.ts覆盖正常解码、错误兜底、自定义字段与响应式更新四条路径。对于需要在组件中即时展示用户信息、刷新 Token 后自动更新界面的场景它是一个开箱即用的轻量方案。赞分享前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载相关推荐在 Vue 应用中响应式读取浏览器地址VueUse useBrowserLocation 全面解析在 Vue 应用中响应式读取浏览器地址VueUse useBrowserLocation 全面解析 useBrowserLocation 是 VueUse 提AI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染VueUse useUrlSearchParams 指南在 Vue 3 应用中响应式读写 URL 查询参数VueUse useUrlSearchParams 指南在 Vue 3 应用中响应式读写 URL 查询参数 导读 useUrlSearchParams 是 VAI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染VueUse useMutationObserver 完全指南在 Vue 3 中响应式监听 DOM 树变化VueUse useMutationObserver 完全指南在 Vue 3 中响应式监听 DOM 树变化 useMutationObserver 是 Vue前端上一篇impress.js Toolbar 插件完全指南统一图形工具栏的启用、样式定制与插件扩展下一篇curl 的 Rust Hyper 后端集成指南从构建配置到内部实现原理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考