Electronの公式サイトを見ると、以下の様なバージョン表記が掲載されています:
直感的に考えて、現在のElectronバージョンで利用されているnode.jsバージョンとChromiumバージョンとV8バージョンだろうなということは容易に分かると思います。
しかしながら、Electronにはメインプロセスとレンダープロセスがあり、いずれにおいてもJavaScriptが実行出来るので、結局のところどのバージョンがどこの実装に影響するかはいまいちピンと来ません。
この記事ではElectronにおけるnode.jsとChromiumとV8エンジン利用の仕組みを説明しながら理解を深めていきたいと思います。
目次
細かいことは良いから結論
仕組みは良いから早く教えて!という方の為に結論は以下になります:
- メインプロセス(xxx.js)・レンダープロセス(xxx.htmlから呼び出されるJS)どちらも言語仕様はV8バージョンに従う
- JSで利用(require)するライブラリはメイン・レンダーどちらもnode.jsバージョンのものを使う
- ElectronはChromiumで利用しているV8を使うのでnode.jsで利用されているV8エンジンよりも進んだバージョンで利用出来る
以降、Electronの仕組みを説明していきます。
node.jsによるNative APIとChromiumの結合
ElectronはNative APIとChromiumを2種類のプロセス、メインプロセスとレンダープロセスに共通のnode.jsを利用し、IPCで相互通信することで結合しています。
メインプロセスはOSに対するNative APIやWindowやMenuなどのGUI操作をnode.jsで行い、レンダープロセスはChromiumによってHTML表示したり、DOM操作他Web APIをnode.jsで操作します。
このレンダープロセスに共通のnode.jsを組み込んだ点がElectronを特徴付ける仕組みとなっており、Native操作とChromium操作の連携を実現しています。
言語バージョンはV8エンジンのバージョン
JavaScriptコードの解釈・実行はV8エンジンで行われ、Electronではメインプロセス・レンダープロセスの区別は無く共通のものを利用します。
async / awaitがいつ対応されるか等の言語仕様に関する対応状況はnode.jsやChromiumのバージョンを見るのでは無く、V8のバージョンを確認することで正確に把握出来ます。
node.jsバージョンは標準モジュールのバージョン
Electronで記載されているnode.jsのバージョンはProcessやFile System等の標準モジュールのようなnode.js APIバージョンにあたります。npmモジュールを利用する場合のAPI互換性をチェックするにはこのバージョンを確認する必要があります。
V8エンジンはChromiumのものを利用する
node.jsもChromiumもV8エンジンを持っていますが、Electronで使用するV8エンジンはChromiumのバージョンのものを利用します。一般的にChromiumのV8エンジンの方がnode.jsよりもバージョンが先行するようで、Electronで利用しているnode.jsバージョンの言語仕様はたいていの場合全て利用出来るという仕組みになっています。
上手くElectronのJavaScriptを活用していきたい
2018/2/21時点でのElectron最新版の1.8.2はV8 5.9となっておりES2017の一部言語仕様までサポートするようになっており、静的型付けなどは別としてTypeScript等のトランスパイラやPolyfill無しでも十分に素のJavaScriptで記載しやすくなっていると思います。
Electronであれば単一のV8エンジンで動作させることが可能になっていますのでシンプルなモジュール構造をなるべく保ったままアプリケーションを構築できると上手くElectronのJavaScriptと付き合っていけるかと思います。