package.jsonにenginesを追加してNode.jsのバージョンを指定

package.jsonにenginesを追加してNode.jsのバージョンを指定する

package.jsonに engines フィールドを追加して、使用するNode.jsのバージョンを指定することができます。
以下はその方法です。

1. プロジェクトのルートディレクトリにある package.json ファイルを開きます。
2. engines フィールドを追加し、指定したいNode.jsのバージョンを記述します。

例えば、Node.jsのバージョンを14.xに指定したい場合、package.jsonは次のようになります。

{
  "name": "project-name",
  "version": "1.0.0",
  "description": "description",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "engines": {
    "node": "14.x"
  },
  "dependencies": {
    // your dependencies
  }
}

"node": "14.x" は、バージョン14のNode.jsを使用することを指定しています。
特定のバージョンを指定することもできますし、範囲を指定することもできます。
例えば、"node": ">=14.0.0 <15.0.0" のように指定することも可能です。

この状態でバージョン14とは別のバージョンでnpm installやyarn installコマンドを実行した場合、以下の結果になります。
npm install

npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: 'project-name@1.0.0',
npm WARN EBADENGINE   required: { node: '14.x' },
npm WARN EBADENGINE   current: { node: '12.x', npm: '6.14.8' }
npm WARN EBADENGINE }

npmの場合は警告メッセージが出力されて、インストール自体は実行されます。

yarn install

error your-project-name@1.0.0: The engine "node" is incompatible with this module. Expected version "14.x". Got "12.x"
error Found incompatible module.

yarnの場合はエラーメッセージが出力され、インストールは中止されます。
なのでyarnを使用する場合はenginesフィールドを追加すればバージョンは強制できますね。

npmでNode.jsのバージョンを強制する方法

npmでは、engine-strict オプションを使用すればNode.jsのバージョンを強制することができます。
このオプションを使用すれば、指定されたバージョン以外のNode.jsが使用されている場合、エラーが発生します。
このオプションを設定するには、プロジェクトのルートディレクトリに .npmrc ファイルを作成し、次の行を追加します。

engine-strict=true

この状態でバージョン14とは別のバージョンでnpm installコマンドを実行した場合、以下のようなエラーメッセージが出力されます。

npm ERR! code ENOTSUP
npm ERR! notsup Unsupported engine for your-project-name@1.0.0: wanted: {"node":"14.x"} (current: {"node":"12.x","npm":"6.14.8"})
npm ERR! notsup Not compatible with your version of node/npm: your-project-name@1.0.0
npm ERR! notsup Not compatible with your version of node/npm: your-project-name@1.0.0
npm ERR! notsup Required: {"node":"14.x"}
npm ERR! notsup Actual:   {"npm":"6.14.8","node":"12.x"}

npm ERR! A complete log of this run can be found in:
npm ERR!     /path/to/npm/logs/npm-debug.log

このようにpackage.jsonの設定等だけで、簡単にNode.jsのバージョンを強制できるのは楽ですね。