--- title: "从 npm 迁移" description: "如何将 npm 项目迁移到 Deno:从现有的 package.json 安装依赖,保留已固定版本,将 npm CLI 命令映射到 Deno,保持工作区不变地运行,并处理生命周期脚本。" last_modified: 2026-06-25 oldUrl: - /runtime/migrate/switch_package_manager/ --- npm 是包管理器,不是运行时,因此你“迁移”的大部分内容是配置,而不是代码。Deno 与 `package.json` 完全兼容:它会读取你现有的清单,安装并解析相同的 npm 依赖,并运行你的脚本。在大多数情况下,你只需让 Deno 指向一个现有的 npm 项目,它就能正常工作。 你不必一开始就切换运行时。最小的一步是将 Deno 纯粹用作你仍在使用 Node 运行的应用的更快、更安全的包管理器:`deno install` 会读取你的 `package.json`,解析相同的包,并写入一个普通的 `node_modules` 目录,因此应用会像以前一样继续在 Node 下运行。从那里开始,你可以使用 `deno task` 运行你的 `package.json` 脚本,并在准备好时切换运行时。这也是可逆的:如果效果不理想,删除 `deno.lock` 并再次运行 `npm install` 即可。 ## 运行你的项目 安装依赖并运行你的入口文件: ```sh cd my-npm-app deno install deno run main.js ``` `deno install` 会读取你现有的 `package.json` 并解析相同的 npm 包,类似于 `npm install`。它会写入一个 `node_modules` 目录以及它自己的 [`deno.lock`](/runtime/packages/#lockfile-and-reproducible-installs)。 在你第一次执行 `deno install` 时,如果还没有 `deno.lock`,Deno 会从你现有的 `package-lock.json` 生成它:你已经固定好的精确版本和完整性哈希会被沿用,所以在迁移过程中不会突然出现一轮升级。之后,Deno 会维护 `deno.lock`,并保持 `package-lock.json` 不变,因此那些还没有切换的队友不会受到影响。等你满意之后,就提交 `deno.lock`。 `package.json` 中定义的脚本会通过 [`deno task`](/runtime/reference/cli/task/) 运行,它相当于 `npm run`: ```sh deno task start ``` 如果你还将应用从在 Node 上运行切换为在 Deno 上运行,预计会有一个立刻的不同:**Deno 默认是沙箱化的**。程序第一次访问网络、文件系统或环境变量时,Deno 会请求权限。你可以一开始就用 `deno run -A main.js` 授予全部权限,以匹配 Node 的行为,然后再在之后收紧这些标志。请参阅 [安全性和权限](/runtime/fundamentals/security/)。 ## npm 到 Deno 速查表