そんな気軽に使えないものなら使わないかなと思っていましたが もっと簡単に使えるスナップショット機能も入ったようです
const foo = 1
globalThis.bar = foo
というスクリプトを用意して --build-snapshot で指定します
node --build-snapshot ss.js
すると snapshot.blob ファイルが作られるので これを --snapshot-blob に指定して実行します
root@d4572737f3a3:/tmp# node --snapshot-blob snapshot.blob
Welcome to Node.js v18.10.0.
Type ".help" for more information.
> foo
Uncaught ReferenceError: foo is not defined
> bar
1
ここでは実行するスクリプトを指定していないので REPL が起動しています
ここで foo と bar にアクセスしてみると bar の方は 1 が入ってます
グローバル変数以外のモジュールのトップレベルのスコープなどは引き継がないみたいで foo の方は見つかりませんでした
export の代わりに globalThis に入れておけば Node.js でスクリプトの実行時に最初から使えます
準備に時間がかかる処理があって スクリプトを繰り返し実行するときには便利そうですね
コマンドラインツールはもちろんですが ウェブサーバーやアプリケーションでも呼び出すと起動する関数をグローバル変数に配置しておいて 実行時のスクリプトはそれを呼び出すだけにすると高速で起動ができそうです
ただグローバル変数を使うのはあまりやりたくないです
モジュールにすればできるかなと思ったのですが require してもあるはずのモジュールが見つかりませんでした
require を見てみると
[Function: requireForUserSnapshot]
というもので通常の require とは別物になってるようです
基準パスが変わってたりするのかなと 絶対パスでモジュールを指定してみましたが これでもインポートできませんでした
調べてみるとドキュメントに記載がありました
https://nodejs.org/docs/latest-v18.x/api/cli.html#--build-snapshot
まだ 実験的なものなのでいくつか制限があって そのひとつでユーザーランドのモジュールはサポートしていないようです
バンドルして 1 ファイルにすれば動かせるそうです
ということはグローバル変数に置くしかなさそうですね
それにブラウザでならともかく Node.js でまでバンドルはしたくないので この辺がサポートされるの待ちです
完全に使えるようになると色々便利そうなので期待の機能です