generated at
Denoのnpmパッケージサポート
概要
Deno v1.25からnpmパッケージのサポートが追加されました
以下のように、 npm:<パッケージ名>@<バージョン> というような形式で import を記述することで、npmパッケージを利用できます
sh
// https://www.npmjs.com/package/chalk の利用例 import chalk from "npm:chalk@5.0.1"; console.info(chalk.green("Hello, world!"));
また、npxライクにコマンドを実行することもできます
shell
$ deno run --allow-env --allow-read --allow-write npm:make-dir-cli@3.0.0 src/components
Denoではpackage.jsonが存在しない場合、デフォルトではnode_modulesが作成されません。他のDenoパッケージ(deno.land/xjsrなど)と同様に、スクリプトを実行する際にnpmパッケージが自動でダウンロードされ、グローバルキャッシュ(DENO_DIR)に保存されます

deno add/deno removeコマンド
deno addコマンドを使うと、deno.json※の imports への該当のnpmパッケージに関するマッピングの追加 と deno.lockの更新を行うことが出来ます (※もしpackage.jsonがある場合、deno.jsonではなくpackage.jsonの方にnpmパッケージが依存として追加されます)
shell
# 1. `chalk@5.3.0`をダウンロードし、`deno.json`の`imports`に`"chalk": "npm:chalk@5.3.0"`というマッピングを定義します $ deno add npm:chalk@5.3.0 $ cat deno.json | jq .imports.chalk "npm:chalk@5.3.0"
これにより、ソースコード中からは以下のようにしてnpmパッケージを読み込むことができます (Import maps)
javascript
import chalk from "chalk"; chalk.green("Hello");
deno removeコマンドを使うことで、deno.json※の imports からのマッピングの削除とdeno.lockの更新が可能です (※deno removedeno addと同様に、package.jsonがある場合は、deno.jsonではなくpackage.jsonからnpmパッケージの定義が削除されます)
shell
$ deno remove chalk

node_modulesについて
以下のいずれかを行うと、Denonpmパッケージをnode_modulesに保存してくれます
--node-modules-dir オプションを指定する
deno.json "nodeModulesDir": true を設定する
package.json(後述)を用意する
使いたいnpmパッケージがnode_modulesに依存している際は、検討するとよいと思います
また、後述のBYONMを利用することで、npm/Yarn/pnpmなどにより生成されたnode_modulesDenoから利用することもできます

package.jsonサポート
Deno v1.31からpackage.jsonの自動探索がサポートされました。
package.json
{ "dependencies": { "chalk": "^5.2.0", "koa": "2" }, "devDependencies": { "cowsay": "^1.5.0" }, "scripts": { "hello": "cowsay Hello" } }
上記のようなpackage.jsonがあった場合、 dependencies devDependencies で指定された定義に基づいて、Denoが必要に応じて自動でnpmパッケージをダウンロードしてくれます。(package.jsonが存在する場合は、node_modulesが自動で作成されます)
また、deno addコマンドでnpmパッケージを追加する際も、deno.jsonではなくpackage.jsonの方に依存が追加されます (もしdevDependenciesへ依存を追加したい場合はdeno add --dev オプションを指定する必要があります)
"bare specifier"の解決
package.jsonで定義されたパッケージであれば、Denoが自動でbare specifierを解決してくれます。(Import mapsと同じようなイメージで動作します)
javascript
import chalk from "chalk"; // => `npm:chalk@^5.2.0` import Koa from "koa"; // => `npm:koa@2` const app = new Koa(); app.use((ctx) => { ctx.body = "Hello world"; }); app.listen(3000, () => { console.log(chalk.blue.bold("Listening on port 3000")); });
npm scriptsの実行
deno taskコマンドにより、package.json scripts で定義されたスクリプトを実行することもできます。
shell
$ deno task hello # `package.json`の内容を元に、`deno run -A npm:cowsay@^1.5.0 hello`が実行されます。

package.jsonの自動探索を無効化する方法
--no-npm オプションを指定することで、npmパッケージの解決やpackage.jsonの自動探索を無効化できます。
package.jsonの自動探索のみを無効化したい場合は、DENO_NO_PACKAGE_JSON 1 を設定します。

BYONMnpmpnpmなどで作成されたnode_modulesからnpmパッケージをDenoで読み込むための機能です。
Deno v1.38で実装されました。
BYONM"Bring your own node_modules"の略です。
有効化方法
Deno v2以降) package.jsonがあれば自動で有効化されます
Deno v1) --unstable-byonm を指定する または deno.json "unstable": ["byonm"] を指定すると有効化できます。
deno.json
{ "unstable": ["byonm"] }

create-*パッケージの実行
deno initコマンドに --npm オプションを指定すると、 create-* パッケージを実行できます (Deno v2.1)
例えば、以下のコマンドを実行するとcreate-honoパッケージが実行されます
shell
$ deno init --npm hono

ライフサイクルスクリプトの実行
DenoBunと同様に、デフォルトではnpmパッケージに含まれるライフサイクルスクリプトを実行しません
Denonpmパッケージに含まれるライフサイクルスクリプトの実行を許可したい場合は、--allow-scriptsを明示的に指定する必要があります

Node.js組み込みパッケージの利用
Denoの本体にはNode.js組み込みパッケージが搭載されており、 node:<パッケージ名> import できます。(※一部、未実装のため読み込めないパッケージやAPIなどもまだあります)
javascript
import { EventEmitter } from "node:events"; const emitter = new EventEmitter(); emitter.on("foo", console.log); emitter.emit("foo", "bar");

Deno v1.44からサポートが導入されています
package.jsonまたはdeno.jsonと同一ディレクトリに.npmrcが配置されていれば、それが自動で読み込まれます

関連ページ