还记得第一次用 Lodash 的惊艳吗?
一行 _.debounce
搞定疯狂触发的搜索框,一个 _.cloneDeep
拯救被引用折磨的 Vuex 状态。
前端工具库的王者------Lodash
提到 Lodash ,几乎每一位前端开发者都能立刻想起它那句经典的广告语:"Make JavaScript easier"
。

在过去十年里,Lodash 几乎成了项目脚手架的默认选项:深拷贝用 cloneDeep
,数组去重用 uniq
,对象合并用 merge
......它就像一把瑞士军刀,把 ES5
时代那些冗长、易错的工具函数封装得井井有条。
然而,ES6 及后续标准的全面普及 ,让 Lodash 的光芒逐渐暗淡。
Array.from
、Object.assign
、可选链?.
、空值合并??
等原生语法糖,覆盖了 Lodash80%
的日常用例。Tree-Shaking
与Bundle
分析工具的兴起,让"按需引入"不再是 Lodash 的专利;相反,Lodash 的 ES5 底层实现 、庞大的 CommonJS 封装 反而成为打包体积的累赘。
一句话:我们能用一行原生语法搞定的功能,已经不想再为 Lodash 多付出哪怕 1 KB 的代价。
Lodash 的痛点 ------ ES5 时代的"老包袱"
-
诞生于 ES5,语法老旧
大量
arguments
对象、for
循环、函数嵌套,与现代箭头函数、解构格格不入,读源码像在"考古"。 -
Tree-Shaking 不友好
内部交叉引用成"蜘蛛网",只引一个
debounce
也打包 20+ 辅助函数。 -
巨型单包发布
CommonJS 默认导出整个命名空间,体积只增不减;想用 ESM 还得额外装
lodash-es
。 -
原生能力已覆盖
ES2020+ 已有
structuredClone
、Object.fromEntries
、Array.flatMap
等,Lodash 仍保留历史兼容分支。 -
配置繁琐
babel-plugin-lodash
、lodash-webpack-plugin
一出错就"一夜回到解放前"。 -
类型支持滞后
@types/lodash
与源码不同步,版本差异导致类型报错。
Radash & Radashi:下一代工具库双子星
当社区开始寻找 Lodash 的替代品时,Radash 横空出世:

- 100% TypeScript 编写,类型提示一步到位;
- 函数粒度的 ES Module 导出,天然支持 Tree-Shaking;
- 源码简洁、单测覆盖率高,社区反响热烈。
但好景不长,2023 年 9 月后,Radash 作者因精力原因 停止维护 。
于是,社区核心贡献者迅速分叉(fork),诞生了 Radashi ------ 一个"继承 + 超越"的活跃分支:

- ✅ 持续维护:每天都有 PR 合并,凌晨 5 点自动发 beta 包;
- ✅ 设计 ethos 公开透明,新增函数需符合社区 RFC;
- ✅ 性能门禁:每个 PR 自动跑 benchmark,拒绝负优化;
- ✅ 体积守护:新增函数若 >1 KB 即触发 review;
- ✅ 一键迁移 :
npm i radashi@^12
,全局替换from 'radash'
→from 'radashi'
,0 成本切换。
Radash vs Radashi:差异速览
维度 | Radash(已停更) | Radashi(活跃) |
---|---|---|
维护状态 | 2023-09 后无人响应 Issue | 每日合并 PR, nightly beta |
新增函数 | 停滞 | 社区票选 + RFC 流程 |
性能/体积监控 | 无 | PR 自动跑 benchmark & size-diff |
发布机制 | 人工发版,间隔长 | nightly beta、PR 预览包 |
文档 | 英文为主 | 多语言自动生成 + 持续更新 |
贡献门槛 | 单人维护 | 公开招募 Core Team |
Vue 3 极速上手(3 个片段,复制即跑)
下面所有示例基于 Vite + Vue 3 +
<script setup>
语法糖 ,TypeScript 开箱即用。
数组对象去重(unique
)
html
<script setup lang="ts">
import { unique } from 'radashi'
const users = ref([
{ id: 1, name: 'Ada' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Ada' } // 重复
])
const uniqueUsers = computed(() => unique(users.value, u => u.id))
</script>
<template>
<ul>
<li v-for="u in uniqueUsers" :key="u.id">{{ u.name }}</li>
</ul>
</template>
防抖搜索(debounce
)
html
<script setup lang="ts">
import { debounce } from 'radashi'
import { ref } from 'vue'
const keyword = ref('')
// 300 ms 防抖,自动推导类型
const onInput = debounce((e: Event) => {
keyword.value = (e.target as HTMLInputElement).value
// TODO: 触发搜索 API
}, 300)
</script>
<template>
<input placeholder="Search..." @input="onInput" />
<p>当前关键词:{{ keyword }}</p>
</template>
深拷贝 + 安全取值(cloneDeep
& get
)
html
<script setup lang="ts">
import { cloneDeep, get } from 'radashi'
import { reactive } from 'vue'
const source = reactive({ a: { b: [10, 20, 30] } })
const copy = cloneDeep(source)
// 安全读取深层路径,不存在返回默认值 0
const value = computed(() => get(copy, 'a.b.2', 0)) // 30
</script>
<template>
<p>深拷贝后读取:{{ value }}</p>
</template>
安装与 Tree-Shaking 提示
bash
# 推荐 pnpm
pnpm add radashi@^12
确保 vite.config.ts
开启 ESBuild 压缩即可自动摇树:
ts
export default defineConfig({
plugins: [vue()],
esbuild: { drop: ['console', 'debugger'] }
})
30 秒迁移指北(旧项目升级)
bash
# 1. 卸载旧库
npm remove radash lodash
# 2. 安装新库
npm i radashi@^12
# 3. 全局替换(VS Code)
# 查找:from 'radash'
# 替换:from 'radashi'
# 4. 构建/测试
npm run build && npm test
无报错即完成;若出现类型提示差异,对照官方 Lodash Parity 页面: https://radashi.js.org/lodash-parity 秒修。
写在最后
从 Lodash 的 "大而全" 到 Radashi 的 "小而精" ,前端工具库完成了从 "功能覆盖" 到 "体验优先" 的范式转移。
如果你正在用 Vue 3 启动一个新项目,或者想给旧项目做一次无痛减脂,Radashi 就是那个值得立刻接手的接力棒。
把
import _ from 'lodash'
留在过去,把
import { debounce } from 'radashi'
写进未来。
- radash 官方文档 :
https://radash.uihtm.com/
- radashi 官方文档 :
https://radashi.js.org/