just logo

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 环境中使用。

基本信息

快速上手

安装

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 的架构设计遵循极简主义原则:

  1. 单职责模块:每个 npm 包只导出一个函数,该函数只做一件事。这种设计让每个模块的代码量极小(通常几百字节到几 KB),且易于理解和测试。

  2. 零依赖原则:所有 just 模块都不依赖任何其他 npm 包(包括其他 just 模块)。这意味着每个模块都是完全自包含的,不存在传递依赖风险。

  3. 独立版本管理:每个子包有独立的版本号。当某个函数需要修改时,只需发布该子包的新版本,不影响其他函数。

  4. 双格式支持:每个模块同时提供 ESM 和 CommonJS 格式,无需转译即可在现代和传统环境中使用。

  5. 内置测试与类型:每个子包包含自己的测试文件和 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-shake

CI/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 + 构建配置
依赖链零依赖内部交叉依赖

安全注意事项

  • 零依赖:每个模块无任何第三方依赖,供应链攻击面极小
  • 代码透明:每个模块代码量极小(几十行到几百行),易于人工审查
  • 无动态执行:所有函数均为纯逻辑实现,无 evalFunction 构造器等动态代码执行
  • 浏览器兼容测试:跨多种浏览器版本测试

安全最佳实践

  • 定期检查安装的 just 模块版本
  • 虽然代码量小,但仍建议在 CI 中运行依赖安全扫描
  • 注意 just 模块的 MIT 协议兼容性

技术对比

与 Lodash 对比

维度justLodash
设计理念每个函数独立 npm 包统一工具库
安装方式npm install just-xxxnpm install lodash
依赖数量零依赖内部交叉依赖
单模块体积1-7 KB2-5 KB(单独包)
完整库体积不适用~70 KB (min)
Tree-shaking天然不需要需要 lodash-es + 配置
函数覆盖80+ 个模块300+ 个函数
TypeScript内置类型定义需要 @types/lodash
学习曲线低(简单直观)中(部分高级特性)
维护频率稳定维护(成熟期)2026 年恢复活跃维护
社区规模6.2k+ stars61k+ stars
迭代器简写不支持支持字符串路径、对象匹配等

与 es-toolkit 对比

维度justes-toolkit
模块化方式独立 npm 包统一包,按需导入
依赖零依赖零依赖
性能优化适度极致(2-3x 基准测试)
TypeScript内置原生精确类型
兼容层有(Lodash compat)
函数覆盖80+200+
维护状态成熟稳定快速增长
适用场景极致按需控制现代 Lodash 替代

与 Radash 对比

维度justRadash
模块化独立 npm 包统一包
TypeScript内置类型原生 TypeScript
设计风格极简单函数现代实用主义
函数覆盖80+60+
社区活跃度成熟稳定较新,活跃

最佳实践

1. 按需安装,避免完整包

# ✅ 推荐:只安装需要的模块
npm install just-extend just-clone just-safe-get
 
# ❌ 不推荐:安装完整包(可能引入未使用的代码)
npm install just

2. 直接导入,避免命名空间导入

// ✅ 推荐:直接导入函数
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 | undefined

5. 替换 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

学习资源

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