📚

npmのoptionalDependenciesとは

2021/02/08に公開

ググってもあまり日本語の記事がヒットしないので簡単に説明を載せておきます。まれにpackage.jsonoptionalDependenciesというものにパッケージ名が指定されていることがあります。

  "dependencies": {
    ...
  },
  "devDependencies": {
    ...
  }
  "optionalDependencies": {
    "sharp": "0.26.3"
  }

optionalDependenciesとは

optionalDependencies利用可能であればインストールされるが、利用不可であっても他の処理を止めたくない場合に使用します。

以下npm公式ドキュメントの引用です。

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. This is a map of package name to version or url, just like the dependencies object. The difference is that build failures do not cause installation to fail. Running npm install --no-optional will prevent these dependencies from being installed.
It is still your program's responsibility to handle the lack of the dependency.

optionalDependencies - npm Docs

optionalDependenciesに指定されているパッケージが見つからなかったり、インストールが失敗したりしても処理が継続されるということですね。

プログラムを提供する側は、そのパッケージのインストールが失敗したとしてもプログラムが問題なく動くように実装する必要があります。

optionalDependenciesの使用例

例えばNext.jsのpackage.jsonにはoptionalDependenciesとしてsharpが指定されています。

sharpは画像最適化のためのnpmパッケージで、libvipsというネイティブライブラリに依存しているため、環境によってはインストール時にエラーが発生します。

Next.jsではImage Optimization (next/image)の部分でsharpに依存していますが、この機能を使わないならsharpがインストールされていなくても問題ありません。

sharpを使用できない環境であってもnext/imageを使わないならNext.js自体は使用可能にしたい」という意図からoptionalDependenciesに指定しているのだと考えられます。

Discussion