On this page
Migrating from Node.js to Deno
Most Node.js projects run in Deno with no changes at all. Deno reads your
package.json, installs and resolves the same npm dependencies, and runs both
CommonJS and ES modules, so in most cases you point Deno at your existing
project and it just works.
You can also adopt Deno incrementally: use it purely as a faster, drop-in
package manager for an app you still run with Node, run your existing
package.json scripts with deno task, or switch to Deno as the runtime and
pick up its built-in toolchain. This guide walks through each step.
Use Deno as your package manager Jump to heading
Deno is fully compatible with npm and package.json, so the easiest place to
start is dependency management, without changing how you run your code at all.
deno install reads your existing package.json, resolves the same npm
packages, and writes a node_modules directory, just like npm install:
cd my-node-app
deno install
You can keep running the app with Node from here, using Deno only as a faster package manager, or manage dependencies with Deno's built-in commands:
deno add npm:express # add a dependency
deno remove express # remove one
deno outdated # see what has newer versions
Deno understands dependencies declared in both package.json and deno.json,
and individual npm packages can also be imported inline with npm: specifiers.
See Modules and dependencies for the full
picture.
Run your project with Deno Jump to heading
To run an existing Node project with Deno, install its dependencies and run the entrypoint:
cd my-node-app
deno install
deno run main.js
If your package.json defines scripts, run them with
deno task, the equivalent of npm run:
{
"name": "my-project",
"scripts": {
"start": "node server.js"
}
}
deno task start
Most code runs unchanged. The main thing to understand is how Deno decides
whether a file is CommonJS or an ES module, which follows your package.json.
That is covered next.
CommonJS and ES modules Jump to heading
Deno runs both ES modules and CommonJS, and decides how to treat a file using the same rules as Node.js:
- A
.cjsfile is always CommonJS, and a.mjsfile is always an ES module. The extension is enough. - A
.js,.ts,.jsx, or.tsxfile is loaded as CommonJS when the nearestpackage.jsonsets"type": "commonjs", and as an ES module otherwise. Deno walks up the directory tree to find thatpackage.json, just like Node.
{
"type": "commonjs"
}
So an existing CommonJS project keeps working: with "type": "commonjs" in
package.json, your require()-based .js files run under both Node and Deno.
CommonJS code needs its dependencies present in node_modules (set
"nodeModulesDir": "auto" in deno.json) and the usual
permission flags.
You can also mix the two module systems: require() is available in .cjs
files or via createRequire, Deno's require() can load synchronous ES
modules, and you can import CommonJS files from ES modules. See
CommonJS support for the details
and edge cases.
Node to Deno Cheatsheet Jump to heading
In a Node project, many of these are separate packages you install and
configure: eslint, prettier, jest, ts-node, nodemon, nyc, tsc. In Deno they're
the same binary, with no extra dependencies and no config files to maintain. You
can keep your existing package.json, or move configuration into deno.json.
Run and watch Jump to heading
| Node.js | Deno |
|---|---|
node file.js |
deno file.js |
ts-node file.ts |
deno file.ts |
node -e "…" |
deno eval "…" |
nodemon |
deno run --watch |
Dependencies and scripts Jump to heading
| Node.js | Deno |
|---|---|
npm install / npm i |
deno install |
npm install -g <pkg> |
deno install -g <pkg> |
npm run <script> |
deno task <script> |
npm explain <pkg> |
deno why <pkg> |
Quality and testing (built in, no install or config) Jump to heading
| Node.js | Deno |
|---|---|
eslint |
deno lint |
prettier |
deno fmt |
jest / mocha / ava / tap |
deno test |
nyc / c8 / istanbul |
deno coverage |
| benchmark libraries | deno bench |
TypeScript, docs, and builds Jump to heading
| Node.js | Deno |
|---|---|
tsc |
deno check ¹ |
typedoc |
deno doc |
nexe / pkg |
deno compile |
¹ TypeScript runs directly: there's no build step. deno check type-checks
without emitting, and the compiler is built into the deno binary.
Toolchain Jump to heading
| Node.js | Deno |
|---|---|
tsserver |
deno lsp |
nvm / n / fnm |
deno upgrade |