javascript - npmパッケージの"engines"フィールドは、パッケージの利用者向けですか、それとも開発者向けですか?
私は npm に公開されているライブラリの作者です。そのパッケージマニフェストファイルには、engines フィールドに現在の LTS バージョンのツールが含まれています:[email と npm 8.x.x。これは、開発にこれらのバージョンを使用しており、すべてのコントリビューターにも同じバージョンを使用してほしいためです。
しかし、このライブラリの配布ファイルはプラットフォームに依存しないES5のJavascriptにコンパイルされており、Nodeやnpmのはるかに低いバージョンでも動作することができます。私は、古いバージョンのNodeを使用している古いプロジェクトでパッケージをインストールする際、パッケージを利用する人々が誤った警告を受けるのではないかと懸念しています。
package.json の engines フィールドにどの Node バージョンを指定すべきですか?この問題を解決する別の方法はありますか?
回答 #1
npmパッケージの「engines」フィールドは、パッケージの利用者向けですか、それとも開発者向けですか?
ライブラリをインストールする際に指定された node または npm のバージョンを確認するために engines フィールドが使用されるため、これは利用者を対象としています。
engines フィールドは、比較的新しいランタイム API や機能を使用する場合に使われます。コードが新しい API や機能を使用していない場合は、engines フィールドを省略できます。
これはランタイムAPIと機能にのみ使用されることに注意してください。たとえあなたのコードにサポートされていないESNEXT機能が含まれていても、ユーザーはトランスパイラを使ってそのコードを実行することができます。あるいは例えば、Node 18で新しいネイティブのfetch APIを使用した場合でも、ユーザーはnode-fetchのようなNode用のfetchポリフィルをインストールして、あなたのライブラリを使用することができます。
最近では、engines フィールドはエッジケース専用で、必要なときに必要だと分かる場合にのみ使われます。
NPMの創設者であるIsaac Schlueterによって、2012年にenginesフィールドを削除するためのGoogleグループのチャットさえ作成されました。https://groups.google.com/g/nodejs/c/_ZggTOJQ2Rk