Nodejs v20 が公開されたので使ってみる~単一実行可能ファイル作成を試す~

主な更新箇所

下記6点(詳細はリンクを参照)
* Experimental Permission Model
* A synchronous import.meta.resolve
* Stable Test Runner
* V8 JavaScript engine updated to 11.3
* Single Executable Apps
* Ada to 2.0

あとはWindowsもARM版がリリースされてるとのこと

openjsf.org nodejs.org

アンインストール

既存Versionをアンインストール

sudo apt remove nodejs apt

インストール

私の環境はUbuntuなのでaptで…と言いたいところだけどまだ公開されてないっぽいのでバイナリを取得
以下からダウンロード
Download | Node.js

$ VERSION=v20.0.0
$ DISTRO=linux-x64
$ wget https://nodejs.org/dist/$VERSION/node-$VERSION-$DISTRO.tar.xz -O /tmp/node-$VERSION-$DISTRO.tar.xz
$ sudo mkdir -p /usr/local/lib/nodejs
$ sudo tar -xJvf /tmp/node-$VERSION-$DISTRO.tar.xz -C /usr/local/lib/nodejs 
$ sudo ln -s ./node-$VERSION-$DISTRO /usr/local/lib/nodejs/node

wgetするURLはダウンロードページのバイナリを指定

.profileに下記追加

export PATH=/usr/local/lib/nodejs/node/bin:$PATH

Version確認

$ . .profile
$ node -v
v20.0.0
$ npm version
{
  npm: '9.6.4',
  node: '20.0.0',
  acorn: '8.8.2',
  ada: '2.0.0',
  ares: '1.19.0',
  brotli: '1.0.9',
  cldr: '42.0',
  icu: '72.1',
  llhttp: '8.1.0',
  modules: '115',
  napi: '8',
  nghttp2: '1.52.0',
  nghttp3: '0.7.0',
  ngtcp2: '0.8.1',
  openssl: '3.0.8+quic',
  simdutf: '3.2.7',
  tz: '2023c',
  undici: '5.21.0',
  unicode: '15.0',
  uv: '1.44.2',
  uvwasi: '0.0.16',
  v8: '11.3.244.4-node.3',
  zlib: '1.2.13'
}

試してみる

パフォーマンス改善の[V8 JavaScript engine updated to 11.3]
使いやすくなった[Stable Test Runner]
モジュール開発に使用する[A synchronous import.meta.resolve]
権限管理が可能になる[Experimental Permission Model ] [Ada to 2.0]は2.0に更新
上記はとりあえず追々やりたいと思う

個人的に気になったSingle Executable Appsを試したいので試す。

Single Executable Apps

直訳で単一実行可能アプリ。つまりNodejsで実行可能バイナリファイルが作成できるようになったという事。
まだ試験的な機能らしいが、もしこれが本実装された場合、今後Nodejsをインストールせずに作成したNodejsアプリが実行可能になるため、配布などがしやすくなる。とてもうれしい。
どうも機能が組み込まれたのはNode19.7からとのこと。Node18までしか触ってなかったのでもっとちゃんと追っていきたいなと思う。

APIドキュメントにサンプルがあるのでまずはそれを試す。

Single executable applications | Node.js v20.0.0 Documentation 見た感じ作成したスクリプトでBLOBを作成してインストールしているnodeコマンドに挿入して動かす仕組みっぽい。(すごいことしてない?)
とりあえずサンプルそのまま試す。

  1. サンプルスクリプト生成
$ echo 'console.log(`Hello, ${process.argv[2]}!`);' > hello.js 
  1. 構成ファイルを作成
$ echo '{ "main": "hello.js", "output": "sea-prep.blob" }' > sea-config.json 
  1. BLOBを生成
$ node --experimental-sea-config sea-config.json 
Wrote single executable preparation blob to sea-prep.blob
  1. ベース実行可能ファイル作成
$ cp $(command -v node) hello
  1. バイナリの署名を削除 MacOSWIndowsはここで署名削除をする。

6 生成したベース実行可能ファイルにBLOBを挿入 Linuxは下記コマンドで挿入可能。npxはnodejs v20に標準でインストール済み。postject も実行時にインストールしてくれるっぽい。

npx postject hello NODE_SEA_BLOB sea-prep.blob --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 

github.com

  1. バイナリに電子署名 MacOSWIndowsはここで署名をする。

  2. 実行してみる

$ ./hello 世界
Hello, 世界!
(node:4453) ExperimentalWarning: Single executable application is an experimental feature and might change at any time
(Use `hello --trace-warnings ...` to show where the warning was created)

試験的な機能である旨警告は出ますが実行はできました。

  1. 出力されたファイルを確認
$ ls -l hello
-rwxr-xr-x 1 nao nao 95685760 Apr 21 01:16 hello

Nodejsのバイナリにくっつけているため最小でも92MBになりますね…