5分で再入門する npm dependencies - 空の箱
Link copied to clipboard!
2025-03-29T02:36:00Z

最近pnpmのドキュメントを眺めていたんだけど、そこでよく知らない依存関係の種類が出てきた。なので、理解したことをまとめてアウトプットしておく。 といった話は理解できている前提で書く。 最も基本となる依存関係。npm installするとdependenciesに書かれたものは全てインストールされることになる。 なので、本番環境で使うものしかここには入れてはいけない。 「dependenciesには本番環境で使うものしかいれてはいけない」と上で話した。「ではそれ以外のものはどこにいれるのか?」となるが、その答えがここ。 繰り返しだがこの話自体はいろんな記事やカンファレンスのトークで擦られ続けているので、もうお腹いっぱい感がある。 一応書くと、devDependenciesにインストールするにはnpm install --save-dev
とする。 逆に本番環境でdependenciesのみをインストールするには、npm install --omit=devと書く。 ここまでは自分もちゃんと押さえられてて、以降がよく知らなかったものたち。 名前的に入れても入れなくてもどっちでもいいライブラリっぽいが本当に合ってるか裏を取る。 ドキュメントを読むと、 If a dependency can be used, but you would like npm to proceed if it cannot be found or fails to install, then you may put it in the optionalDependencies object. ある依存関係が使用できるが、それが見つからなかったりインストールに失敗した場合にnpmに処理を進めさせたい場合は、optionalDependenciesオブジェクトにその依存関係を記述することができる。 ということらしい。裏を返すとoptionalDependenciesを含むライブラリを配布する場合はそれが失敗したとしても動く状態にしてあげないといけないことになる。 例えばNext.jsのpackage.jsonを見ると、 となっている。sharpは画像変換のライブラリらしい。 www.npmjs.com これがNext.jsのどの辺で使われているのを見てみると、image-optimizer.tsらしい。 つまり「Next.jsは使いたいけど画像は別に扱わない*1」みたいなシーンではsharpがなくても問題ないため、optionalDependenciesに含まれていると思われる。 なんとなくこのライブラリを使うなら、○○がすでにインストールされている前提だよ!ってことを連想させられる名前。 ドキュメントを読むと、 In some cases, you want to express the compatibility of your package with a host tool or library, while not necessarily doing a require of this host. This is usually referred to as a plugin. 場合によっては、自分のパッケージが特定のホストツールやライブラリと互換性があることを示したいが、そのホストを直接 require する必要はないこともある。こうしたケースは、一般的に「プラグイン」と呼ばれる ということらしい。要はpeerDependenciesに書かれたライブラリは、必ずしもpeerDependenciesを要求する側でinstallする必要がないということらしい。これは実例をいくつか見るのがよさそう。 例えばoptionalDependenciesに続いてNext.jsのそれを見てみる。 わかりやすいのはReactで、確かにNext.jsはそもそもReactがないと動かない。けどNext.jsにReactが同梱されているわけではなくて、公式ドキュメントの手順にもあるとおりReactは個別にインストールすることになる*2。 あとは引用したnpmのドキュメントの通り、プラグインをみるといいのかも。ってことでeslintのpluginであるeslint-plugin-unicornのpackage.
Link copied to clipboard!
BANNER
This is a advertising space.
BANNER
This is a advertising space.