Lodash logo

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/arraylodash/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-esES Module 版本,支持 tree-shaking
lodash/fp函数式编程变体
@types/lodashTypeScript 类型定义
babel-plugin-lodashBabel 插件,自动优化 lodash 导入
eslint-plugin-lodashESLint 规则,推荐最佳实践

社区生态

  • npm 被依赖数:超过 20 万个包依赖 Lodash
  • 网站使用量:约 930 万个网站使用
  • 治理架构:OpenJS Foundation 旗下项目,设有技术指导委员会(TSC)
  • 资金支持:获得 Sovereign Tech Agency(STA)投资
  • 安全治理:采用 OpenJS Foundation CNA 机制处理 CVE

适用场景

  • 数据处理与转换:数组去重、对象合并、数据格式化、分组排序等常见数据操作
  • 深拷贝与深比较:需要安全地深拷贝复杂对象或进行深层相等判断时
  • 函数防抖节流:UI 事件处理中的 debouncethrottle 需求
  • 模板字符串处理_.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 深度比较复杂对象时耗时较高

技术对比

特性Lodashes-toolkitRemedaRamda
周下载量~2800 万~150 万~50 万~100 万
Tree-shaking需 lodash-es原生支持原生支持部分支持
TypeScript@types/lodash原生 TS原生 TS@types/ramda
性能(基准)1x2-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.fromObject.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 年的安全治理改革使长期可靠性得到保障,但短期版本变动需要关注

学习资源

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.prototypeObjectstructuredClone)持续替代部分 lodash 功能
  • Lodash 的核心竞争力在于生态规模、稳定性和兼容性,而非技术创新