Radash
现代 TypeScript 工具函数库,以零依赖、强类型、异步感知为核心,定位为 Lodash 的轻量替代方案。
Radash 是完全使用 TypeScript 编写的现代工具函数库,提供精确类型推导和独特的异步工具集(tryit/retry/parallel 等)。包体积仅约 4.8 KB(gzip),约为 Lodash 的 1/5。原生 ESM 输出、开箱即用的 Tree-shaking,GitHub 4.8k Stars。社区衍生分支 Radashi 采用 RFC 流程持续开发。
Radash
现代 TypeScript 工具函数库,以零依赖、强类型、异步感知为核心,定位为 Lodash 的轻量替代方案。
技术简介说明
Radash 是由前 Google 工程师 Ethan Dean(rayepps)创建的现代 TypeScript 工具函数库,设计哲学是「现代、简单、类型安全、强大」。它针对 Lodash 在 TypeScript 时代暴露的问题——外部类型定义不完整、不支持异步操作、包体积庞大——提出了系统性的解决方案。Radash 完全使用 TypeScript 编写,每个函数都具备精确的类型推导,且内置了 Lodash 所缺乏的异步工具集(如 tryit、retry、parallel、mapLimit 等)。
Radash 的包体积仅约 14.8 KB(minified)/ 4.8 KB(gzipped),约为 Lodash 的 1/5。它以零依赖、原生 ESM 输出、开箱即用的 Tree-shaking 为特色,确保在微前端和 Serverless 等对体积敏感的场景下表现优异。所有函数经过精心设计,追求可读性和健壮性的平衡。
截至 2026 年,Radash 拥有 4.8k GitHub Stars,周下载量约 40 万次。由于原仓库维护节奏放缓,社区衍生了活跃分支 Radashi(/rəˈdɑːʃi/),由 radashi-org 组织维护,采用 RFC 流程进行社区驱动开发,持续发布新版本。两个项目在当前阶段并存,开发者可根据需要选择。
基本信息
- 官网:https://radash-docs.vercel.app
- GitHub(Radash):https://github.com/sodiray/radash
- GitHub(Radashi 社区分支):https://github.com/radashi-org/radashi
- License:MIT
- 最新版本:v12.1.1(Radash)/ v12.7.2(Radashi 稳定版)
- 主要维护者/公司:Ethan Dean(rayepps)/ Radashi 社区组织
- GitHub Stars:4.8k+(Radash)
- npm 周下载量:约 400K
- 语言构成:TypeScript 74.1%、JavaScript 25.9%
- 提交历史:198+ commits
快速上手
安装
# npm
npm install radash
# pnpm
pnpm add radash
# yarn
yarn add radash
# 或使用社区分支 Radashi
npm install radashi基础配置
Radash 无需额外配置,安装后即可直接导入使用。支持原生 ESM 和按需子路径导入。
tsconfig.json 推荐配置:
{
"compilerOptions": {
"strict": true,
"moduleResolution": "bundler"
}
}最小示例
import { map, filter, group, sort, isArray, debounce } from 'radash'
// 数组操作
const numbers = [1, 2, 3, 4, 5]
const doubled = map(numbers, (n) => n * 2) // [2, 4, 6, 8, 10]
const evens = filter(numbers, (n) => n % 2 === 0) // [2, 4]
// 分组
const users = [
{ name: 'Alice', role: 'admin' },
{ name: 'Bob', role: 'user' },
{ name: 'Charlie', role: 'admin' },
]
const grouped = group(users, (u) => u.role)
// => { admin: [...], user: [...] }
// 排序
const sorted = sort(users, (u) => u.name)
// 类型守卫
if (isArray(data)) {
console.log('这是一个数组')
}
// 防抖
const debouncedSearch = debounce(searchFn, 300)按需子路径导入(更小的打包体积):
import { map } from 'radash/array'
import { debounce } from 'radash/curry'
import { isString } from 'radash/typed'核心概念与架构
设计理念
Radash 遵循四个核心原则:
- 现代(Modern):拥抱现代 JavaScript/TypeScript 特性,不兼容遗留模式
- 简单(Simple):API 设计直观,函数签名清晰,避免多态行为的歧义
- 类型安全(Typed):完全使用 TypeScript 编写,返回类型精确推导
- 强大(Powerful):覆盖常见操作场景,特别强化异步编程支持
确定性设计
Radash 刻意避免了 Lodash 中的「多态行为」。例如,Lodash 的 _.get() 可以接受多种参数类型并产生不同行为,而 Radash 的函数行为是确定的——给定相同类型的输入,总是产生相同类型的输出。这让 TypeScript 类型推导更加精确可靠。
模块组织
Radash 将函数按职责分为清晰的类别:
| 类别 | 说明 | 代表函数 |
|---|---|---|
| Array | 数组操作 | diff, group, sort, unique, boil, cluster, fork, merge, range, select, shift, sift, sum, toggle, zip |
| Async | 异步工具 | all, defer, guard, map, parallel, reduce, retry, sleep, tryit |
| Curry | 函数式工具 | chain, compose, debounce, memo, partob, throttle |
| Number | 数字处理 | inRange, toFloat, toInt |
| Object | 对象操作 | assign, clone, crush, get, invert, keys, listify, lowerize, mapEntries, mapKeys, mapValues, omit, pick, set, shake, upperize |
| Random | 随机生成 | draw, random, shuffle, uid, series |
| String | 字符串处理 | camel, capitalize, dash, pascal, snake, template, title, trim |
| Typed | 类型守卫 | isArray, isDate, isEmpty, isEqual, isFloat, isFunction, isInt, isNumber, isObject, isPrimitive, isPromise, isString, isSymbol |
核心特性
- 零依赖:无任何外部运行时依赖,降低供应链风险
- 完整的 TypeScript 类型:原生 TypeScript 编写,类型推导精确可靠
- 异步感知(Async-Aware):内置
tryit、retry、parallel、mapLimit、defer、guard等异步工具,填补原生 JS 和 Lodash 的空白 - 超小体积:~14.8 KB(minified)/ ~4.8 KB(gzipped),约为 Lodash 的 1/5
- 原生 ESM + Tree-Shakable:无 CommonJS 兼容垫片,Tree-shaking 开箱即用
- 确定性 API:函数行为可预测,输入类型与输出类型一一对应
- 高可读写性:每个函数追求源码级别的可读性,便于理解和调试
- 子路径导入:支持
radash/array、radash/async等子路径,进一步减小打包体积 - 防抖/节流:内置
debounce和throttle,弥补部分轻量库的缺失
生态图
关键依赖
- 零运行时依赖:生产环境无需安装任何额外包
- 开发工具链:Jest(测试)、Rollup(构建)、Prettier(格式化)
相关生态
| 相关项目 | 说明 |
|---|---|
| Radashi | Radash 的社区活跃分支,采用 RFC 流程,持续发布新版本 |
| Remeda | TypeScript 优先的工具库,支持 data-first/data-last 双模式 |
| es-toolkit | 极致轻量的 TypeScript 工具库,~5 KB |
| Lodash | 传统 JavaScript 工具库巨头 |
Radashi 社区分支
Radashi(/rəˈdɑːʃi/)是 Radash 的社区维护版本,由 radashi-org 组织管理:
| 维度 | Radash | Radashi |
|---|---|---|
| 维护模式 | 个人维护 | 社区驱动 |
| 发布频率 | 较低 | 活跃,含 nightly beta |
| 最新版本 | v12.1.1 | v12.7.2(稳定)/ v13.0.0-beta |
| 发布渠道 | npm | npm + JSR |
| 治理模式 | 维护者驱动 | RFC 流程 |
| 自动化 | 基础 CI | 自动基准测试 + 体积追踪 |
构建工具集成
- Vite / Rollup:原生 ESM 完美支持,Tree-shaking 高效
- Webpack 5+:完整兼容
- Turbopack / esbuild:完整兼容
- Node.js:原生 ESM 支持,无需转译
适用场景
- 需要异步工具的项目:
tryit、retry、parallel、mapLimit等工具适合处理并发、错误恢复、超时控制等异步场景 - TypeScript 新项目:替代 Lodash 的现代选择,类型安全开箱即用
- 包体积敏感场景:微前端、Serverless、Edge Functions 等对冷启动和加载时间有严格要求的场景
- 需要防抖/节流的轻量项目:不想为
debounce/throttle单独引入一个库 - 全栈 TypeScript 应用:前后端统一使用,无额外类型安装
- 函数组合与管道处理:通过
chain和compose构建数据转换管道 - 对象操作密集型应用:
pick、omit、shake、crush、mapKeys等提供强大的对象处理能力
开发与工程化
开发流程
Radash 使用成熟的开发工具链:
# 克隆项目
git clone https://github.com/sodiray/radash.git
cd radash
# 安装依赖
yarn install
# 运行测试
yarn test
# 构建
yarn buildRadashi 社区版工程实践
Radashi 社区版引入了更严格的工程标准:
- 自动基准测试:每个 PR 自动运行性能基准测试,防止性能回归
- 体积追踪:PR 自动报告 minified 字节大小变化
- Nightly Beta:每天 UTC 5:00 自动发布 beta 版本
- 预览构建:贡献者可在 PR 中评论触发预览构建
- 受保护的主分支:所有合并必须通过自动化检查
- RFC 流程:重大功能变更通过 RFC 征集社区意见
- Conventional Commits:遵循约定式提交规范
工具链
| 工具 | 用途 |
|---|---|
| Vitest(Radashi) | 测试框架 |
| Biome(Radashi) | 代码格式化 |
| PNPM(Radashi) | 包管理 |
| Rollup | 构建打包 |
| Jest(Radash) | 测试框架 |
| Prettier | 代码格式化 |
性能与安全
性能特点
| 指标 | Radash | Lodash | 说明 |
|---|---|---|---|
| 完整包体积(minified) | ~14.8 KB | ~69.8 KB | Radash 约为 Lodash 的 1/5 |
| Gzipped 体积 | ~4.8 KB | ~24.4 KB | 传输体积优势明显 |
| Tree-shaking | 原生 ESM,可靠 | 需 lodash-es | Radash 无 CJS 兼容代码 |
| 基础操作性能 | 与原生 JS 持平 | 与原生 JS 持平 | 差异不大 |
| 异步工具性能 | 优秀 | 无 | 独有优势 |
异步工具性能
Radash 的异步工具是核心差异化优势:
import { tryit, retry, parallel } from 'radash'
// tryit:Go/Rust 风格的错误处理
const [err, data] = await tryit(fetchUser)(userId)
// retry:指数退避重试
const data = await retry({ times: 3, delay: 1000 }, async () => {
return await fetchFromAPI()
})
// parallel:并发控制
const results = await parallel(5, urls, async (url) => {
return await fetch(url)
})安全注意事项
- 零依赖意味着零供应链攻击风险
- 所有代码经过 TypeScript 编译检查
- MIT 许可证,无商业使用限制
- 定期发布安全更新(通过版本迭代)
性能优化建议
- 使用子路径导入(
radash/array)进一步减小打包体积 parallel函数可控制并发数,避免同时发起过多请求memo函数可用于缓存计算结果,避免重复计算
技术对比
Radash vs Lodash vs Remeda
| 维度 | Radash | Lodash | Remeda |
|---|---|---|---|
| TypeScript 支持 | 原生编写 | 外部 @types | 原生编写 |
| 包体积 | ~14.8 KB | ~69.8 KB | ~8 KB |
| Gzipped | ~4.8 KB | ~24.4 KB | ~3 KB |
| Tree-shaking | 原生 ESM,可靠 | 需 lodash-es | 原生 ESM |
| 异步工具 | 丰富(tryit/retry/parallel 等) | 无 | 有限 |
| 防抖/节流 | 内置 | 内置 | 无 |
| Data-First/Data-Last | 仅 Data-First | 仅 Data-First | 双模式 |
| 惰性求值 | 不支持 | 需 chain() | pipe 内自动 |
| 函数数量 | ~90 | ~300 | ~200 |
| 零依赖 | 是 | 是 | 是 |
| 周下载量 | ~400K | ~45M | ~500K |
Radash vs Radashi
| 维度 | Radash | Radashi |
|---|---|---|
| 维护活跃度 | 较低 | 活跃 |
| 治理模式 | 个人维护 | 社区驱动 + RFC |
| 最新版本 | v12.1.1 | v12.7.2(稳定) |
| Beta 发布 | 无 | Nightly beta |
| 基准测试 | 无 | 自动 PR 基准测试 |
| 体积追踪 | 无 | PR 自动报告 |
| JSR 支持 | 无 | 有 |
| API 兼容性 | 基准 | 向后兼容,渐进增强 |
Radash 的独有优势
| 功能 | Radash | Lodash | 原生 JS |
|---|---|---|---|
tryit(错误优先回调) | 支持 | 无 | 需手动实现 |
retry(指数退避重试) | 支持 | 无 | 需手动实现 |
parallel(并发控制) | 支持 | 无 | Promise.all 无并发限制 |
defer(延迟清理) | 支持 | 无 | 需手动实现 |
guard(错误守卫) | 支持 | 无 | 需 try/catch |
shake(移除空值) | 支持 | 无 | 需手动实现 |
crush(对象扁平化) | 支持 | 无 | 需手动实现 |
最佳实践
1. 使用 tryit 替代 try/catch
import { tryit } from 'radash'
// 推荐:Go/Rust 风格的错误处理
const [err, user] = await tryit(getUser)(id)
if (err) {
console.error('获取用户失败:', err)
return
}
console.log('用户:', user)2. 使用 retry 处理不稳定的 API 调用
import { retry } from 'radash'
// 推荐:自动重试,指数退避
const data = await retry(
{ times: 3, delay: 1000 },
async (bail) => {
const res = await fetch('/api/data')
if (res.status === 404) {
bail(new Error('Not Found')) // 不再重试
}
return res.json()
}
)3. 使用 parallel 控制并发
import { parallel } from 'radash'
// 推荐:限制并发数为 5
const results = await parallel(5, userUrls, async (url) => {
const res = await fetch(url)
return res.json()
})4. 使用 shake 清理空值
import { shake } from 'radash'
const config = {
host: 'localhost',
port: 3000,
password: undefined,
timeout: null,
debug: false,
}
const cleanConfig = shake(config)
// => { host: 'localhost', port: 3000, debug: false }5. 使用子路径导入减小体积
// 推荐:只导入需要的模块
import { group, sort } from 'radash/array'
import { debounce, throttle } from 'radash/curry'
import { tryit, retry } from 'radash/async'
// 或统一入口(依赖 Tree-shaking)
import { group, sort, debounce, tryit } from 'radash'6. 善用类型守卫
import { isArray, isEmpty, isString } from 'radash'
function processInput(input: unknown) {
if (isString(input)) {
return input.toUpperCase() // TypeScript 知道 input 是 string
}
if (isArray(input)) {
return input.length // TypeScript 知道 input 是 unknown[]
}
if (isEmpty(input)) {
return null // TypeScript 知道 input 是 null | undefined | '' | [] | {}
}
}技术局限与边界
已知限制
- 函数数量较少:约 90 个函数,无法覆盖 Lodash 的所有场景(如 deep merge、深度路径操作等)
- 无惰性求值:不像 Remeda 那样在 pipe 中自动惰性求值
- 仅支持 Data-First:不支持 data-last 风格,无法直接用于 Ramda 风格的函数组合
- 类型推导不如 Remeda 精确:虽然类型支持良好,但不具备 Remeda 那种元组级别的类型收窄
- 社区规模有限:相比 Lodash 的庞大生态,文档和第三方资源较少
不适用场景
- 需要丰富函数库的项目:如需要 deep merge、complex path 操作等,Lodash 仍是更好选择
- 纯函数式编程:不支持 data-last 和 pipe 惰性求值,函数式风格受限
- 极端体积要求:es-toolkit(~5 KB)或 Remeda(~8 KB)更轻量
- 大型遗留项目迁移:函数覆盖率不足以完全替代 Lodash
迁移注意事项
- 从 Lodash 迁移时,部分函数无直接对应(如
_.merge、_.set的路径语法差异) radash.group对应lodash.groupBy,函数名不完全一致- 建议分类迁移:原生 JS 可替代的 → 立即替换;Radash 覆盖的 → 逐步迁移;Lodash 独有的 → 保留特定导入
- 若选择 Radashi 分支,注意 API 可能有细微差异
学习资源
- 官方文档:https://radash-docs.vercel.app
- Radashi 文档:https://radashi.js.org
- GitHub(Radash):https://github.com/sodiray/radash
- GitHub(Radashi):https://github.com/radashi-org/radashi
- JSR 包:https://jsr.io/@radashi-org/radashi
- npm 包:https://www.npmjs.com/package/radash
- 中文文档:https://radash.uihtm.com/en/
- 对比文章:Lodash vs Radash vs Native JavaScript 2026
- 技术博客:Radash: The New Lodash
- 视频介绍:radash, functional utility library - YouTube
- Reddit 讨论:What utility libraries do you use instead of Lodash?
2026 年现状
最新版本
- Radash:v12.1.1(原版,更新频率较低)
- Radashi:v12.7.2(稳定版,2026-02-24 发布)/ v13.0.0-beta(测试版)
- Radashi 保持每月或每两月一个稳定版本的节奏,Beta 版 nightly 发布
发展趋势
- 社区分裂与演进:Radash 原版维护放缓,Radashi 社区分支成为活跃主力
- RFC 驱动开发:Radashi 引入 RFC 流程,社区参与度提升,降低单人维护风险
- 自动化提升:Radashi 实现了 PR 级别的自动基准测试和体积追踪
- 双平台发布:Radashi 同时发布到 npm 和 JSR,覆盖 Node.js 和 Deno 生态
- 下载量稳定增长:Radash 周下载量约 40 万次,被列为 2026 年增长较快的工具库之一
未来路线图
- Radashi v13:计划中的大版本更新,可能包含破坏性变更
- NPM 发布权限扩展:Radashi 计划将 NPM 发布权限从个人扩展到核心团队
- 持续函数扩充:通过社区 RFC 新增实用函数
- 浏览器兼容性文档:Radashi 提供专门的浏览器兼容性说明页面
- 国际化文档:利用 LLM 自动化文档翻译
选型建议
| 场景 | 推荐选择 |
|---|---|
| 新项目、需要异步工具 | Radash / Radashi |
| 需要精确类型推导 | Remeda |
| 极致体积要求 | es-toolkit |
| 遗留项目、需要完整函数库 | Lodash |
| 纯函数式编程 | Ramda |
| 社区驱动、长期维护 | Radashi |