💊

Apple Silicon でネイティブに Node.js v14 を動かせるのか

に公開

結論

Node.js v14.17.0 から Apple Silicon 対応がバックポートされているのでネイティブに動かすことができる

Node.js の対応状況

Apple Silicon 対応については v16 の話題ばかりでイマイチ v14 が対応しているのかどうか分からなかったので調べてみました。

v16 から公式対応

公式には v16(v15)以降で Apple Silicon へ対応しているとアナウンスされています。
https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V16.md#toolchain-and-compiler-upgrades
実際に v16 のリリースを見てみると darwin-arm64 が含まれていることがわかります。
https://nodejs.org/download/release/v16.13.0/

v14 以前のバージョン

公式の issue にこんな記述があります。

NOTE: Support is very unlikely to be back ported to 14.x or before due to requiring a SemVer Major V8 update
https://github.com/nodejs/node/issues/37309

「v14 以前だと大変だから多分サポートしないよ」ってことですね。
この投稿があってか Node.js の Apple Silicon 対応を調べると多くの記事では v14 では Rosetta 経由でしか動かないので 15 か 16 にしましょうと出てきます。

では実際対応されていないのかというと、そういうわけではなさそうです。
調べてみるとこの PR が引っかかり、これによると v14.17.0 からバックポートで対応されていそうです。
https://github.com/nodejs/node/pull/38051

我々にはまだ v14 が必要です

16系を使えば済む話ではあるのですが、14系で開発をしなければいけない場面もあります。
例えば AWS lambda だったりそれを使ってる vercel はまだ v14 までしか対応していません。
そういったサービスに依存しているプロダクトだと必然的に開発環境も 14系に固定されてしまいます。
という事情もあり実際にインストールしてみました。

ARM64 Binary な Node.js をインストール

asdf の場合

私は Node.js のバージョン管理に asdf を使っているのでこちらを使い、執筆時点で最新の 14.18.1 をインストールしてみます。

$ asdf install nodejs 14.18.1
Binary not found for version 14.18.1

バイナリが見つかりませんと出てしまいます。
どうやら 14系の mac 用 ARM64 バイナリは公開されていないようです。
https://nodejs.org/download/release/v14.18.1/

やっぱりだめなのかーと思っていたのですが更に調べてみると、どうやら自分でビルドすればインストールできるとか。
やってみます。
※ asdf でソースコードからビルドする方法はこちらを参考

$ NODEJS_CONFIGURE_OPTIONS='--with-intl=full-icu --download=all' NODEJS_CHECK_SIGNATURES="no" asdf install nodejs ref:v14.18.1

10分ほど待つと...

無事動かすことができました。
M1 Pro なのでこころなしかビルドが早かったように感じます。
(初めて Node.js をビルドしたので Intel CPU でどれだけ時間がかかるのかは不明)

nodenv の場合

nodenv の場合、通常と同じコマンドでインストールできるようです。
しかしネイティブバイナリがないのでこちらもビルドが始まりしばらく時間がかかる模様。

$ nodenv install 14.18.1

https://github.com/nodenv/node-build/issues/663#issuecomment-886068598

Discussion