"Lodash" 的终极版!Vue、React 通杀!

还记得第一次用 Lodash 的惊艳吗?

一行 _.debounce 搞定疯狂触发的搜索框,一个 _.cloneDeep 拯救被引用折磨的 Vuex 状态。

前端工具库的王者------Lodash

提到 Lodash ,几乎每一位前端开发者都能立刻想起它那句经典的广告语:"Make JavaScript easier"

在过去十年里,Lodash 几乎成了项目脚手架的默认选项:深拷贝用 cloneDeep,数组去重用 uniq,对象合并用 merge......它就像一把瑞士军刀,把 ES5 时代那些冗长、易错的工具函数封装得井井有条。

然而,ES6 及后续标准的全面普及 ,让 Lodash 的光芒逐渐暗淡。

  • Array.fromObject.assign、可选链 ?.、空值合并 ?? 等原生语法糖,覆盖了 Lodash 80% 的日常用例。
  • Tree-ShakingBundle 分析工具的兴起,让"按需引入"不再是 Lodash 的专利;相反,Lodash 的 ES5 底层实现庞大的 CommonJS 封装 反而成为打包体积的累赘。

一句话:我们能用一行原生语法搞定的功能,已经不想再为 Lodash 多付出哪怕 1 KB 的代价

Lodash 的痛点 ------ ES5 时代的"老包袱"

  • 诞生于 ES5,语法老旧

    大量 arguments 对象、for 循环、函数嵌套,与现代箭头函数、解构格格不入,读源码像在"考古"。

  • Tree-Shaking 不友好

    内部交叉引用成"蜘蛛网",只引一个 debounce 也打包 20+ 辅助函数。

  • 巨型单包发布

    CommonJS 默认导出整个命名空间,体积只增不减;想用 ESM 还得额外装 lodash-es

  • 原生能力已覆盖

    ES2020+ 已有 structuredCloneObject.fromEntriesArray.flatMap 等,Lodash 仍保留历史兼容分支。

  • 配置繁琐
    babel-plugin-lodashlodash-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/
相关推荐
李剑一5 分钟前
面试官:你是如何理解MVVM模型的?请你结合自己做过的项目从框架层面解释一下
前端·面试
Likeyou79 分钟前
HTML无尽射击小游戏包含源码,纯HTML+CSS+JS
javascript·css·html
tiantian_cool11 分钟前
Flutter-1
前端
Befool15 分钟前
elpis - 前端全栈框架
javascript
前端Hardy15 分钟前
这个你一定要知道,如何使用Pandoc创建HTML网页版文档?
前端·javascript·css
babii15 分钟前
将数组数据下载为 csv 文件,上传 csv 文件解析为数组
javascript
前端小嘎17 分钟前
常见前端面试题 之 AI打字机效果是如何实现的?
前端·javascript
前端老鹰17 分钟前
CSS scrollbar-width:轻松定制滚动条宽度的隐藏属性
前端·css
_前端小弟18 分钟前
记录一次主题色自动适应方案
前端