n_hachiのメモ

メモです。

node_modules内パッケージのエントリーポイント定義方法

背景

最近node.jsを勉強しており、他者が作成したパッケージに含まれるファイルの中でどれがエントリーポイントとなるのかわからなかったので調べた。

パッケージのエントリーポイント

Modules: Packages | Node.js v16.1.0 Documentationの一部を訳し以下に記す。
※訳に誤りがあれば指摘いただきたい。

パッケージ内のファイルpackage.jsonはエントリーポイントを定義する2つのフィールドE、"main""exports"を定義することができる。
"main"はどのバージョンにも対応しているがパッケージのメインエントリポイントのみ定義可能な制限を持つ。

"exports""main"の代替を提供する。 "exports"はパッケージのメインエントリポイントを定義するのと同時に、パッケージをカプセル化し、"exports "で定義されたもの以外のエントリーポイントを防ぐ。
※この部分は訳した結果、完全には理解できていないです。

まとめるとpackage.json内の"main"もしくは"exports"フィールドで指定するようだ。

具体例

ここで今回の調査のきっかけになったパッケージを見てみる。
grpc-node/packages/grpc-js at master · grpc/grpc-node
このリポジトリはgrpcをjavascriptで使うために必要なパッケージらしい。
ここvar grpc = require('@grpc/grpc-js');という一文が記載されている。
grpc-jsに含まれるpackage.jsonを見てみる。
ローカルの環境ではnode_modules/@grpc/grpc-js/package.jsonに当たる。
エントリーポイントに関連する部分は"main": "build/src/index.js",である(github上の対応する箇所)。
これによってnode_modules/@grpc/grpc-js/build/src/index.jsがエントリポイントと設定される。

まとめ

package.jsonに含められた"main""exports"フィールドによってエントリポイントは定義される。
"main""exports"の違いがわかってないので、今後必要になったタイミングで調べていきたい。