Lodash
一个现代 JavaScript 实用工具库,提供模块化、高性能和丰富的增强功能,是前端开发中使用最广泛的工具函数库之一。
Lodash 是基于 MIT 协议的开源 JavaScript 实用工具库,提供 300+ 个经过充分测试的工具函数,覆盖数组、对象、字符串、函数等操作。npm 周下载量峰值超 7500 万次,GitHub 61.2k+ Stars,是 npm 生态中被依赖最多的包之一。2026 年初完成安全治理改革,重新进入活跃维护状态。
Lodash
一个现代 JavaScript 实用工具库,提供模块化、高性能和丰富的增强功能,是前端开发中使用最广泛的工具函数库之一。
技术简介说明
Lodash 是一个基于 MIT 协议的开源 JavaScript 实用工具库,由 John-David Dalton 于 2012 年创建。它从早期的 Underscore.js 分叉而来,经过十余年的发展,已成为 npm 生态中被依赖最多的包之一,覆盖超过 930 万个网站,npm 周下载量峰值达 7500 万次以上(所有变体合计约 24 亿次/周)。
Lodash 的核心价值在于:它通过提供 300+ 个经过充分测试、高性能的工具函数,极大地简化了 JavaScript 开发中处理数组、对象、字符串、函数等数据的繁琐操作。无论是数据遍历、格式转换、深拷贝、防抖节流还是函数组合,Lodash 都提供了经过优化的标准实现,帮助开发者避免重复造轮子。
2026 年初,Lodash 经历了重大的安全治理改革,从 OpenJS Foundation 接手了新的维护团队,结束了长达数年的维护停滞期,重新进入活跃维护状态。
基本信息
- 官网:https://lodash.com
- GitHub:https://github.com/lodash/lodash
- License:MIT
- 最新版本:v4.18.1(2026 年 4 月发布)
- GitHub Stars:61.2k+
- 主要维护者:John-David Dalton(创建者)、Ulises Gascón(现任核心维护者)、OpenJS Foundation
- npm 周下载量:约 2800 万~7500 万(主包);所有变体合计约 24 亿次/周
- TypeScript 支持:
@types/lodash(v4.17.24)
快速上手
安装
# npm
npm install lodash
# yarn
yarn add lodash
# pnpm
pnpm add lodash基础配置
Node.js(CommonJS):
const _ = require('lodash');ES Module:
import _ from 'lodash';
// 或按需导入
import cloneDeep from 'lodash/cloneDeep';浏览器(CDN):
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>TypeScript 配置:
npm install --save-dev @types/lodash最小示例
import _ from 'lodash';
// 深拷贝
const original = { a: 1, b: { c: 2 } };
const cloned = _.cloneDeep(original);
// 数组去重
const unique = _.uniq([1, 2, 1, 3, 2]); // [1, 2, 3]
// 对象默认值
const result = _.defaults({ a: 1 }, { a: 2, b: 3 }); // { a: 1, b: 3 }核心概念与架构
模块化设计
Lodash 采用高度模块化的架构设计,每个方法都是独立的模块,支持多种加载方式:
- 完整构建(Full Build):包含所有方法的单文件版本
- 核心构建(Core Build):精简版,仅包含最常用的方法
- 按方法类别加载:如
lodash/array、lodash/object - 单方法包:每个方法独立发布为 npm 包(如
lodash.clonedeep) - lodash-es:ES Module 版本,支持 tree-shaking
- lodash/fp:函数式编程版本,不可变数据、自动柯里化、数据置后
构建产物
| 构建版本 | 文件大小 | 说明 |
|---|---|---|
lodash.js | ~71 KB (gzip) | 完整构建 |
lodash.core.js | ~7 KB (gzip) | 核心构建 |
lodash.min.js | ~25 KB (gzip) | 压缩版 |
核心特性
- 300+ 工具函数:覆盖数组、对象、字符串、数字、集合、函数等操作
- 模块化加载:支持按需导入,减少打包体积
- 高性能实现:针对 V8 引擎深度优化,关键路径使用原生方法
- 跨平台兼容:支持浏览器、Node.js、Electron 等多种运行环境
- 函数式编程支持:通过
lodash/fp提供不可变数据、柯里化等 FP 特性 - 完善的 TypeScript 支持:通过
@types/lodash提供完整类型定义 - ES Module 版本:
lodash-es支持 tree-shaking,优化打包体积 - 广泛测试覆盖:跨 Chrome、Firefox、Safari、Edge、IE 11 等多浏览器测试
- 深拷贝与深比较:提供可靠的
_.cloneDeep、_.isEqual等深层操作方法 - 函数组合工具:
_.flow、_.flowRight、_.partial、_.curry等
生态图
关键依赖与衍生项目
| 项目 | 说明 |
|---|---|
lodash-es | ES Module 版本,支持 tree-shaking |
lodash/fp | 函数式编程变体 |
@types/lodash | TypeScript 类型定义 |
babel-plugin-lodash | Babel 插件,自动优化 lodash 导入 |
eslint-plugin-lodash | ESLint 规则,推荐最佳实践 |
社区生态
- npm 被依赖数:超过 20 万个包依赖 Lodash
- 网站使用量:约 930 万个网站使用
- 治理架构:OpenJS Foundation 旗下项目,设有技术指导委员会(TSC)
- 资金支持:获得 Sovereign Tech Agency(STA)投资
- 安全治理:采用 OpenJS Foundation CNA 机制处理 CVE
适用场景
- 数据处理与转换:数组去重、对象合并、数据格式化、分组排序等常见数据操作
- 深拷贝与深比较:需要安全地深拷贝复杂对象或进行深层相等判断时
- 函数防抖节流:UI 事件处理中的
debounce、throttle需求 - 模板字符串处理:
_.template提供轻量模板引擎能力 - 类型检测与转换:
_.isPlainObject、_.isArray、_.toString等类型操作 - 函数式编程辅助:柯里化、组合、偏函数等 FP 工具
- 跨环境兼容处理:需要兼容旧浏览器的项目中使用现代化的工具方法
开发与工程化
按需导入策略
// ✅ 推荐:按需导入
import cloneDeep from 'lodash/cloneDeep';
import isEqual from 'lodash/isEqual';
// ❌ 不推荐:全量导入
import _ from 'lodash';构建优化
- 使用
babel-plugin-lodash自动将import _ from 'lodash'转换为按需导入 - 使用
lodash-es配合 Webpack/Vite/Rollup 实现 tree-shaking - 使用
lodash-webpack-plugin进一步压缩 lodash 功能集
CI/CD 集成
# GitHub Actions 示例
- name: Install dependencies
run: npm ci
- name: Type check
run: npx tsc --noEmit
- name: Build
run: npm run build性能与安全
性能特点
- Lodash 内部大量使用原生方法(如
Array.prototype.map),仅在原生不可用时回退到自定义实现 _.memoize可缓存函数结果,但需注意内存泄漏风险_.cloneDeep处理循环引用时有性能开销,建议评估是否真正需要深拷贝
安全注意事项
- 原型污染(Prototype Pollution):Lodash 历史上多次出现原型污染漏洞(CVE-2018-3721、CVE-2019-10744、CVE-2020-8203、CVE-2021-23337 等)
- CVE-2026-2950:2026 年初披露的
_.unset和_.omit原型污染漏洞,影响 v4.17.23 及更早版本 - 建议:始终使用最新版本(v4.18.1+),定期运行
npm audit - 2026 年 Lodash 引入了威胁模型(Threat Model)和事件响应计划(IRP)
已知性能瓶颈
- 全量导入会显著增加打包体积(~71 KB gzip)
_.cloneDeep对大型嵌套对象性能较差_.isEqual深度比较复杂对象时耗时较高
技术对比
| 特性 | Lodash | es-toolkit | Remeda | Ramda |
|---|---|---|---|---|
| 周下载量 | ~2800 万 | ~150 万 | ~50 万 | ~100 万 |
| Tree-shaking | 需 lodash-es | 原生支持 | 原生支持 | 部分支持 |
| TypeScript | @types/lodash | 原生 TS | 原生 TS | @types/ramda |
| 性能(基准) | 1x | 2-3x | ~1.5x | ~1x |
| 打包体积 | 较大 | 极小(-97%) | 小 | 中等 |
| 函数式风格 | 可选(fp) | 可选 | 数据优先 | 数据置后 |
| 维护状态 | 活跃(2026 重启) | 活跃 | 活跃 | 低活跃 |
| 兼容性 | 极广 | lodash compat 100% | 部分 | 独立 API |
最佳实践
推荐模式
// ✅ 按需导入
import debounce from 'lodash/debounce';
import cloneDeep from 'lodash/cloneDeep';
// ✅ 使用 lodash-es + tree-shaking
import { debounce, cloneDeep } from 'lodash-es';
// ✅ 使用 lodash/fp 进行函数式编程
import fp from 'lodash/fp';
const transform = fp.flow(
fp.filter(x => x > 0),
fp.map(x => x * 2)
);常见陷阱
- ❌ 全量导入
import _ from 'lodash'导致打包体积膨胀 - ❌ 使用
_.extend(已废弃),应使用_.assign或原生展开运算符 - ❌ 对原型污染风险函数(
_.merge、_.defaults)传入不可信数据 - ❌ 在新项目中盲目使用 lodash,部分功能已被原生 JS 替代(如
Array.from、Object.keys)
迁移建议
- 新项目优先考虑是否仍需要 lodash,原生 API 和
es-toolkit可能是更好的选择 - 存量项目建议从
lodash迁移到lodash-es以启用 tree-shaking - 使用
eslint-plugin-lodash强制规范导入方式
技术局限与边界
已知限制
- 非原生 ESM:主包
lodash仍为 CommonJS,ESM 需使用lodash-es - 体积较大:完整构建 ~71 KB gzip,在移动端场景下不够轻量
- 无内置 TypeScript:类型定义依赖社区维护的
@types/lodash,更新可能滞后 - 功能已冻结:官方声明"功能完整",不再增加新特性
- v5 尚无计划:社区对 v5 有讨论,但官方暂无正式发布计划
不适用场景
- 极小体积要求的场景(考虑
es-toolkit或原生 API) - 纯函数式编程项目(考虑 Ramda 或
lodash/fp) - 只需要少量工具函数的简单项目(考虑内联实现)
权衡取舍
- 选择 Lodash 意味着选择稳定性和生态,而非最新的性能或体积优化
- 2026 年的安全治理改革使长期可靠性得到保障,但短期版本变动需要关注
学习资源
- 官方文档
- Lodash 中文网
- GitHub 仓库
- The Future of Lodash — Ulises Gascón
- Lodash's Security Reset and Maintenance Reboot (Reddit)
- OpenJS Foundation: Lodash Security Overhaul
- npm 包指南
2026 年现状
最新版本
- v4.18.1(2026 年 4 月 1 日发布),修复了原型污染安全漏洞
发展趋势
- 安全治理改革:2026 年初完成了重大安全 overhaul,引入威胁模型、事件响应计划、CNA 机制
- 治理模式转变:从 BDFL(仁慈独裁者)模式转向技术指导委员会(TSC)分布式治理
- 活跃维护恢复:结束了 2021-2025 年的维护停滞期,新维护团队持续推进安全修复
- 生态整合计划:计划废弃大量变体包(lodash-amd 等),集中维护主库
- 渐进式现代化:未来版本将用原生函数逐步替换底层实现,但保留接口兼容
社区活跃度
- GitHub Stars:61.2k+
- npm 主包周下载量:2800 万~7500 万
- 仍然是 npm 上被依赖最多的包之一
- 新项目选择率有所下降,但存量项目依赖度极高
竞争格局
- es-toolkit 作为现代替代品快速崛起(2-3x 性能、97% 更小体积、原生 TS)
- Remeda 在函数式工具库领域获得关注
- 原生 JS API(
Array.prototype、Object、structuredClone)持续替代部分 lodash 功能 - Lodash 的核心竞争力在于生态规模、稳定性和兼容性,而非技术创新