just
一个零依赖的模块化 JavaScript 工具库,每个函数都是独立的 npm 包,只做一件事,是 Lodash 等重型工具库的精简替代方案。
just 是由 Angus Croll 创建的开源工具库,核心理念是每个工具函数都是独立的 npm 包,零依赖,只做一件事。提供 80+ 个独立模块,涵盖数组、对象、字符串、统计等类别,单个模块通常 1-7 KB。同时支持 ESM 和 CommonJS,内置 TypeScript 类型定义,GitHub 6.2k+ Stars。
just
一个零依赖的模块化 JavaScript 工具库,每个函数都是独立的 npm 包,只做一件事,是 Lodash 等重型工具库的精简替代方案。
技术简介说明
just 是由 Angus Croll(Angus Croll 是 JavaScript 社区知名开发者、《JavaScript Syntax, Semantics & Design Patterns》作者)创建的开源工具库。它的核心理念是:每个工具函数都是一个独立的 npm 包,零依赖,只做一件事(a library of zero-dependency npm modules that do just one thing)。这种设计让你可以精确安装需要的函数,避免引入整个工具库带来的包体积浪费。
just 的设计哲学源自对 PWA(渐进式 Web 应用)和移动 Web 开发场景的深入思考。在网络条件较差的环境下,每个字节的 JavaScript 代码都影响加载性能。传统的工具库如 Lodash,即使只使用一两个函数,也可能引入数万字的冗余代码。just 通过将每个函数发布为独立包的方式,从根本上解决了这个问题——你安装的 just-extend 就只包含 extend 函数的代码,没有任何额外开销。
just 库提供了超过 80 个独立工具模块,涵盖数组、对象、字符串、数字、函数、集合、统计等类别。每个模块同时支持 ESM 和 CommonJS 格式,内置 TypeScript 类型定义和测试,并且可以在浏览器和 Node.js 环境中使用。
基本信息
- 官网:https://anguscroll.com/just/
- GitHub:https://github.com/angus-c/just
- License:MIT
- 最新版本:v1.22.4(主包);各子包独立版本管理
- GitHub Stars:6.2k+
- 主要维护者/公司:Angus Croll(个人维护)
- npm 发布包数量:80+ 个独立包(
just-*系列) - TypeScript 支持:内置类型定义
- 交互式 REPL:https://anguscroll.com/just/(基于 RunKit)
快速上手
安装
just 的每个工具函数都是独立的 npm 包,按需安装:
# 安装单个工具函数
npm install just-extend
npm install just-clone
npm install just-debounce-it
npm install just-throttle
npm install just-pick
npm install just-safe-get
# 使用 yarn
yarn add just-extend
# 使用 pnpm
pnpm add just-extend也可以安装完整包(包含所有工具函数):
npm install just基础配置
just 无需任何配置,安装后即可使用。每个包同时支持 ESM 和 CommonJS:
// CommonJS
const extend = require('just-extend');
const clone = require('just-clone');
// ESM
import extend from 'just-extend';
import clone from 'just-clone';最小示例
import extend from 'just-extend';
import clone from 'just-clone';
import compare from 'just-compare';
import pick from 'just-pick';
import debounce from 'just-debounce-it';
// 深拷贝
const original = { a: 1, b: { c: 2 } };
const copied = clone(original);
// 对象扩展(深/浅合并)
const target = { a: 1 };
const source = { b: { c: 2 } };
extend(true, target, source); // 深合并
// target => { a: 1, b: { c: 2 } }
// 深度比较
compare({ a: [1, 2, 3] }, { a: [1, 2, 3] }); // => true
// 选取对象属性
pick({ a: 1, b: 2, c: 3 }, ['a', 'c']); // => { a: 1, c: 3 }
// 防抖函数
const debouncedSave = debounce((data) => {
console.log('saving...', data);
}, 300);核心概念与架构
just 的架构设计遵循极简主义原则:
-
单职责模块:每个 npm 包只导出一个函数,该函数只做一件事。这种设计让每个模块的代码量极小(通常几百字节到几 KB),且易于理解和测试。
-
零依赖原则:所有 just 模块都不依赖任何其他 npm 包(包括其他 just 模块)。这意味着每个模块都是完全自包含的,不存在传递依赖风险。
-
独立版本管理:每个子包有独立的版本号。当某个函数需要修改时,只需发布该子包的新版本,不影响其他函数。
-
双格式支持:每个模块同时提供 ESM 和 CommonJS 格式,无需转译即可在现代和传统环境中使用。
-
内置测试与类型:每个子包包含自己的测试文件和 TypeScript 类型定义,确保代码质量和类型安全。
核心特性
- 零依赖:每个模块完全独立,无任何第三方或内部依赖
- 极小体积:单个模块通常 1-7 KB(unpacked),远比 Lodash 对应函数更小
- 按需安装:只安装需要的函数,不引入任何多余代码
- 双格式支持:同时支持 ESM 和 CommonJS,无需构建转译
- 内置 TypeScript:每个模块自带类型定义
- 浏览器兼容:支持 Chrome 46+、Safari 8+、Firefox 16+、Edge 12+、Node 6.0+
- 完整测试覆盖:每个模块都有对应的测试套件
- 交互式 REPL:官方提供在线 REPL,可以即时测试每个函数
- 模块化分类:按功能分为集合、对象、数组、统计、字符串、数字、函数等类别
- 可预测的行为:函数设计简单直观,无隐式类型转换和魔法行为
生态图
just 生态系统
├── 按类别组织的模块
│ ├── 集合(Collections)
│ │ ├── just-diff ─────────────── 计算两个值之间的 diff
│ │ ├── just-diff-apply ────────── 将 diff 应用到值
│ │ ├── just-compare ───────────── 深度比较
│ │ ├── just-clone ─────────────── 深拷贝
│ │ ├── just-pluck-it ──────────── 提取属性
│ │ └── just-flush ─────────────── 移除空值
│ ├── 对象(Objects)
│ │ ├── just-extend ────────────── 深/浅合并对象
│ │ ├── just-merge ─────────────── 合并对象
│ │ ├── just-pick ──────────────── 选取属性
│ │ ├── just-omit ──────────────── 排除属性
│ │ ├── just-values ────────────── 获取值数组
│ │ ├── just-entries ───────────── 获取键值对
│ │ ├── just-safe-get ──────────── 安全获取属性
│ │ ├── just-safe-set ──────────── 安全设置属性
│ │ ├── just-has ───────────────── 安全判断属性
│ │ ├── just-map-object ────────── 映射对象
│ │ ├── just-reduce-object ─────── 归约对象
│ │ ├── just-is-empty ──────────── 判断空值
│ │ ├── just-typeof ────────────── 精确类型判断
│ │ └── ...更多
│ ├── 数组(Arrays)
│ │ ├── just-unique ────────────── 去重
│ │ ├── just-flatten-it ────────── 扁平化
│ │ ├── just-index ─────────────── 建立索引
│ │ ├── just-intersect ─────────── 交集
│ │ ├── just-union ─────────────── 并集
│ │ ├── just-remove ────────────── 移除元素
│ │ ├── just-group-by ──────────── 分组
│ │ ├── just-sort-by ───────────── 排序
│ │ ├── just-partition ─────────── 分割
│ │ ├── just-range ─────────────── 生成范围
│ │ ├── just-zip-it ────────────── 压缩
│ │ └── ...更多
│ ├── 统计(Statistics)
│ │ ├── just-mean ──────────────── 平均值
│ │ ├── just-median ────────────── 中位数
│ │ ├── just-mode ──────────────── 众数
│ │ ├── just-percentile ────────── 百分位数
│ │ ├── just-variance ──────────── 方差
│ │ ├── just-standard-deviation ── 标准差
│ │ └── just-skewness ──────────── 偏度
│ ├── 字符串(Strings)
│ │ ├── just-template ──────────── 模板替换
│ │ ├── just-truncate ──────────── 截断
│ │ ├── just-camel-case ────────── 驼峰命名
│ │ ├── just-kebab-case ────────── 短横线命名
│ │ ├── just-snake-case ────────── 下划线命名
│ │ ├── just-pascal-case ───────── 大驼峰命名
│ │ ├── just-capitalize ────────── 首字母大写
│ │ └── ...更多
│ ├── 数字(Numbers)
│ │ ├── just-clamp ─────────────── 限制范围
│ │ ├── just-is-prime ──────────── 判断素数
│ │ ├── just-modulo ────────────── 模运算
│ │ └── just-random-integer ────── 随机整数
│ └── 函数(Functions)
│ ├── just-debounce-it ───────── 防抖
│ ├── just-throttle ──────────── 节流
│ ├── just-curry-it ──────────── 柯里化
│ ├── just-compose ───────────── 函数组合
│ ├── just-pipe ──────────────── 管道
│ ├── just-memoize ───────────── 缓存
│ ├── just-partial-it ────────── 偏函数
│ ├── just-once ──────────────── 执行一次
│ └── ...更多
├── 发布渠道
│ └── npm ────────────────────────── 每个模块独立发布
├── 关键依赖
│ └── 零依赖
└── 社区生态
├── 交互式 REPL ────────────────── 在线测试
├── Syntax FM 播客推荐 ─────────── 社区推广
└── GitHub Issues ──────────────── 社区讨论
适用场景
- PWA / 移动 Web 开发:在网络条件差的环境下,每个字节都很重要,just 的按需安装模式可以最大限度减少 JS 体积
- 包体积敏感的项目:当项目对 bundle size 有严格要求时,just 的单模块通常只有 1-7 KB
- Serverless / Edge 函数:冷启动时间对代码体积敏感的场景,just 的极简模块可以快速加载
- 学习 JavaScript 基础:just 的每个函数实现简单直观,是学习 JavaScript 工具函数实现原理的优秀参考
- 微前端 / Widget 开发:嵌入式组件需要最小化依赖,just 的零依赖模块非常适合
- 需要精确控制依赖的项目:安全审计、合规要求等需要严格控制第三方依赖的场景
- Node.js CLI 工具:CLI 工具需要快速启动,just 的轻量模块可以减少加载时间
开发与工程化
开发流程
just 项目使用简单的开发工具链:
- 语言:JavaScript + TypeScript 类型定义
- 测试:每个模块内置测试
- 构建:轻量级构建脚本
- 发布:每个模块独立发布到 npm
在项目中集成
# 按需安装需要的工具函数
npm install just-extend just-clone just-compare just-safe-get
# 或安装完整包(包含所有模块)
npm install just使用完整包
// 使用完整包时,通过子路径导入
import extend from 'just/extend';
import clone from 'just/clone';
// 注意:完整包方式可能无法完全 tree-shakeCI/CD 集成
just 作为纯工具库,无需特殊 CI/CD 配置。由于每个模块零依赖,安全扫描和依赖审计非常简便。
性能与安全
性能特点
just 模块由于实现极简,通常比大型工具库更快:
- 每个模块的代码量极小,解析和执行开销低
- 无依赖链查找开销
- 无复杂的参数类型判断和兼容逻辑
- 社区讨论中提到,
just-union比 Lodash 等价实现快约 840 倍
包体积对比
| 维度 | just 模块 | Lodash |
|---|---|---|
| 单个函数(典型) | 1-7 KB (unpacked) | 2-5 KB (单独包) |
| 完整库 | 无"完整库"概念 | ~70 KB (min) / ~24 KB (gzip) |
| Tree-shaking | 天然不需要(按需安装) | 需要 lodash-es + 构建配置 |
| 依赖链 | 零依赖 | 内部交叉依赖 |
安全注意事项
- 零依赖:每个模块无任何第三方依赖,供应链攻击面极小
- 代码透明:每个模块代码量极小(几十行到几百行),易于人工审查
- 无动态执行:所有函数均为纯逻辑实现,无
eval、Function构造器等动态代码执行 - 浏览器兼容测试:跨多种浏览器版本测试
安全最佳实践
- 定期检查安装的 just 模块版本
- 虽然代码量小,但仍建议在 CI 中运行依赖安全扫描
- 注意 just 模块的 MIT 协议兼容性
技术对比
与 Lodash 对比
| 维度 | just | Lodash |
|---|---|---|
| 设计理念 | 每个函数独立 npm 包 | 统一工具库 |
| 安装方式 | npm install just-xxx | npm install lodash |
| 依赖数量 | 零依赖 | 内部交叉依赖 |
| 单模块体积 | 1-7 KB | 2-5 KB(单独包) |
| 完整库体积 | 不适用 | ~70 KB (min) |
| Tree-shaking | 天然不需要 | 需要 lodash-es + 配置 |
| 函数覆盖 | 80+ 个模块 | 300+ 个函数 |
| TypeScript | 内置类型定义 | 需要 @types/lodash |
| 学习曲线 | 低(简单直观) | 中(部分高级特性) |
| 维护频率 | 稳定维护(成熟期) | 2026 年恢复活跃维护 |
| 社区规模 | 6.2k+ stars | 61k+ stars |
| 迭代器简写 | 不支持 | 支持字符串路径、对象匹配等 |
与 es-toolkit 对比
| 维度 | just | es-toolkit |
|---|---|---|
| 模块化方式 | 独立 npm 包 | 统一包,按需导入 |
| 依赖 | 零依赖 | 零依赖 |
| 性能优化 | 适度 | 极致(2-3x 基准测试) |
| TypeScript | 内置 | 原生精确类型 |
| 兼容层 | 无 | 有(Lodash compat) |
| 函数覆盖 | 80+ | 200+ |
| 维护状态 | 成熟稳定 | 快速增长 |
| 适用场景 | 极致按需控制 | 现代 Lodash 替代 |
与 Radash 对比
| 维度 | just | Radash |
|---|---|---|
| 模块化 | 独立 npm 包 | 统一包 |
| TypeScript | 内置类型 | 原生 TypeScript |
| 设计风格 | 极简单函数 | 现代实用主义 |
| 函数覆盖 | 80+ | 60+ |
| 社区活跃度 | 成熟稳定 | 较新,活跃 |
最佳实践
1. 按需安装,避免完整包
# ✅ 推荐:只安装需要的模块
npm install just-extend just-clone just-safe-get
# ❌ 不推荐:安装完整包(可能引入未使用的代码)
npm install just2. 直接导入,避免命名空间导入
// ✅ 推荐:直接导入函数
import extend from 'just-extend';
import clone from 'just-clone';
// ❌ 避免:使用完整包的命名空间导入
import just from 'just';3. 组合使用 just 模块
import extend from 'just-extend';
import clone from 'just-clone';
import pick from 'just-pick';
import omit from 'just-omit';
// 组合多个 just 函数实现复杂逻辑
const sanitizeUser = (user) => {
const safeUser = clone(user);
const publicData = pick(safeUser, ['id', 'name', 'email']);
return publicData;
};4. 在 TypeScript 项目中使用
import extend from 'just-extend';
import safeGet from 'just-safe-get';
// just 模块内置类型定义
interface Config {
database: {
host: string;
port: number;
};
}
const config: Config = {
database: { host: 'localhost', port: 5432 }
};
// 类型安全的属性获取
const host = safeGet(config, 'database.host'); // string | undefined5. 替换 Lodash 时的注意事项
// Lodash: _.get(obj, 'a.b.c', defaultValue)
// just: safeGet(obj, 'a.b.c') — 注意:不支持默认值参数
// Lodash: _.merge({}, defaults, options)
// just: extend(true, {}, defaults, options)
// Lodash: _.cloneDeep(obj)
// just: clone(obj)
// Lodash: _.isEqual(a, b)
// just: compare(a, b)技术局限与边界
已知限制
- 函数覆盖有限:just 提供 80+ 个模块,远少于 Lodash 的 300+ 个函数。部分复杂功能(如深度路径操作、复杂 iteratee 简写)不支持
- 无 iteratee 简写:just 函数不接受 Lodash 风格的字符串路径、对象匹配等简写形式,必须传递函数
- 无 Lodash 兼容层:不像 es-toolkit 提供
/compat入口,just 无法无缝替换 Lodash - 更新频率较低:just 已进入成熟稳定期,新功能添加较少,不像 es-toolkit 那样快速增长
- 无函数式编程入口:没有类似 Lodash
fp或 es-toolkit/fp的 data-last 管道式 API - 部分模块功能简单:某些模块(如
just-is-prime)功能过于简单,自行实现也很方便
不适用场景
- 复杂数据处理管道:需要链式调用大量工具函数时,独立安装每个包会变得繁琐
- 需要 Lodash 完整功能:如果项目深度使用 Lodash 的高级特性(如 iteratee 简写、
_.flow、_.partialRight等),just 无法完全替代 - 团队偏好统一工具库:如果团队更倾向于使用单一工具库而非管理数十个小包
- 快速原型开发:需要大量不同工具函数时,逐个安装效率较低
迁移注意事项
- just 的函数签名和返回值可能与 Lodash 不完全一致,迁移时需要逐一验证
- just 的
extend与 Lodash 的_.merge在处理数组时的行为不同 - just 没有
_.defaults、_.defaultsDeep等默认值合并函数 - 部分 just 模块名称与 Lodash 不同(如
just-compare对应_.isEqual)
学习资源
- 官方文档 / REPL:https://anguscroll.com/just/
- GitHub 仓库:https://github.com/angus-c/just
- 作者博文《Why I wrote Just》:https://medium.com/@angustweets/just-a12d54221f65
- Syntax FM 播客推荐:https://syntax.fm/show/397
- Context7 文档:https://context7.com/angus-c/just
- npm 主页(angus-c):https://www.npmjs.com/~angus-c
- GitHub Issues:https://github.com/angus-c/just/issues
- Reddit 社区讨论:r/javascript
2026 年现状
最新版本:v1.22.4(主包);各子包独立版本管理
发展趋势:
- just 已进入成熟稳定期,核心功能完善,新增模块较少
- 大部分 npm 子包最近一次发布在 2022-2023 年间,说明核心功能已经稳定
- 项目仍保持基本维护状态,有 issue 响应和 PR 合并(最近 issue 在 2025 年 10 月)
- 在 PWA、嵌入式 JS、包体积优化等场景中仍是社区推荐的选择
社区活跃度:
- GitHub Stars:6,200+
- 社区讨论主要在 GitHub Issues
- 在 Reddit、Syntax FM 等平台被推荐为"轻量 Lodash 替代"
- 相比 es-toolkit 等新兴库,社区增长速度较慢
未来展望:
- just 更适合作为"稳定可靠的老牌工具",而非追求最新特性
- 在 Tree-shaking 日趋成熟的今天,es-toolkit 等统一包 + Tree-shaking 的方案可能在开发体验上更具优势
- 但对于需要极致按需控制、零依赖保证的场景,just 仍然是不可替代的选择
- 如果项目已经有稳定的 just 依赖,无需迁移;新项目可根据团队偏好选择 just 或 es-toolkit