🎃

`volta run --node=16 node ./run.js` でバージョン指定して Node を実行できる

2023/03/27に公開

https://github.com/sosukesuzuki/array-prototype-at-perf/ みたいな Node.js のバージョンごとにパフォーマンスが変わることが期待されるスクリプトのベンチマークをとるときに、簡単に Node.js のバージョンを切り替えつつ同じスクリプトを実行できると便利である。

もともとディレクトリを分けて package.json を配置し、ディレクトリ単位で Volta を使って Node.js のバージョンを固定していた。

のだが、Volta のドキュメントを見ていたところ volta run というコマンドを使えば、コマンド単位で Node.js のバージョンを指定できる。

https://docs.volta.sh/reference/run

あるスクリプト run.js を、Node.js v16, v18, v19 で実行したいときはそれぞれ

volta run --node=16 node ./run.js
volta run --node=18 node ./run.js
volta run --node=19 node ./run.js

みたいにすれば良い。

筆者はシェルスクリプト・パワーが低いので大体なんでも Node.js でやってしまうが、こんな感じでシュッとできる。(ESMじゃないのでTLAを使ってない)

const child_process = require("node:child_process");
const util = require("node:util");

const exec = util.promisify(child_process.exec);

(async () => {
  const [outputForNode16, outputForNode18, outputForNode19] = await Promise.all(
    [
      exec("volta run --node=16 node ./run.js").then(({ stdout }) => stdout),
      exec("volta run --node=18 node ./run.js").then(({ stdout }) => stdout),
      exec("volta run --node=19 node ./run.js").then(({ stdout }) => stdout),
    ]
  );
)();

Discussion