package.json
にfiles
フィールドを指定すると、node_modules
に保存されるファイルサイズが減ります。
この記事は、npmのpackage.jsonに指定するフィールド、filesの指定方法と効用を解説、共有するためのものです。
この記事は、以下の読者を想定して書かれています。
この記事は、以下の環境を想定して書かれています。記事を読む前に、お手元の環境をご確認ください。
$ npm --version
7.15.1
filesフィールドとは、package.jsonファイル内の設定フィールドです。このフィールドはnpmパッケージがインストールされたとき、どのファイルをnode_modulesにコピーするかを設定します。
たとえば、以下のようなnpmパッケージ用のリポジトリがあるとします。
example-project/
├ src/
│ ├ srcA.js
│ └ srcB.js
├ lib/
│ └ bundle.js
├ esm/
│ └ module.js
├ __test__/
│ ├ testA.spec.js
│ └ testB.spec.js
├ package.json
├ LICENSE
├ jest.config.js
└ README.md
package.jsonには、以下のようにfiles
フィールドが設定されています。
▼package.json
{
"name": "example-project",
"files": [
"lib",
"esm"
],
}
このnpmパッケージをインストールします。
npm install --save-dev example-project
すると、node_modulesには以下のようにファイルがインストールされます。
node_modules/
└ example-project/
├ lib/
│ └ bundle.js
├ esm/
│ └ module.js
├ package.json
├ LICENSE
└ README.md
filesフィールドに指定されていないファイルは、node_modulesにはインストールされません。
filesフィールドの挙動を、公式ドキュメントから読み解いていきます。
filesフィールドにはstring配列を指定します。stringの中身は.gitignoreなどでおなじみのglobパターンを指定します。
filesフィールドは省略可能です。省略した場合["*"]
として解釈されます。このパターンはすべてのファイルにマッチします。
.npmignore
と併用するとどうなるか.npmignoreとfilesを併用した場合、ルートディレクトリとサブディレクトリで挙動が異なります。
filesフィールドの設定にかかわらず、必ずパッケージに含まれるファイルと無視されるファイルがあります。詳しいリストは公式ドキュメントを参照してください。
.git
ディレクトリやpackage-lock.json
など、インストール先に影響を与えないファイルは無視されます。
package.json
やLICENCE
など、インストール先に影響を与えたり尊重されるべきファイルはfilesフィールドの設定にかかわらずパッケージに含まれます。
filesフィールドを指定することで、インストール先のnode_modulesディレクトリのファイルサイズを減らせます。
たとえば以下のようなファイルはパッケージの動作に影響を与えません。filesフィールドを設定して除外するべきです。
以上、ありがとうございました。