🐷

Nodeのバージョン管理ツールVoltaを導入してみた

2024/12/08に公開

概要

こんにちは!私はつい先日BABY JOBにフロントエンドエンジニアとして参画した者です。
今回は私がオンボーディングで環境構築をした際に、Node.jsのバージョン指定で少し躓いたので、バージョン管理ツールを導入して問題を解消し、業務効率化に貢献したというお話です。

何が起きたのか

プロジェクト参画当時、フロントエンドの環境構築Wikiに、Mac向けのNode.jsのインストール方法は以下のように記されていました。

brew install node

つまり、グローバルインストールをするよう記載されていました。

私「プロジェクトに応じたNode.jsのバージョン指定とかしなくていいのかな・・・?まあしばらくは同じプロダクトしか触ることはないって聞いているし、一旦Wiki通りやってみるか!」

そんなこんなでNode.jsをグローバルインストールし、npm installコマンドを叩いてみました。

npm warn EBADENGINE Unsupported engine {
npm warn EBADENGINE   package: undefined,
npm warn EBADENGINE   required: { node: '22.6.x' },
npm warn EBADENGINE   current: { node: 'v22.10.0', npm: '10.9.0' }
npm warn EBADENGINE }

Node.jsのバージョンが求められているものと違うといった旨の警告が出てしまいました。

どうして起きたのか

警告でrequiredされているnode: '22.6.x'はどこから指定されているのでしょうか?
package.jsonを確認したところ以下の記述を発見しました。

package.json
"engines": {
    "node": "22.6.x"
},

enginesによってプロジェクト内で使用するNode.jsのバージョンが定義されているようです。

https://zenn.dev/ianchen0419/articles/9c101f03f319a4

currentのv22.10.0node -vで確認できました。

$ node -v
v22.10.0

プロジェクト内で指定したいNode.jsのバージョンと、私がbrewでインストールしたNode.jsのバージョンが異なっていることで警告が出てしまったようです。

解決策

Node.jsのバージョンをenginesで指定されている22.6.xにすれば解決しそうです。
brew install時にバージョン指定したら22.6.xになりますが、今後指定したいバージョンが変わったときに都度Wikiを書き換えるのは手間ですし、対応が漏れてしまいそうです・・・。
チームに相談したところ、次入ってくる人にも起こり得る現象なので、これを機に指定したバージョンで固定できる環境を用意しよう!となり、
Node.jsのバージョン管理ツール導入を決めました。

バージョン管理ツール導入にあたる条件

ツール導入にあたり、必要な条件を洗い出したところ以下の通りになりました。

  • Mac、Windowsともに動作し、導入が楽
    • 今のフロントメンバーはみなMacですが、Windowsも選べるので今後入社するメンバーのことも考慮したい
  • プロジェクトごとにシームレスにバージョンが切り替わること
    • 静的環境とアプリケーション環境と2つプロジェクトがあるので、ディレクトリを変えただけでバージョンが切り替わるのが理想
  • バージョン情報をプロジェクト内に保持できること
  • 余分な設定ファイルを作成しないこと
    • 管理しやすくしたい
  • 設定がシンプルなこと
    • Node.jsだけ管理できればOK(他の言語は不要)
  • 処理速度が高速であること
  • 直近でメンテナンスが行われていること

候補

上記の条件を元に調べたところ、Voltafnmが候補に上がりました。

しかしfnmは

  • ❌️Windowsでの導入手順が多く、大変そう → 条件:MacOS、Windowsともに動作し、導入が楽
  • ❌️.node-versionや.nvmrcに記述される → 条件:余分な設定ファイルを作らない

と条件を満たさない項目があったため、採用には至りませんでした。

選ばれたのはVoltaでした

理由は以下のとおりです。

  • 上記のバージョン管理ツール導入にあたる条件を満たしている
  • 将来的に npm 以外のパッケージマネージャー(yarn、pnpm など)を採用した場合でも、そのバージョンを一元管理できる
  • package.json でバージョン管理ができるため、追加の設定ファイルが不要
  • globalにインストールしたバージョンもプロジェクトごとに自動で管理してくれる
  • TypeScriptでの採用実績がある安心感

導入方法

https://docs.volta.sh/guide/getting-started
※公式ドキュメントを参考に導入しました。

導入した結果

将来Node.jsのバージョンを変更時にも、Node.jsのバージョンが記載されたpakcage.jsonをpullするだけで、チーム内で共通のバージョンに揃います。
これにより、チームとしてNode.jsのバージョン指定で迷う、バージョン違いによるnpm installでコケる、といった問題を解消することができました!

締め

今後参画するメンバーのことなども考慮して、今回のバージョン管理ツールの導入のようになるべく環境構築に躓かない仕組みを作っていき、業務の効率化に繋げられたらなと思います!
無事環境構築できてよかった〜!

BABY JOB  テックブログ

Discussion