Denoのnpmパッケージサポート
#Deno #npm #Node.js #package.json #node_modules
概要
Deno v1.25からnpmパッケージのサポートが追加されました
このページではDenoにおけるnpmパッケージのサポートやNode.jsとの互換性に関してまとめます
npmパッケージの利用方法
以下のように、npm:<パッケージ名>@<バージョン>というような形式でimportを記述することで、npmパッケージを利用できます
code:sh
// https://www.npmjs.com/package/chalk の利用例
import chalk from "npm:chalk@5.0.1";
console.info(chalk.green("Hello, world!"));
また、npxライクにコマンドを実行することもできます
code: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/xやjsrなど)と同様に、スクリプトを実行する際にnpmパッケージが自動でダウンロードされ、グローバルキャッシュ(DENO_DIR)に保存されます
deno add/deno removeコマンド
deno add (deno install)
deno addコマンド (またはdeno installコマンド) を使うと、deno.json※のimportsへの該当のnpmパッケージに関するマッピングの追加 と deno.lockの更新を行うことが出来ます (※もしpackage.jsonがある場合、deno.jsonではなくpackage.jsonの方にnpmパッケージが依存として追加されます)
code: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)
code:javascript
import chalk from "chalk";
chalk.green("Hello");
また、引数なしでdeno installを実行すると、deno.jsonやpackage.json (※後述)に記載された依存パッケージをまとめてインストールできます。
code:shell
$ deno install
deno remove
deno removeコマンドを使うことで、deno.json※のimportsからのマッピングの削除とdeno.lockの更新が可能です (※deno removeもdeno addと同様に、package.jsonがある場合は、deno.jsonではなくpackage.jsonからnpmパッケージの定義が削除されます)
code:shell
$ deno remove chalk
DENO_INSTALL_ARCH
Deno v2.4.5で追加された環境変数で、DENO_INSTALL_ARCH=aarch64のような形式で利用できます
あるプラットフォームにおいて異なるプラットフォーム向けのパッケージをインストールしたい場合に利用します
node_modulesについて
以下のいずれかを行うと、Denoがnpmパッケージをnode_modulesに保存してくれます
--node-modules-dirオプションを指定する
deno.jsonで"nodeModulesDir": trueを設定する
package.json(後述)を用意する
使いたいnpmパッケージがnode_modulesに依存している際は、検討するとよいと思います
また、後述のBYONMを利用することで、npm/Yarn/pnpmなどにより生成されたnode_modulesをDenoから利用することもできます
package.jsonサポート
Deno v1.31からpackage.jsonの自動探索がサポートされました。
code: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と同じようなイメージで動作します)
code: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で定義されたスクリプトを実行することもできます。
code: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を設定します。
BYONM
BYONMはnpmやpnpmなどで作成された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"]を指定すると有効化できます。
code:deno.json
{
"unstable": "byonm"
}
create-*パッケージの実行
deno initコマンドに--npmオプションを指定すると、create-*パッケージを実行できます (Deno v2.1)
例えば、以下のコマンドを実行するとcreate-honoパッケージが実行されます
code:shell
$ deno init --npm hono
ライフサイクルスクリプトの実行
DenoはBunと同様に、デフォルトではnpmパッケージに含まれるライフサイクルスクリプトを実行しません
Denoでnpmパッケージに含まれるライフサイクルスクリプトの実行を許可したい場合は、--allow-scriptsを明示的に指定する必要があります
Node.js組み込みパッケージの利用
Denoの本体にはNode.js組み込みパッケージが搭載されており、node:<パッケージ名>でimportできます。(※一部、未実装のため読み込めないパッケージやAPIなどもまだあります)
code:javascript
import { EventEmitter } from "node:events";
const emitter = new EventEmitter();
emitter.on("foo", console.log);
emitter.emit("foo", "bar");
Node.js組み込みパッケージの互換性について
DenoはNode.jsの各種組み込みパッケージとの互換性を担保するために、Node.jsのテストケースが実行されています
テストケースの網羅率についてはnode-test-viewer.deno.devから確認できます (リポジトリ: denoland/node_test_viewer)
.npmrc
Deno v1.44からサポートが導入されています
package.jsonまたはdeno.jsonと同一ディレクトリに.npmrcが配置されていれば、それが自動で読み込まれます
tsconfig.json
Deno v2.4からtsconfig.jsonの探索がサポートされています (※compilerOptionsについては、Deno v2.4以前のバージョンでもdeno.jsonから設定可能です)
Deno v2.4以降であれば、deno.jsonもしくはpackage.jsonと同一ディレクトリにあるtsconfig.jsonが自動で検出され、その設定が適用されます
DENO_COMPAT
Deno v2.4で導入された環境変数
この環境変数を設定すると、以下のオプションをまとめて有効化できます
--unstable-bare-node-builtins
--unstable-detect-cjs
--sloppy-imports
関連ページ
jsr
DenoのNode.js互換モード
esm.sh