大家好,我是你们的老朋友。
最近 Bun 社区又炸锅了,Bun 1.4 版本正式发布,这次的更新在依赖管理上做了一个非常“粗暴”且高效的操作:秒删 15 个依赖。很多同学看到这个标题可能觉得夸张,但实测下来确实非常快。与其看推特上零散的信息流,不如自己动手装一个,把新功能跑一遍。
本文将围绕 Bun 1.4 的核心变化展开,重点拆解它在依赖安装、依赖删除、运行时兼容性上的实际表现,同时科普一下 Bun 在 JavaScript/TypeScript 生态中的定位,帮新手理清它和 npm、pnpm、yarn 的区别。无论你是前端新手还是全栈老手,这篇文章都能帮你快速上手 Bun 1.4,并避开一些常见的“坑”。
1. 背景:Bun 是什么,为什么它能“秒删依赖”
1.1 Bun 的定位
Bun 是一个 JavaScript 运行时,同时也是一套自带工具链的现代化开发底座。它由 JavaScript 社区的知名开发者 Jarred Sumner 发起,使用 Zig 语言编写,底层打包了 JavaScriptCore 引擎(WebKit 的 JS 引擎),因此在启动速度、脚本执行效率上有非常明显的优势。
通俗点说,你可以把它理解成:
- Node.js 的替代运行时。
- npm/yarn/pnpm 的替代包管理器。
- webpack/vite/esbuild 的替代打包工具链。
- Jest/Vitest 的一种测试运行器选择。
Bun 的目标不是做一个“更快一点点”的 Node.js,而是把前端/后端开发中最常用的几大工具链统一起来,让安装、构建、运行、测试这几步全部跑在一个二进制文件内。
1.2 为什么 Bun 删依赖那么快
传统包管理器(npm、yarn classic)在删除依赖时,主要时间花在:
- 解析 lockfile。
- 计算依赖树。
- 删除 node_modules 中相关的包目录。
- 更新 lockfile 并写回磁盘。
当依赖数量动辄几百上千时,node_modules 里目录多、文件多,删除操作在 Windows 上尤其慢。Bun 则采用了**全局内容寻址存储(Global Content Addressable Store)**的方式,它不会像 npm 那样把每个包平铺或嵌套复制到项目的 node_modules 里,而是把文件内容缓存到一个公共目录中,项目里的 node_modules 更多只是“链接”或“视图层”。
这样一来,删除依赖时就少了很多物理文件删除操作,速度自然快很多。
1.3 这次 1.4 版本的“秒删 15 个依赖”意味着什么
从社区反馈和实测来看,Bun 1.4 在bun remove命令上做了专项优化,删除 15 个依赖时几乎瞬时完成。这不是简单的 Benchmark 跑分,而是它架构优势的体现。如果你经历过 npm 删一个包删 10 秒、Windows 上删 node_modules 等半分钟的场景,就知道这个提升对日常开发体验有多大。
2. 环境准备:安装 Bun 1.4 与版本确认
2.1 安装 Bun
Bun 的安装方式非常统一,官方推荐使用 curl 脚本安装:
curl -fsSL https://bun.sh/install | bash安装完成后,Bun 会被安装到当前用户目录下:
~/.bun/bin/bun你需要把 Bun 的 bin 目录加入 PATH。安装脚本通常会自动帮你配置,但如果你使用的是自定义 shell(比如 zsh),也可能需要手动添加。
2.2 验证版本
安装完成后,打开新的终端窗口,运行:
bun --version如果输出类似:
1.4.0说明安装成功。由于 Bun 迭代非常快,如果你的版本已经高于 1.4,那本篇文章中的功能依然适用,只是某些细节可能略有差异。
2.3 其他环境说明
- 操作系统:本文示例以 macOS/Linux 为主,Windows 用户可以使用 WSL2 或使用 Bun 官方提供的 Windows 原生支持。
- Node.js:Bun 1.4 仍然兼容很多 Node.js API,但并非所有模块都已实现,生产环境建议保持 Node.js 版本可切换。
- 包管理器:本文重点讲 Bun,但仍会对比 npm/pnpm,方便你理解差异。
版本需要根据你的项目实际情况调整,本文示例以最新稳定版为演示环境,重点展示配置思路和核心操作。
3. 核心功能拆解:Bun 1.4 的依赖管理新体验
3.1bun init:一分钟生成项目
我们可以先用bun init快速初始化一个测试项目:
mkdir bun-demo cd bun-demo bun init执行后,Bun 会交互式询问项目名称、入口文件等信息。如果你想要全默认配置,可以加-y参数:
bun init -y生成的项目结构类似:
bun-demo ├── .gitignore ├── package.json ├── README.md ├── tsconfig.json └── index.ts没错,Bun 默认会把项目当作 TypeScript 项目,入口文件是index.ts。这也是 Bun 的一个重要特色:开箱即用 TypeScript,不需要额外安装ts-node或配置复杂的编译流程。
3.2 安装依赖:bun add
Bun 的依赖安装命令是bun add,对应 npm 的npm install <package>。
bun add express bun add react react-dom bun add -d typescript @types/node注意:
-d表示安装到devDependencies。- 默认情况下,Bun 会把依赖安装到
dependencies。 - 安装速度非常快,因为它会并行下载,并且利用全局缓存。
安装完成之后,你会看到一个bun.lock文件(旧版本可能是bun.lockb),这就是 Bun 的锁文件。它和package-lock.json、pnpm-lock.yaml的作用一致,用来锁定依赖版本,保证多人开发环境一致。
3.3 删除依赖:bun remove
这是本文的重头戏。删除依赖的命令是:
bun remove express如果你要同时删除多个:
bun remove react react-dom实测删除 15 个依赖的耗时,通常在 1 秒以内。这种“秒删”体验,主要归功于 Bun 的依赖存储机制。它不需要递归清理每个包的子目录,只需要更新项目相对 node_modules 的链接视图即可。
3.4 为什么 npm 删依赖慢
很多老前端对 npm 删依赖速度慢有深有体会。根本原因是 npm 的node_modules目录结构是递归嵌套或扁平化目录,删除一个包时,npm 需要反复扫描目录、判断依赖关系、执行文件删除。在 Windows 上,文件路径过长还会触发经典的EPERM或ENAMETOOLONG错误。
Bun 从架构上绕开了这些历史包袱,因此在删除依赖这个场景上表现出压倒性优势。
3.5 原生支持 workspace 与 monorepo
Bun 1.4 对 monorepo 的支持也越来越好。你可以在package.json中声明 workspaces:
{ "name": "bun-monorepo-demo", "private": true, "workspaces": [ "packages/*" ] }然后使用:
bun install它会自动识别packages下的子项目,并安装所有依赖。相比 npm、yarn,Bun 在 monorepo 下的安装速度优势更加明显。
4. 实战案例:在项目中使用 Bun 1.4 管理依赖
4.1 创建一个带 Express 和 React 的前后端项目
为了更直观地演示依赖管理,我们创建一个实际可运行的 demo。
首先初始化项目:
mkdir bun-fullstack-demo cd bun-fullstack-demo bun init -y4.2 安装后端依赖
安装 Express:
bun add express bun add -d @types/express修改index.ts:
// 文件路径:bun-fullstack-demo/index.ts import express from "express"; const app = express(); const port = 3000; app.get("/", (_req, res) => { res.send("Hello Bun 1.4!"); }); app.listen(port, () => { console.log(`Server is running at http://localhost:${port}`); });运行:
bun run index.ts你会看到控制台输出:
Server is running at http://localhost:3000不需要ts-node、不需要tsc,Bun 直接执行 TypeScript 文件。
4.3 再安装几个前端依赖
我们模拟一个前端项目,安装 React 相关依赖:
bun add react react-dom bun add -d @types/react @types/react-dom然后查看package.json:
{ "name": "bun-fullstack-demo", "module": "index.ts", "type": "module", "devDependencies": { "@types/express": "^5.0.0", "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0" }, "peerDependencies": { "typescript": "^5.0.0" }, "dependencies": { "express": "^5.0.0", "react": "^19.0.0", "react-dom": "^19.0.0" } }可以看到,Bun 已经把依赖分类整理好。
4.4 删除 15 个依赖的完整过程
为了验证“秒删 15 个依赖”,我们先把依赖数量增加到 15 个以上,然后一次性删除。
bun add lodash axios dayjs chalk nanoid bun add -d eslint prettier @types/lodash @types/node vitest这样项目里已经有超过 15 个依赖。
然后执行批量删除:
bun remove express react react-dom lodash axios dayjs chalk nanoid eslint prettier @types/express @types/react @types/react-dom @types/lodash @types/node vitest这里一共 15 个依赖,执行时间基本在 1 秒内。
执行成功后,package.json会同步更新,bun.lock也会重新生成,整个过程非常干净。
4.5 结果说明
node_modules中没有残留无用的目录。package.json中依赖列表已经被正确移除。bun.lock仍然是合法的锁文件。- 重新执行
bun install不会出现依赖不一致的问题。
这就是 Bun 1.4 依赖管理优化带来的实际体验提升。
5. 与 npm/pnpm/yarn 的区别对比
5.1 安装速度
| 包管理器 | 安装策略 | 速度感受 |
|---|---|---|
| npm | 扁平化 node_modules,串行下载为主 | 较慢,大项目尤其明显 |
| yarn classic | 类似 npm,缓存策略稍好 | 中等 |
| pnpm | 全局内容寻址 + 硬链接,节省磁盘 | 快 |
| Bun | 全局内容寻址 + 并发下载 | 非常快 |
Bun 在冷启动安装时表现尤其突出,原因在于:
- 使用 Zig 编写,系统调用开销更小。
- 下载使用多线程并发。
- 缓存命中率高。
5.2 删除依赖时的体验
| 包管理器 | 删除速度 | 容易遇到的问题 |
|---|---|---|
| npm | 慢,或卡顿 | Windows 路径过长、权限错误 |
| pnpm | 较快 | store 维护复杂,删除时可能需要 gc |
| Bun | 极快 | 目前稳定,但生态兼容仍需观察 |
5.3 兼容性对比
- npm 和 pnpm 完全兼容 npm 生态的 scripts、lockfile、workspace 配置。
- Bun 的锁文件格式独立,理论上可以和 npm 共存,但实际项目中建议团队统一使用 Bun。
- Bun 底层是 JavaScriptCore,而 Node.js 是 V8,所以少数依赖原生模块的包可能无法直接运行在一个运行时上。
5.4 什么时候选择 Bun
- 新项目,没有历史包袱。
- 团队愿意统一开发工具链。
- 项目主要使用 TypeScript 或纯 JavaScript。
- 对安装速度、开发体验有较高要求。
- 使用 Node.js 的部署环境,但开发阶段希望更快。
5.5 什么时候保持 npm/pnpm
- 项目深度依赖某些 Node.js 原生模块。
- 团队对 npm workspace 已有成熟的配置和 CI 流程。
- 现有 lockfile 体系已经维护多年,迁移成本过高。
- 某些私有 npm 镜像或企业级 registry 与 Bun 兼容性尚未验证。
6. 常见问题与排查思路
6.1 安装依赖后,某些包运行报错
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
运行bun run index.ts报Module not found | 依赖安装不完整,或该包不支持 Bun 运行时 | 先执行bun install,再检查包的 README 或 issue |
| 原生模块编译失败 | Bun 对 node-gyp 类模块支持还不完美 | 使用 Node.js 运行生产环境,或等待 Bun 更新 |
| 依赖版本冲突 | lockfile 没有正确更新 | 删除bun.lock后重新执行bun install |
| 删除依赖后启动报错 | 代码中还引用了已被删除的依赖 | 全局搜索被删除的包名,清理相关 import |
6.2 Bun 是否完全兼容 Node.js
不完全是。Bun 实现了大量 Node.js 内置模块的 API,但仍有细节上的差异。如果你的项目使用了以下技术,需要特别小心:
node:worker_threads的部分高级用法。- 某些不在标准 Node.js API 范围内的私有全局变量。
- 依赖 V8 内部机制的库。
- 使用了较新的 Node.js API,但 Bun 尚未实现。
遇到这种情况,建议在 CI 中同时跑node和bun两套命令,尽早发现兼容性问题。
6.3 删除依赖后锁文件不一致
如果你发现bun.lock和package.json不一致,可以执行:
bun installBun 会根据现有package.json重新生成锁文件。如果依旧异常,可以手动删除bun.lock再执行一次。
6.4 Windows 下删除 node_modules 很慢
Bun 在 Windows 上的体验相比 npm 好了很多,但如果你仍然遇到删除 node_modules 慢的问题,可能是历史遗留目录导致的。可以用系统原生命令清理:
rmdir /s /q node_modules或者使用rimraf:
npx rimraf node_modules6.5 私有 npm 源与 Bun 的兼容性
Bun 支持通过.npmrc或bunfig.toml配置镜像源。如果你使用的是公司内部私有 registry,一般只需要配置一个地址即可:
[install] registry = "https://npm.example.com/"如果某些包下载失败,优先检查私有源是否实现了 npm 协议的 metadata 接口。
7. 最佳实践:把 Bun 用进工程化流程
7.1 团队内部统一 Bun 版本
Bun 迭代速度很快,不同小版本之间可能行为不同。建议在项目根目录添加.bun-version文件,并配合 CI 检查版本:
cat .bun-version如果使用 Docker,可以在基础镜像中固定 Bun 版本:
FROM oven/bun:1.47.2 在 CI/CD 中使用 Bun 加速
很多团队在 CI 上还停留在 npm ci 阶段,其实切换到 Bun 后,构建速度会有质的提升。一个精简的 GitHub Actions 配置如下:
name: CI on: push: branches: [main] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v2 with: bun-version: 1.4.0 - run: bun install - run: bun run build注意:
- 不要在生产环境直接使用开发依赖未锁定的 Bun 命令。
- CI 中建议使用 lockfile,保证可重复构建。
- 如果项目需要部署到 Node.js 环境,仍然可以使用 Bun 打包,再用 Node 运行。
7.3 利用 Bun 的 TypeScript 原生支持简化构建
以前用 Node.js 写 TypeScript,需要配置 tsconfig、ts-node、tsx 等。Bun 可以直接执行.ts文件,流程大幅简化。
前端项目也可以使用 Bun 作为打包器:
bun build ./src/index.ts --outdir ./dist这样能省去额外的 webpack/vite 配置,对于小型项目和中型项目来说,开发体验非常清爽。
7.4 控制依赖数量,避免“依赖膨胀”
Bun 再快,也架不住项目里疯狂堆依赖。依赖越多,安全风险越大、安装时间越长、维护成本越高。
建议:
- 每次新增依赖前,思考是否可以用原生 API 解决。
- 使用
bun pm ls查看依赖树,分析冗余包。 - 定期使用工具检查依赖版本更新和漏洞。
- 对 monorepo 使用 workspace 提取公共依赖。
7.5 生产环境的安全边界
无论使用什么包管理器,在安装依赖时都要注意供应链安全。Bun 也提供了相关命令来查看依赖信息:
bun pm ls bun pm cache在团队协作中,应确保 lockfile 被提交到仓库,并开启依赖锁文件的审查机制。
8. 总结与下一步学习方向
Bun 1.4 的这次更新,在依赖管理体验上再次拉高了行业的基准线。尤其是“秒删 15 个依赖”这种看似夸张、实则真实的功能表现,背后是架构设计上的深刻差异。如果你之前只把 Bun 当成一个“跑 TypeScript 的玩具”,现在可以重新验证它在实际工程中的价值了。
通过本文你可以掌握:
- Bun 的核心定位和适用场景。
bun init、bun add、bun remove、bun install的基本用法。- Bun 与 npm、pnpm 的依赖管理差异。
- 如何把 Bun 引入到项目开发和 CI 流程中。
- 常见报错和排查思路。
下一步,你可以继续学习:
- Bun 的 HTTP 原生服务器 API,探索使用 Bun 直接替代 Express。
- Bun 的测试运行器
bun test,对比 Jest 和 Vitest 的使用差异。 - Bun 的打包器
bun build,理解它和 esbuild 的关系。 - 将现有 npm 项目逐步迁移到 Bun 的完整迁移方案。
最后提醒一句:Bun 虽然在工具链上很强势,但 Node.js 生态积累的兼容性优势依然存在。在实际项目中,不要盲目追求“快”而忽略稳定性和可维护性,建议先在新项目或非核心模块中试点,再逐步扩大使用范围。
如果本文对你有所帮助,可以收藏备用,后续有新版本更新时再对照本文重新验证一遍。我们下篇再见。