写点什么

Nuqs 是什么?GitHub 近万 Star,6KB 的体量,却让 URL 成了 React 的状态容器

作者:Daniel Curtis

  • 2025-12-20
    北京
  • 本文字数:1356 字

    阅读完需:约 4 分钟

大小:737.90K时长:04:11
Nuqs 是什么?GitHub 近万 Star,6KB 的体量,却让 URL 成了 React 的状态容器

适用于 React 的开源类型安全搜索参数状态管理器 Nuqs,于 2025 年 React Advanced 大会亮相,展示了 URL 状态管理如何为整个 React 生态的应用开发带来变革。


在 11 月 28 日于伦敦举行的 React Advanced 2025 大会上,自由软件工程师 François Best 介绍了他开发的开源库 Nuqs。该库目前已被 SentrySupabaseVercelClerk 等公司采用。演讲围绕一个核心主题展开:将应用状态存储在 URL 的查询参数中,能够解锁传统状态管理方式难以实现的能力。



Best 将“URL 状态”定义为把应用数据存储在 URL 的 query string 中,并将其带来的优势总结为两种“超能力”。第一种是“瞬移”(teleportation):用户可以分享一个链接,完整保留当前的应用状态,接收者打开后看到的界面与分享者完全一致,可以无缝继续操作。第二种是“时光回溯”(time travel):借助浏览器书签和历史记录,用户可以轻松回到应用曾经的任意状态。


在实现层面,Nuqs 用 useQueryState 替代了 React 中常见的 useState,实现组件状态与 URL 参数之间的自动同步。库内置了一系列解析器,可将 URL 字符串转换为整数、布尔值、日期等带类型的值,从而在整个应用中保证类型安全。通过适配器机制,Nuqs 支持主流 React 框架,包括 Next.js(App Router 与 Pages Router)、RemixReact Router 以及 TanStack Router


演讲还展示了 Nuqs 在应对 URL 状态管理常见问题方面的一些高级特性。“时间安全”(time safety)机制将 UI 更新与 URL 更新解耦,既能保持界面响应迅速,又能避免浏览器对 URL 更新频率的限制。节流(throttling)和防抖(debouncing)功能可防止在文本输入等高频交互场景下触发过多网络请求。通过与 React 的 useTransition 集成,在服务端渲染触发更新时还能显示加载指示。此外,Nuqs 支持 URL 键名映射,开发者可以在代码中使用语义清晰的变量名,同时为最终用户保留简洁、易读的 URL。


在测试方面,Nuqs 提供了专门的测试适配器,用于模拟所需功能,开发者可对初始 URL 值的加载过程与搜索参数的更新逻辑开展全面测试。Best 提到,该项目在 GitHub 上已接近 1 万颗 Star,目前主要由他在业余时间维护,同时也不断有社区贡献者加入。



Best 也强调了 URL 状态管理的一些重要限制。首先是 URL 长度的现实约束,用户更倾向于短且易读的链接。其次,一旦 URL 被分享,就无法再控制其内容,因此在修改查询参数结构时需要考虑迁移方案。出于安全原因,浏览器会对 URL 更新频率进行限制,这要求开发者谨慎设计状态更新逻辑。此外,URL 参数本身构成了应用的入口点,应用需设计健壮的状态机以处理用户的直接导航请求。


开发者社区对 Nuqs 的反响总体积极。一段名为《一款顶尖的类型安全 URL 状态管理器》的视频重点介绍了该库在解析、节流、默认值处理以及服务端渲染方面的能力。一位为 DevFullstack 撰稿的开发者甚至认为,Nuqs 有潜力取代 React 现有的状态管理方案,因为它在使用方式上与 useState 几乎完全一致,只是把状态存储在了 URL 中。


Nuqs 是由 François Best 主要维护的开源项目,采用 MIT 许可证,并在 GitHub 上保持活跃开发。该类库经 Gzip 压缩后体积约为 6KB,全面支持 TypeScript,并在服务端与客户端组件之间提供端到端的类型安全保障。


原文链接:

https://www.infoq.com/news/2025/12/nuqs-react-advanced/

2025-12-20 08:001

评论

发布
暂无评论

网络攻防学习笔记 Day36

穿过生命散发芬芳

网络攻防 6月日更

Python位运算符——详解

在即

6月日更

模块5 设计微博系统中”微博评论“的高性能高可用计算架构

Chris Cheng

架构实战营

MySQL普通索引的加锁

程序员小航

MySQL 数据库锁

JSON.parse无双引号如何实现转换

吴脑的键客

JavaScript

Go 并发基础

Damon

Go 语言 6月日更

架构实战营 - 模块 5- 作业

请弄脏我的身体

架构实战营

Go并发编程-channel多路复用

Rayjun

Go 语言 select

Hadoop实战篇(1)

进击的梦清

大数据 hadoop Linux

架构训练营模块5作业

Neil43

架构训练营

【译】JavaScript 代码整洁之道-函数篇

KooFE

JavaScript 大前端 函数 6月日更 整洁代码

Golang channel 通道

escray

学习 极客时间 Go 语言 6月日更

商业模式创新

soho

MySQL next-key lock 加锁范围是什么?

程序员小航

MySQL 索引 数据库锁 主键

web ssh解决方案——WGCLOUD

王逅逅

zabbix linux运维 运维监控

3种面向“对象”编程,你是哪一种?

凌晞

架构 研发管理

高级软件工程师必备的五大技能

架构精进之路

6月日更 软素质

设计微博系统中”微博评论“的高性能高可用计算架构

方堃

【Vue2.x 源码学习】第五篇 - 数组的劫持

Brave

源码 vue2 6月日更

模块5作业

wade

#架构实战营

如果父母依旧辛苦,那我们的成长又有什么意义?

牧小农

故事 父母

权限与认证:基于JWT的授权实现

程序员架构进阶

架构 JWT 认证授权 28天写作 6月日更

标识符与保留字(即关键字)

在即

6月日更

Java 并发编程—— CountDownLatch 应用

Antway

6月日更

架构实战营 模块五:学习总结

👈

架构实战营

看来,MySQL next-key lock 的 bug 并没有被修复!

程序员小航

MySQL 数据库锁

音频和视频流最佳选择?SRT协议解析及报文识别

明儿

音视频 协议 流媒体开发

可落地的积极心态

蛋先生DX

心态 6月日更

架构实战营 模块五:课后作业

👈

架构实战营

使用 Docker 安装并连接 MySQL

程序员小航

MySQL Docker

身为程序员 你真的会使用github搜索吗?

madison

GitHub GitHub Pages 高效搜索 搜索技巧

Nuqs 是什么?GitHub 近万 Star,6KB 的体量,却让 URL 成了 React 的状态容器_大前端_InfoQ精选文章