Skip to main content
On this page

在现有 Node.js 项目中使用 Deno

大多数 Node.js 项目都可以在 Deno 中无需修改即可运行。Deno 会读取 package.json, 将相同的 npm 依赖安装到 node_modules 中,运行 CommonJS 和 ES 模块,并执行你现有的 npm 脚本。本教程将一步一步地把一个典型的 Node 项目 迁移到 Deno 中运行。

从 package.json 安装依赖 Jump to heading

deno install 相当于 npm install:它会读取你现有的 package.json 并生成 node_modules 目录:

>_
$ deno install
Initialize ms@2.1.3
Installed 1 package in 2ms

Dependencies:
+ npm:ms 2.1.3

不需要 deno.json;仅 package.json 就足够了。系统会创建一个 deno.lock 文件 来固定精确版本。

运行你的 npm 脚本 Jump to heading

deno task 相当于 npm run,并会原样读取你 package.json 中的 scripts

package.json
{
  "name": "my-node-app",
  "type": "module",
  "scripts": {
    "start": "node main.js"
  },
  "dependencies": {
    "ms": "^2.1.3"
  }
}
>_
$ deno task start
Task start node main.js
172800000

使用 Deno 运行入口文件 Jump to heading

要把 Deno 作为运行时,只需将其指向相同的入口文件:

>_
$ deno run main.js
172800000

Note

Deno 默认是安全的:如果你的代码会读取文件、打开套接字或访问 环境变量,请显式授予访问权限,例如 deno run --allow-net --allow-env main.js,或者先使用较宽松的 deno run -A main.js,之后再收紧权限。

另外两条兼容性规则几乎覆盖了其他所有情况:

  • Node 内置模块使用 node: 前缀:应写成 import os from "node:os" 而不是 import os from "os"。Node 本身也支持这个前缀,因此 这种修改具有向后兼容性。
  • CommonJS 和 ES 模块都能工作.cjs.mjs 是明确无歧义的,而 .js 则遵循最近的 package.json 中的 "type" 字段。基于 require()"type": "commonjs" 的项目可以原样运行。

Note

Deno 默认假定使用 ES 模块。只有当最近的 package.json 声明了 "type": "commonjs" 时, .js 文件才会被视为 CommonJS;而 Node 在该字段缺失时会默认使用 CommonJS。 对于依赖这种隐式默认值的旧项目,请添加这一行。

逐步替换工具链 Jump to heading

你不必一次性切换所有内容:Deno 既可以只作为包管理器使用,也可以只作为任务运行器使用。 当你准备好时,内置工具链可以在零配置的情况下替代多个开发依赖:

Node.js 工具链 Deno
npm install deno install
npm run <script> deno task
eslint deno lint
prettier deno fmt
jest / mocha deno test
tsc --NoEmit deno check

有关模块解析细节、完整命令速查表以及 tsconfig 迁移,请参阅 从 Node.js 迁移指南

Did you find what you needed?

编辑此页面
Privacy policy