--- title: "从 pnpm 迁移" description: "如何将 pnpm 项目迁移到 Deno:从现有的 package.json 安装依赖,保留你固定的版本,将 pnpm CLI 命令映射到 Deno,并让 Deno 自动迁移 pnpm-workspace.yaml 工作区和 catalog。" last_modified: 2026-06-25 --- pnpm 是一个包管理器,不是运行时,因此你“迁移”的大部分内容是 配置而不是代码。Deno 会读取你现有的 `package.json`, 安装相同的 npm 依赖,并运行你的脚本,因此单包 pnpm 项目通常完全不需要任何更改。 pnpm 与 npm、Yarn 和 Bun 的不同之处在于它存储工作区 配置的位置。npm、Yarn 和 Bun 将它们的工作区 glob 保存在 `package.json` 中的 `workspaces` 下,Deno 会直接读取该配置。pnpm 则将它们保存在单独的 `pnpm-workspace.yaml` 文件中。Deno 在解析期间不会读取该文件,但 它会在首次需要时自动为你迁移它,如下所述。 ## 运行你的项目 安装依赖并运行你的入口文件: ```sh cd my-pnpm-app deno install deno run main.ts ``` `deno install` 会读取你现有的 `package.json`,并解析相同的 npm 包,就像 `pnpm install` 一样。它会写入一个 `node_modules` 目录,以及它自己的 [`deno.lock`](/runtime/packages/#lockfile-and-reproducible-installs)。 在你第一次执行 `deno install` 时,如果还没有 `deno.lock`,Deno 会根据你现有的 `pnpm-lock.yaml` 来生成它:你已经固定的版本和完整性哈希会被沿用,因此在这个过程中不会突然发生一轮升级。`node_modules` 的布局也会让你感到熟悉:和 pnpm 一样,Deno 使用隔离式布局,每个包只能看到它声明的依赖。 在 `package.json` 中定义的脚本会通过 [`deno task`](/runtime/reference/cli/task/) 运行,它相当于 `pnpm run`: ```sh deno task dev ``` 如果你还把应用从 Node 切换到 Deno 运行,那么会立刻遇到一个差异:**Deno 默认处于沙箱中**。你的程序第一次访问网络、文件系统或环境变量时,Deno 会请求权限。你可以一开始就用 `deno run -A main.ts` 一次性授予全部权限,以匹配 Node 的行为,然后再在之后收紧这些标志。参见 [安全与权限](/runtime/fundamentals/security/)。 ## pnpm 到 Deno 对照速查表
### 依赖 | pnpm | Deno | | -------------------------------- | ------------------- | | `pnpm install` | `deno install` | | `pnpm add ` | `deno add ` | | `pnpm add -D ` | `deno add -D ` | | `pnpm remove ` | `deno remove ` | | `pnpm update` | `deno update` | | `pnpm outdated` | `deno outdated` | | `pnpm install --frozen-lockfile` | `deno ci` | | `pnpm audit` | `deno audit` | | `pnpm why ` | `deno why ` | ### 运行与执行 | pnpm | Deno | | ------------------- | -------------------- | | `pnpm