es-toolkit
一个高性能、现代化的 JavaScript 工具库,比 Lodash 快 2-3 倍,包体积减小高达 97%,被誉为"现代 Lodash 的最佳替代品"。
es-toolkit 是由 Toss 开发的现代 JavaScript 工具库,利用最新 JS 特性重新实现常用工具函数。提供完整兼容 Lodash 的迁移层(compat)和函数式编程入口(fp),原生 TypeScript 支持,零依赖。被 Storybook、MUI、Recharts 等知名项目采用,npm 周下载量超 1000 万次,GitHub 11k+ Stars。
es-toolkit
一个高性能、现代化的 JavaScript 工具库,比 Lodash 快 2-3 倍,包体积减小高达 97%,被誉为"现代 Lodash 的最佳替代品"。
技术简介说明
es-toolkit 是由韩国金融科技公司 Toss(Viva Republica, Inc.)开发并开源的现代 JavaScript 实用工具库。它诞生于 2024 年,旨在解决 Lodash 在现代化 JavaScript 开发中的痛点——包体积过大、Tree-shaking 不友好、TypeScript 类型支持滞后等问题。es-toolkit 通过利用最新的 JavaScript 语言特性(如 Map、Set、structuredClone 等)重新实现了常用的工具函数,在保证功能完整性的同时,实现了显著的性能提升和体积缩减。
es-toolkit 的核心价值在于:它提供了一个完整兼容 Lodash 的迁移层(es-toolkit/compat),使得现有 Lodash 项目可以无缝切换;同时其原生 API 采用了更现代、更安全的设计,原生支持 TypeScript 类型推导,且默认支持 Tree-shaking。截至 2026 年,es-toolkit 已被 Storybook、Recharts、MUI、ink、CKEditor 等知名开源项目采用,npm 周下载量超过 1000 万次。
2026 年 6 月发布的 v1.49.0 版本新增了 es-toolkit/fp 入口点,提供数据在后(data-last)、可管道组合的函数式编程接口,进一步丰富了函数式编程生态。
基本信息
- 官网:https://es-toolkit.dev
- GitHub:https://github.com/toss/es-toolkit
- License:MIT
- 最新版本:v1.49.0(2026 年 6 月 26 日发布)
- GitHub Stars:11k+
- 主要维护者/公司:Toss(Viva Republica, Inc.)
- npm 周下载量:1000 万+
- TypeScript 支持:原生内置(从实现代码直接生成类型)
快速上手
安装
# npm
npm install es-toolkit
# yarn
yarn add es-toolkit
# pnpm
pnpm add es-toolkit
# Bun
bun add es-toolkit
# Deno (通过 JSR)
deno add jsr:@es-toolkit/es-toolkit浏览器(CDN 方式):
<!-- 使用 jsdelivr,暴露全局变量 _ -->
<script src="https://cdn.jsdelivr.net/npm/es-toolkit@^1"></script>
<script>
var arr = _.chunk([1, 2, 3, 4, 5, 6], 3);
</script>
<!-- 使用 esm.sh,ES Module 方式 -->
<script type="module">
import { chunk } from 'https://esm.sh/es-toolkit';
chunk([1, 2, 3, 4, 5, 6], 3);
</script>基础配置
es-toolkit 无需额外配置,安装后即可直接使用。它提供多个入口点以满足不同场景:
// 默认入口 —— 现代、高性能 API
import { chunk, sum, debounce } from 'es-toolkit';
// 兼容入口 —— 与 Lodash 100% 行为兼容
import { chunk, sum, debounce } from 'es-toolkit/compat';
// 函数式编程入口 —— data-last,支持管道组合
import { chunk, sum, debounce } from 'es-toolkit/fp';最小示例
import { chunk, sum, debounce, pick } from 'es-toolkit';
// 数组分块
chunk([1, 2, 3, 4, 5, 6], 3);
// => [[1, 2, 3], [4, 5, 6]]
// 数组求和
sum([1, 2, 3]);
// => 6
// 防抖函数
const save = debounce((data) => {
console.log('saving...', data);
}, 300);
// 对象裁剪
pick({ a: 1, b: 2, c: 3 }, ['a', 'c']);
// => { a: 1, c: 3 }核心概念与架构
es-toolkit 的架构设计遵循以下核心原则:
-
多入口点架构:提供三个独立的入口点,分别服务于不同需求:
es-toolkit:原生现代 API,不追求与 Lodash 的行为一致,而是采用更安全、更符合现代 JavaScript 的设计es-toolkit/compat:完整兼容 Lodash 行为,通过 Lodash 官方测试套件验证,支持无缝迁移es-toolkit/fp:函数式编程风格,data-last 参数顺序,支持pipe()组合
-
现代 JavaScript 优先:充分利用
Map、Set、structuredClone、Array.prototype.at()等现代 API,而非 Lodash 中为兼容旧环境而使用的 polyfill 实现 -
TypeScript 原生:类型定义直接从实现代码生成,而非像
@types/lodash那样独立维护,确保类型与运行时行为完全一致 -
零依赖:es-toolkit 不依赖任何第三方包,所有功能均为自实现
核心特性
- 极致性能:平均比 Lodash 快 2-3 倍,部分函数(如
pick、omit)快 3-4 倍 - 超小体积:单个函数体积比 Lodash 减少 72%-98%,如
sample仅 94 字节(Lodash 为 4817 字节) - 原生 TypeScript:类型从实现代码直接生成,类型推导精确,无需额外安装
@types包 - 完整 Tree-shaking 支持:基于 ESM 设计,未使用的函数在打包时自动移除
- Lodash 兼容层:
es-toolkit/compat通过 Lodash 官方测试验证,支持渐进式迁移 - 函数式编程支持:v1.49.0 新增
es-toolkit/fp入口,提供 data-last、pipeable 的函数式 API - 100% 测试覆盖:所有函数均有完整的单元测试覆盖
- 多环境支持:支持 Node.js(18+)、Deno、Bun 和所有现代浏览器
- 零依赖:无任何第三方依赖,降低供应链安全风险
- 丰富的函数覆盖:涵盖 Array、Object、String、Math、Function、Predicate、Promise、Map、Set 等 13 个类别
生态图
es-toolkit 生态系统
├── 核心包
│ ├── es-toolkit ──────────── 主包(现代 API)
│ ├── es-toolkit/compat ───── Lodash 兼容层
│ └── es-toolkit/fp ───────── 函数式编程入口(v1.49.0+)
├── 迁移工具
│ └── es-toolkit-codemod ──── 自动代码迁移工具(AST 转换)
├── 发布渠道
│ ├── npm ──────────────────── npm 主包
│ ├── JSR ──────────────────── Deno 原生包(@es-toolkit/es-toolkit)
│ └── CDN ──────────────────── jsdelivr / unpkg / esm.sh
├── 关键依赖
│ └── 零第三方依赖
├── 知名使用者
│ ├── Storybook ────────────── UI 组件开发工具
│ ├── Recharts ─────────────── React 图表库
│ ├── MUI ──────────────────── Material UI 组件库
│ ├── ink ──────────────────── React 终端 UI 框架
│ └── CKEditor ─────────────── 富文本编辑器
└── 社区生态
├── 官方文档 ─────────────── 多语言支持(含中文)
├── GitHub Discussions ───── 社区讨论
└── 迁移指南 ─────────────── 从 Lodash 迁移的完整文档
适用场景
- 新项目替代 Lodash:新项目可以直接使用 es-toolkit 作为 Lodash 的现代替代品,获得更好的性能和更小的包体积
- 渐进式迁移 Lodash 项目:通过
es-toolkit/compat入口,逐文件、逐函数地从 Lodash 迁移到 es-toolkit,零风险切换 - 包体积敏感的应用:PWA、移动端 Web、嵌入式 JS 等对包体积有严格要求的场景,es-toolkit 可以减少高达 97% 的体积
- TypeScript 项目:原生 TypeScript 支持,无需额外安装类型包,类型推导更精确
- Node.js 服务端:支持 Node.js 18+,适合服务端工具函数需求,特别是 Serverless/Edge 场景
- 函数式编程风格项目:v1.49.0+ 的
es-toolkit/fp入口支持 data-last、pipe 组合风格 - 高性能计算场景:数据处理、数值计算等对性能有较高要求的场景
开发与工程化
开发流程
es-toolkit 项目本身使用以下技术栈:
- 语言:TypeScript(严格模式)
- 包管理:pnpm
- 构建工具:tsup / rollup
- 测试框架:Vitest
- 代码规范:prettier + eslint
- CI/CD:GitHub Actions
在项目中集成
# 安装
pnpm add es-toolkit
# 如果从 Lodash 迁移,可同时安装 codemod 工具
pnpm add -D es-toolkit-codemod迁移工具使用
# 使用 codemod 自动将 Lodash 导入替换为 es-toolkit
npx es-toolkit-codemod ./srcCI/CD 集成
es-toolkit 作为纯工具库,无需特殊的 CI/CD 配置。在构建脚本中正常引用即可:
{
"scripts": {
"build": "vite build",
"test": "vitest",
"typecheck": "tsc --noEmit"
}
}性能与安全
性能特点
根据官方 Benchmark(测试环境:13th Gen Intel i5-13400F, 31.82 GB RAM, Node.js v24.11.1):
| 函数 | es-toolkit (ops/s) | Lodash (ops/s) | 性能提升 |
|---|---|---|---|
omit | 4,706,415 | 1,417,299 | 3.3x |
pick | 10,746,586 | 2,789,742 | 3.9x |
differenceWith | 18,522,078 | 5,651,942 | 3.3x |
difference | 12,202,488 | 6,828,896 | 1.8x |
intersectionWith | 16,926,995 | 4,958,866 | 3.4x |
intersection | 11,263,842 | 5,819,145 | 1.9x |
dropRightWhile | 17,841,876 | 12,320,166 | 1.4x |
包体积对比
| 函数 | es-toolkit | Lodash | 减少 |
|---|---|---|---|
sample | 94 B | 4,817 B | -98.0% |
difference | 90 B | 7,958 B | -98.9% |
pick | 132 B | 9,520 B | -98.6% |
zip | 221 B | 3,961 B | -94.4% |
sum | 93 B | 698 B | -86.7% |
debounce | 531 B | 2,873 B | -81.5% |
throttle | 855 B | 3,111 B | -72.5% |
安全注意事项
- es-toolkit 零第三方依赖,供应链攻击面极小
- 所有函数均经过完整测试覆盖
es-toolkit/compat经过 Lodash 官方测试套件验证- 项目使用 MIT 开源协议
已知性能注意事项
- 少数函数(如
union、groupBy)在特定场景下与 Lodash 性能持平或略低 - 性能优势在 V8 引擎(Chrome、Node.js)上最为显著;其他 JS 引擎(SpiderMonkey、JavaScriptCore)的收益可能略有差异
技术对比
与 Lodash 对比
| 维度 | es-toolkit | Lodash |
|---|---|---|
| 性能 | 平均 2-3x 更快 | 基准线 |
| 包体积 | 减少 72%-97% | 完整包约 70 KB (min) |
| TypeScript | 原生内置 | 需要 @types/lodash |
| Tree-shaking | 原生支持 | 需要 lodash-es + 配置 |
| 函数数量 | 200+(持续增长) | 300+ |
| 兼容性层 | es-toolkit/compat | N/A |
| 函数式编程 | es-toolkit/fp(v1.49.0+) | lodash/fp |
| 维护状态 | 活跃开发 | 2026 年恢复维护 |
| 多环境 | npm / JSR / CDN | npm / CDN |
| 社区成熟度 | 快速增长(11k+ stars) | 非常成熟(61k+ stars) |
与 Remeda 对比
| 维度 | es-toolkit | Remeda |
|---|---|---|
| 定位 | Lodash 直接替代品 | 类型安全的函数式工具库 |
| 兼容层 | 有(/compat) | 无 |
| 参数风格 | data-first(默认)/ data-last(/fp) | data-first + data-last 双版本 |
| 性能 | 更优(2-3x) | 良好 |
| 函数覆盖 | 更广 | 中等 |
与 Radash 对比
| 维度 | es-toolkit | Radash |
|---|---|---|
| 设计哲学 | 现代 Lodash | 简洁实用主义 |
| 性能优化 | 极致(Benchmark 驱动) | 适度 |
| TypeScript | 原生精确类型 | 良好 |
| 生态规模 | 更大,知名项目采用 | 较小,社区驱动 |
最佳实践
1. 新项目直接使用原生 API
// ✅ 推荐:使用原生 API
import { chunk, sum, pick } from 'es-toolkit';
// ❌ 不推荐:新项目直接用 compat 层
import { chunk, sum, pick } from 'es-toolkit/compat';2. 渐进式迁移 Lodash
// 阶段1:替换导入路径,行为不变
// 之前:import { chunk } from 'lodash';
import { chunk } from 'es-toolkit/compat';
// 阶段2:逐函数切换到原生 API
import { chunk } from 'es-toolkit';
// 阶段3:使用 codemod 自动迁移
// npx es-toolkit-codemod ./src3. 函数式编程风格
import { pipe } from 'es-toolkit/fp';
import { map, filter, take } from 'es-toolkit/fp';
// data-last + pipe 组合
const process = pipe(
filter((x: number) => x > 0),
map((x: number) => x * 2),
take(5)
);
process([-1, 2, 3, -4, 5, 6, 7]); // => [4, 6, 10]4. 避免同时导入两个入口
// ❌ 避免:同时导入会增加包体积
import { chunk } from 'es-toolkit';
import { debounce } from 'es-toolkit/compat';
// ✅ 推荐:统一使用一个入口
import { chunk, debounce } from 'es-toolkit';5. 利用 Tree-shaking
// ✅ 推荐:具名导入,Tree-shaking 友好
import { chunk, sum } from 'es-toolkit';
// ❌ 避免:默认导入整个库
import * as _ from 'es-toolkit';技术局限与边界
已知限制
- 函数覆盖不完整:es-toolkit 目前提供 200+ 个函数,而 Lodash 有 300+ 个。部分 Lodash 函数尚未实现(可通过
compat层弥补部分差距) - 行为差异:原生 API 与 Lodash 的行为不完全一致(设计如此),例如:
es-toolkit的某些函数不支持 Lodash 风格的iteratee简写(如字符串路径、属性匹配对象)- 类型检查函数可能比 Lodash 更严格
- fp 入口较新:
es-toolkit/fp在 v1.49.0(2026 年 6 月)才引入,函数覆盖仍在快速扩展中 - 社区生态尚在建设:相比 Lodash 十余年的生态积累,es-toolkit 的第三方扩展、教程、Stack Overflow 问答较少
不适用场景
- 需要精确复现 Lodash 行为:如果项目深度依赖 Lodash 的某些特殊行为(如
_.merge的递归合并规则),建议使用compat入口或保留 Lodash - 极老版本环境:es-toolkit 使用现代 JS 特性,不支持 IE11 等老旧环境(Node.js 需要 18+)
- 需要 Lodash 全部函数:如果项目使用了大量 Lodash 特有函数且 es-toolkit 尚未实现,迁移成本可能较高
迁移注意事项
- 从 Lodash 迁移前,先检查项目中使用的所有 Lodash 函数是否在 es-toolkit 中有对应实现
- 使用
es-toolkit/compat进行渐进式迁移,不要一次性全量替换 - 注意测试所有边界情况,特别是涉及
null、undefined、稀疏数组等边缘输入的行为差异
学习资源
- 官方文档:https://es-toolkit.dev(支持中文)
- 中文文档:https://es-toolkit.dev/zh_hans/intro.html
- 性能基准测试:https://es-toolkit.dev/performance.html
- 包体积对比:https://es-toolkit.dev/bundle-size.html
- 兼容层文档:https://es-toolkit.dev/compat/intro.html
- Toss 官方技术博客:https://toss.tech/article/es-toolkit
- GitHub 仓库:https://github.com/toss/es-toolkit
- npm 包:https://www.npmjs.com/package/es-toolkit
- JSR 包:https://jsr.io/@es-toolkit/es-toolkit
- 社区讨论:GitHub Discussions
2026 年现状
最新版本:v1.49.0(2026 年 6 月 26 日)
发展趋势:
- es-toolkit 在 2025-2026 年进入了高速增长期,npm 周下载量从百万级突破到千万级
- 2026 年 6 月发布的 v1.49.0 新增了
es-toolkit/fp函数式编程入口,标志着 API 设计走向成熟 - 项目持续获得高频更新,平均每月发布多个版本,函数覆盖快速扩展
- 被 Storybook、MUI、Recharts 等头部开源项目采用,社区信任度持续提升
社区活跃度:
- GitHub Stars:11,000+
- 贡献者:数百人
- Issue 响应迅速,PR 合并活跃
- 在 Reddit、Dev.to、LinkedIn 等平台获得广泛讨论和推荐
未来路线图:
- 持续扩展函数覆盖,目标是完整覆盖 Lodash 的所有常用函数
es-toolkit/fp入口将补充更多函数式编程工具- 继续优化性能和包体积
- 完善迁移工具(es-toolkit-codemod),降低从 Lodash 迁移的门槛
- 扩展多平台支持(Deno、Bun 的原生体验优化)