--- title: "从 Bun 迁移" description: "如何将 Bun 项目迁移到 Deno:从现有的 package.json 安装依赖,保留固定版本,不修改地运行脚本,将 Bun CLI 命令映射到 Deno,并用 Deno 和 Node 内置功能替换 Bun 特定 API。" last_modified: 2026-06-25 --- 大多数 Bun 项目都是标准的 `package.json` 和 TypeScript 项目,而 Deno 可以直接运行它们。Deno 会读取你的 `package.json`,安装相同的 npm 依赖,无需构建步骤即可运行 TypeScript,并提供一套类似的内置工具链:测试运行器、格式化器、代码检查器、打包器和编译器,全部集成在一个二进制文件中。 需要注意的是任何使用 Bun 特定 API 的内容(`Bun.serve`、`bun:sqlite`、`Bun.file`、`$` shell)。下面介绍它们在 Deno 中或在 Deno 支持的 Node 内置功能中的对应实现。凡是没有从 `bun` 或 `bun:*` 导入任何内容的代码,通常都可以不加修改地运行。 ## 运行你的项目 安装依赖并运行你的入口文件: ```sh cd my-bun-app deno install deno run main.ts ``` `deno install` 会读取你现有的 `package.json` 并解析相同的 npm 包,类似于 `bun install`。在你第一次运行 `deno install` 时,如果还没有 `deno.lock`,Deno 会基于你现有的 `bun.lock` 生成它,沿用你已经锁定的 版本和完整性哈希。`bun.lock` 是 Bun 的文本锁文件(自 Bun 1.1.39 起写入);旧的二进制 `bun.lockb` 不会被读取, 所以如果你只有它,请先运行一次 `bun install` 生成 `bun.lock`, 或者让 Deno 重新解析你的 `package.json` 版本范围。 `package.json` 中定义的脚本通过 [`deno task`](/runtime/reference/cli/task/) 运行,相当于 `bun run`: ```sh deno task start ``` 你会立刻遇到的一个行为差异是:**Deno 默认处于沙箱中**。Bun 运行你的代码时可以完全访问网络、文件 系统和环境变量,而 Deno 在程序第一次需要某项权限时会逐个询问。你可以先用 `deno run -A main.ts` 一次性授予所有权限,以匹配 Bun 的行为,然后再在之后收紧这些标志。参见 [安全与权限](/runtime/fundamentals/security/) 和 [权限标志参考](/runtime/reference/permissions/)。 和 Bun 一样,Deno 允许你在文件场景下省略子命令:`deno main.ts` 的作用与 `deno run main.ts` 相同。 ## Bun 到 Deno 速查表
### 依赖 | Bun | Deno | | ------------------ | ------------------- | | `bun install` | `deno install` | | `bun add ` | `deno add ` | | `bun remove ` | `deno remove ` | | `bun update` | `deno update` | | `bun outdated` | `deno outdated` | ### 运行和执行 | Bun | Deno | | ------------------ | -------------------- | | `bun file.ts` | `deno file.ts` | | `bun run