Chrome も Node.js もなしで JavaScript の最新機能を試す
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ Windows Sandbox は起動やインストールが手間だし Home Edition で使えない
◆ Node.js は V8 バージョンがそこまで新しくなかった
◆ V8 を直接使う
◆ パッケージはなさそうなので自分でビルド (追記:→ jsvu で簡単インストールできた)
◆ 面倒だし要求スペック高いし時間がかかるので気軽にやるものではない
◆ Node.js は V8 バージョンがそこまで新しくなかった
◆ V8 を直接使う
◆ パッケージはなさそうなので自分でビルド (追記:→ jsvu で簡単インストールできた)
◆ 面倒だし要求スペック高いし時間がかかるので気軽にやるものではない
いつもは Sandbox に Chrome をインストール
Chrome に追加される新機能の動きを実際に確認したいときは beta や dev や canary を入れますでも 普段遣いするわけではないですし ブラウザは重たいですし 直接インストールしたくないです
なので いつもは Windows Sandbox の中に Chrome をインストールして動作を確認しています
ですが Windows Sandbox って Pro エディションが必要です
Home エディションの端末を使ってるときもあります
ググると Home エディションでも Sandbox を有効化するみたいなのは見かけますけど なんか怪しさを感じますし そもそもできたとしてもそれライセンス的に大丈夫なの?という不安もあります
それに Windows Sandbox を使う場合でも Windows Sandbox の起動の遅さとメモリ使用量の多さと毎回 Chrome のインストールで時間がかかるという不満点もあります
HTML や CSS 機能ならともかく JavaScript のプログラム的な機能だけなら CLI で済ませたいです
Node.js は
となれば Node.js ですLTS ではない本当の最新バージョンならできるかもと思いました
Chrome のどのバージョン相当かを確認するため V8 バージョンを確認します
user@LAPTOP04:/$ node -v
v20.5.0
user@LAPTOP04:/$ node -p "process.versions.v8"
11.3.244.8-node.10
11.3 なので Chrome 113 相当です
少し古いですね
リリースページを見てみましたが 最新版でもこのバージョンでした
https://nodejs.org/en/download/releases
Node.js だと Chrome よりも V8 バージョンは古いようです
期待外れです
V8 を直接使う
Node.js を使えないとなると V8 エンジンを直接使うしかなさそうですとはいえ V8 を直接インストールなんてしたことがないです
過去にやったことあるのは PHP とか C# に組み込むための特殊なものでしたし 外部プログラムから使う用途であってスタンドアローンで実行する用ではないです
そもそもパッケージとして配布されているのでしょうか?
パッケージ
探してみましたが Ubuntu22.04 と AlmaLinux9 (EPEL 含む) では見つかりませんでしたfedora だと一応あったものの v8-314 という名前です(314 って何?)
バージョンにしては現在の 11.8 とは違いすぎです
試しに入れてみました
たしかに JavaScript が動くので V8 ではあるようなのですが かなり古いのかアロー関数すら構文エラーでした
[root@9450518efdd7 /]# d8-314
V8 version 3.14.5.10 [console: readline]
d8> 1+1
2
d8> const a = 1
d8> a
1
d8> [1].map(x => x + 1)
(d8):1: SyntaxError: Unexpected token >
[1].map(x => x + 1)
^
SyntaxError: Unexpected token >
d8> [1].map(function(x) { return x + 1 })
2
配列の map メソッドはあるので ES5 は対応してそうですが ES2015 は対応してないみたいです
バージョンも 3.14 と書かれてます
なぜこんなのが残ってるの?とググってみるとこんなページがありました
https://src.fedoraproject.org/rpms/v8
V8 は、ECMA-262、第 3 版で指定されている ECMAScript を実装します。これはバージョン 3.14 で、Google によるメンテナンスは行われなくなりましたが、他の多くのソフトウェアで採用されました。
他のパッケージの依存関係で使うから残ってるということでしょうか?
それだと AlmaLinux など RHEL 系全部にありそうですが fedora だけです
一応 「dnf repoquery --whatrequires」 で調べてみましたが v8-314-devel しか出てきませんでした
よくわかりませんが なんにせよパッケージマネージャーから最新版の V8 はインストールはできなさそうです
nodesource みたいなリポジトリも見当たらないですし
ビルドする
パッケージから入れるのは無理そうなので 諦めて自分でビルドすることにします公式サイトの手順どおりに行います
https://v8.dev/docs/build
OS は Ubuntu22.04 を使います
最初は AlmaLinux9 で試したのですが途中でエラーが出て lsb-release が入ってないと言われました
RHEL 系だと redhat-lsb-core というパッケージらしいのですが インストールしようとすると見つかりません
ググるとこういうページがありました
https://forums.centos.org/viewtopic.php?t=78779
RHEL の 8 系を最後に廃止されていて 9 系ではリリースされてないみたいです
代わりの方法に関することも書かれていたりしますが V8 が要求する以上 どうしようもないので AlmaLinux9 はやめて Ubuntu にしました
Docker イメージの Ubuntu:22.04 を使う場合 必須コマンドがいくつか入っていないので次のパッケージは最初に apt で入れておいたほうが良いです
git, curl, python3, xz-utils, lsb-release, sudo, file
入ってないと途中でエラーになって面倒が増えます
リポジトリの clone は depot_tools というのを使う必要があるようです
まずはこれをインストールします
インストール場所は /opt にしてます
cd /opt
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=/opt/depot_tools:$PATH
パスを通すと fetch や gclient コマンドが使えるようになります
gclient コマンドを実行すると gclient 自身をアップデートするらしいです
gclient
clone したばかりなら最新だと思うので必要なのかは不明です
手順にあるのでとりあえずやっておきます
手順に従って v8 フォルダを作ってそこで fetch を行います
v8 フォルダが二重になるので mkdir はしなくてもいいと思います
mkdir v8
cd v8
fetch v8
cd v8
fetch は単純な git の clone だけでなく サブパッケージのダウンロードやフックの実行など追加で色々なセットアップもしてくれるようです
結構時間がかかりました
直接 git clone するとこれらが行われず次が動かないので fetch コマンドで実行する必要があります
次の手順は V8 のソースコードを最新にするためのものです
git fetch
gclient sync
git pull はブランチにいる必要があるので ブランチを作ったり移動したりしてないなら git fetch です
gclient sync では fetch コマンドで clone の後にやってくれていたセットアップをやってくれるようです
ソースコードに差分があった場合にそれの分の更新みたいです
これらも fetch コマンド直後だと不要そうな気がしますがとりあえずやっておきます
次は依存関係のインストールです
./build/install-build-deps.sh
OS のパッケージマネージャで色々なパッケージがインストールされます
700 以上あって ここでも待たされます
最後にビルド操作です
./tools/dev/gm.py x64.release
とても時間がかかります
正確に測っていませんが 30 分はかかった気がします
また メモリを多く使用します
WSL の Docker コンテナでビルドをしていたのですが 1 回目はメモリ不足で落ちました
メモリ 8GB の Windows 環境だったので WSL の最大メモリ割り当て量は 4GB です
さらにスワップが 1GB です
5GB だと足りないみたいです
メモリ 6GB + スワップ 12GB にして再挑戦すると無事ビルドできました
free コマンドを何度か実行して確認していましたが スワップは使ってるときでも 1GB ちょっとくらいでした
8GB あれば足りそうです
ちなみに WSL のメモリの設定は C:\Users\username\.wslconfig のようにユーザーフォルダの直下に .wslconfig ファイルを作ります
中身は
[wsl2]
memory=6GB
swap=12GB
みたいな感じで書きます
ビルドが終わったら成果物は out/x64.release フォルダにあります
d8 コマンドが REPL になっています
d8 コマンドの説明はここ
root@2cacf0a17ec0:/opt/v8/v8/out/x64.release# ./d8
V8 version 11.8.0 (candidate)
d8> 1+1
2
d8> [1, 2].with(0, 10)
[10, 2]
引数にファイルを渡せばファイルの実行もできます
[tes.js]
function* gen() {
let i = 0
while (true) {
yield i++
}
}
console.log(
gen().map(x => x * 3).filter(x => x % 2).drop(1).take(3).toArray()
)
root@2cacf0a17ec0:/opt/v8/v8/out/x64.release# ./d8 tes.js
9,15,21
最新の V8 なので まだ Chrome でも動かない Iterator helpers の機能が動いてます
不便な点で console.log で出力できるものの Node.js ほどリッチなものではなく 単純に文字列化されるようです
配列だと join(",") が行われて 「,」 区切りになって [] は表示されません
面倒すぎた
これで Chrome も Node.js もインストールせず最新の JavaScript 機能を試せたわけですが 手順が面倒すぎです特にビルドは時間がかかりすぎでした
メモリが足りないので 他の起動中ソフトを全部落としたりもしましたし
これなら Windows Sandbox に毎回 Chrome をインストールしたほうがいいと思います
試すときにブラウザのコンソールを使えるというメリットもありますし
これは Windows Sandbox が使えず Chrome の dev バージョンなどを直接インストールしたくないときの最後の手段ですね
追記: jsvu
そういえば Playwright 的なもので E2E じゃなく JavaScript のエンジンを対象にテストするためのツールがありましたV8 もあったはずですし もしかしてこれなら最新の V8 エンジンを簡単に入れられる?と思って試してみました
npx jsvu
環境やインストールするエンジンを選ぶ画面になるので 使っている OS と V8 を選びます
他エンジンもデフォルトでチェックされていますが 不要なので除外します
📦 jsvu v2.1.0 — the JavaScript engine Version Updater 📦
? What is your operating system? Linux 64-bit
? Which JavaScript engines would you like to install? V8
✔ Found latest V8 version: v11.8.28.
✔ URL: https://storage.googleapis.com/chromium-v8/official/canary/v8-linux64-rel-11.8.28.zip
✔ Download completed.
❯ Extracting…
Installing library to ~/.jsvu/engines/v8/icudtl.dat…
Installing library to ~/.jsvu/engines/v8/snapshot_blob.bin…
Installing binary to ~/.jsvu/engines/v8/v8…
Installing wrapper script to ~/.jsvu/bin/v8…
✔ Extraction completed.
✔ Testing completed.
✔ V8 v11.8.28 has been installed! 🎉
インストールできたみたいです
しかも 11.8 と最新です
~/.jsvu/bin/v8 に実行ファイルがあります
[root@9151f6b3f7ed opt]# ~/.jsvu/bin/v8
V8 version 11.8.28
d8>
d8 が起動しました
これで良さそうですね
最初にこれに気づいていれば半日ほどの苦労がいらなかったのに
直接ダウンロード
ダウンロードしている URL は以下でしたhttps://storage.googleapis.com/chromium-v8/official/canary/v8-linux64-rel-11.8.28.zip
親フォルダにアクセスしたら一覧が見れるかなと思ったのですが エラー画面でした
https://storage.googleapis.com/chromium-v8/ までにすると一覧画面になりましたが S3 の XML 形式です
それなら prefix で絞り込めそうなので 試してみます
https://storage.googleapis.com/chromium-v8/?prefix=official/canary/v8-linux64-rel
絞り込めてはいますが canary で 64 bit Linux でリリースビルドとまで絞り込んでも 上限の 1000 件を超えています
多すぎで一覧から選んでダウンロードは向いてなさそうなので jsvu を使ったほうが良さそうですね
ところで Google なのに GCP じゃなくて AWS の S3 を使ってるのが意外でした