Radash logo

Radash

现代 TypeScript 工具函数库,以零依赖、强类型、异步感知为核心,定位为 Lodash 的轻量替代方案。

工具函数TypeScript异步工具零依赖

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 所缺乏的异步工具集(如 tryitretryparallelmapLimit 等)。

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 流程进行社区驱动开发,持续发布新版本。两个项目在当前阶段并存,开发者可根据需要选择。

基本信息

快速上手

安装

# 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 遵循四个核心原则:

  1. 现代(Modern):拥抱现代 JavaScript/TypeScript 特性,不兼容遗留模式
  2. 简单(Simple):API 设计直观,函数签名清晰,避免多态行为的歧义
  3. 类型安全(Typed):完全使用 TypeScript 编写,返回类型精确推导
  4. 强大(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):内置 tryitretryparallelmapLimitdeferguard 等异步工具,填补原生 JS 和 Lodash 的空白
  • 超小体积:~14.8 KB(minified)/ ~4.8 KB(gzipped),约为 Lodash 的 1/5
  • 原生 ESM + Tree-Shakable:无 CommonJS 兼容垫片,Tree-shaking 开箱即用
  • 确定性 API:函数行为可预测,输入类型与输出类型一一对应
  • 高可读写性:每个函数追求源码级别的可读性,便于理解和调试
  • 子路径导入:支持 radash/arrayradash/async 等子路径,进一步减小打包体积
  • 防抖/节流:内置 debouncethrottle,弥补部分轻量库的缺失

生态图

关键依赖

  • 零运行时依赖:生产环境无需安装任何额外包
  • 开发工具链:Jest(测试)、Rollup(构建)、Prettier(格式化)

相关生态

相关项目说明
RadashiRadash 的社区活跃分支,采用 RFC 流程,持续发布新版本
RemedaTypeScript 优先的工具库,支持 data-first/data-last 双模式
es-toolkit极致轻量的 TypeScript 工具库,~5 KB
Lodash传统 JavaScript 工具库巨头

Radashi 社区分支

Radashi(/rəˈdɑːʃi/)是 Radash 的社区维护版本,由 radashi-org 组织管理:

维度RadashRadashi
维护模式个人维护社区驱动
发布频率较低活跃,含 nightly beta
最新版本v12.1.1v12.7.2(稳定)/ v13.0.0-beta
发布渠道npmnpm + JSR
治理模式维护者驱动RFC 流程
自动化基础 CI自动基准测试 + 体积追踪

构建工具集成

  • Vite / Rollup:原生 ESM 完美支持,Tree-shaking 高效
  • Webpack 5+:完整兼容
  • Turbopack / esbuild:完整兼容
  • Node.js:原生 ESM 支持,无需转译

适用场景

  • 需要异步工具的项目tryitretryparallelmapLimit 等工具适合处理并发、错误恢复、超时控制等异步场景
  • TypeScript 新项目:替代 Lodash 的现代选择,类型安全开箱即用
  • 包体积敏感场景:微前端、Serverless、Edge Functions 等对冷启动和加载时间有严格要求的场景
  • 需要防抖/节流的轻量项目:不想为 debounce/throttle 单独引入一个库
  • 全栈 TypeScript 应用:前后端统一使用,无额外类型安装
  • 函数组合与管道处理:通过 chaincompose 构建数据转换管道
  • 对象操作密集型应用pickomitshakecrushmapKeys 等提供强大的对象处理能力

开发与工程化

开发流程

Radash 使用成熟的开发工具链:

# 克隆项目
git clone https://github.com/sodiray/radash.git
cd radash
 
# 安装依赖
yarn install
 
# 运行测试
yarn test
 
# 构建
yarn build

Radashi 社区版工程实践

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代码格式化

性能与安全

性能特点

指标RadashLodash说明
完整包体积(minified)~14.8 KB~69.8 KBRadash 约为 Lodash 的 1/5
Gzipped 体积~4.8 KB~24.4 KB传输体积优势明显
Tree-shaking原生 ESM,可靠需 lodash-esRadash 无 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

维度RadashLodashRemeda
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

维度RadashRadashi
维护活跃度较低活跃
治理模式个人维护社区驱动 + RFC
最新版本v12.1.1v12.7.2(稳定)
Beta 发布Nightly beta
基准测试自动 PR 基准测试
体积追踪PR 自动报告
JSR 支持
API 兼容性基准向后兼容,渐进增强

Radash 的独有优势

功能RadashLodash原生 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 可能有细微差异

学习资源

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