開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. Javascript >
  4. JavaScriptでデスクトップアプリを開発できるGluonを試す

JavaScriptでデスクトップアプリを開発できるGluonを試す

こんにちは、ナカエです。

寒い日が続き、京都も10年に一度レベルの雪に見舞われておりました。京都市の北側はそうでもないかもしれませんが、3日以上連続で雪が降っているのはほとんど記憶にないですね。

さて、本日の記事は、JavaScriptを用いてデスクトップアプリを開発できる Gluon の紹介です。

gluon-site.png

Web技術を用いたデスクトップGUIアプリケーション開発の分野において、一番有名かつシェアが高いのは Electron で、最近はより軽量な Tauri がバージョン1に到達して注目を集めているといったところでしょうか。

これらに対しGluonは内蔵のブラウザやWebViewを利用せず、システムにインストールされたブラウザを利用するという特徴をアピールしています。

Gluonの命名はElectronへの対抗やブラウザとNode.jsアプリの糊付けという点を意識したせいかどうかはわかりませんが、物理のハドロン(ex. 陽子や中性子)内の粒子から取ったと思われます。

グルーオン(英: gluon)とは、ハドロン内部で強い相互作用を伝える、スピン1のボース粒子である

グルーオン - Wikipedia

 

競合との比較

GluonのGitHubのリポジトリ に競合との比較表が記載されています。

内部で使われるソフトウェア・技術

GluonはIPC(プロセス間通信)を用いてフロントエンドのブラウザとバックエンドのNode.jsアプリの間でやりとりするシンプルなアーキテクチャになっています。

フロントエンドのブラウザも、バックエンドで動くアプリも双方がシステムにインストールされているものを使っているのが特徴です。

Part Gluon Electron Tauri Neutralinojs
Frontend System installed Chromium or Firefox Self-contained Chromium System installed webview System installed webview
Backend System installed or bundled Node.JS Self-contained Node.JS Native (Rust) Native (Any)
IPC Window object Preload Window object Window object
Status Early in development Production ready Usable Usable
Ecosystem Integrated Distributed Integrated Integrated

https://github.com/gluon-framework/gluon より引用

ベンチマーク/統計情報

ビルドサイズはChromium内蔵のElectronと比較するとそれなりの差がありますが、TauriやNeutralinojsと比べるとストレージが安い時代においてこれを利点とアピールするのは苦しい感じがあります。

ブラウザ側の利用メモリはどれもさほど差はなく、バックエンドのアプリはネイティブアプリであるTauriやNeutralinojsほど使用量が少なくないのは予想通りですね。

ビルドタイムとありますが、Gluonは現在のところビルドのプロセスがない(強いて言えばnpm installくらい)のでNodeのスピンアップタイムを指しているようです。

Stat Gluon Electron Tauri Neutralinojs
Build Size <1MB ~220MB ~1.8MB ~2.6MB
Memory Usage ~80MB ~100MB ~90MB ~90MB
Backend Memory Usage ~13MB (Node) ~22MB (Node) ~3MB (Native) ~3MB (Native)
Build Time ~0.7s ~20s ~120s ~2s

同じく https://github.com/gluon-framework/gluon より引用

注)
- CluonのブラウザはChromeを利用
- Windows 10のマシンの上で、2022/12/09時点での最新版を使って計測したとのこと

対応ブラウザ

A Chromium or Firefox based browser installed (Chrome, Firefox, Edge, etc)

とあり詳細がわからなかったため、Gluonでウィンドウを開く際のオプションの一つであるforceBrowser の型を確認しました。現時点ではSafariには対応していないようですね。

type Browser =
  'chrome'|'chrome_beta'|'chrome_dev'|'chrome_canary'|
  'chromium'|'chromium_snapshot'|
  'edge'|'edge_beta'|'edge_dev'|'edge_canary'|
  'firefox'|'firefox_nightly'|
  'thorium'|
  'librewolf';

Node.jsのバージョン

バックエンドアプリもバンドルされたNode.jsではなく、OSにインストールされているNode.jsを使います。

Node.js – 16.x or newer

とあり、Node.js 16以上に対応しているようです。

また、deno ブランチbun ブランチ でそれぞれDenoやBunへの対応が進められています。

個人的にはDenoでTypeScriptでサクッと始められるようになると嬉しいですね。

ブラウザもNodeのバージョンも自由に選択できる自由度が魅力的な反面、開発したアプリケーションの各ブラウザへの対応やインストーラの用意などは大変になりそうな感じがします。

試しにGluonでTwitterのサイトを開く

Quick Start で紹介されている サンプルアプリのリポジトリ には、

  • Hello worldのサンプル
  • DoomをWASMで動かすサイト https://silentspacemarine.com を開くサンプル
  • Discordの公式サイトを開くサンプル


の3つが含まれています。 リポジトリをクローンしてそれぞれのサンプルのディレクトリに移動し、 npm install を実行してから node . ですぐ起動できるようになっています。

あまりに簡単だったので、別途Twitterの公式サイトを開くだけのアプリを作ることにしました。 Mac対応はまだExperimentalのようですが起動くらいまではいけるでしょうという気持ちです。

環境

  • OS: macOS Monterey 12.6.3
  • CPU: Apple M1 Max
  • zsh 5.8.1
  • Node 18.1.0
  • npm 8.8.0
  • Chrome 109.0.5414.119
  • Firefox 108.0.1

作成手順

mkdir gluon-twitter
cd gluon-twitter

npmで初期化しpackage.jsonを作成します。

npm init

先程のサンプルに合わせてtypeはmoduleにしておきます。

packager.json

{
  "name": "gluon-twitter",
  "type": "module",
  "version": "1.0.0",
  "description": "Gluon twitter",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "n1215",
  "license": "UNLICENCED"
}

次にGluonのパッケージをインストールし、

npm install @gluon-framework/gluon

index.js を 書けば準備完了です。

import * as Gluon from "@gluon-framework/gluon";

await Gluon.open(
  "https://twitter.com",
  {
    onLoad: () => {
      console.log("Hello from Gluon!");
    },
    forceBrowser: "chrome",
    windowSize: [400, 800]
  }
);

アプリ起動

アプリを作成したディレクトリで

node .

とするとアプリが起動してTwitterのサイトが表示され、Developer Toolのコンソールに Hello from Gluon! との表示が確認できました。

gluon-twitter-open.png

ちなみにそのままGoogleアカウントでログインしようとするとエラーになりました。何故だ。

gluon-twitter-google.png

また、Chromeをすでに複数ウィンドウで起動しているとクリックなどの応答が悪い感触があったので、一度Chromeを落としてから起動したほうが良いのかもしれません。

試しにブラウザをFirefoxに変更するとブラウザのウィンドウは起動しましたが、コンソール側でバックエンドのNode.jsアプリがエラーで落ちてしまいました。今のところはChromeやChromiumを使うほうが良さそうです。

[Gluon] starting browser...
[Gluon] found browser firefox (firefox based) at path: /Applications/Firefox.app/Contents/MacOS/firefox
[Gluon] data path: /Users/nextat/workspace/gluon-twitter/gluon_data/firefox
[Gluon] connecting to CDP over websocket (46175)...
.....[Gluon] got main process target websocket url: ws://127.0.0.1:46175/devtools/browser/cace5507-af77-4741-8512-9106c4242a54
file:///Users/nextat/workspace/gluon-twitter/node_modules/@gluon-framework/gluon/src/lib/cdp.js:89
    const ws = new WebSocket(wsUrl);
               ^

TypeError: WebSocket is not a constructor

まとめ

執筆時点でのGluonの最新バージョンは0.12.0であり、流石にまだまだ不安定だと感じました。 しかし、内臓のChromiumやWebViewを利用しないというユーザにとって自由度が高い思想は応援したいですし、APIも手軽に利用できそうでした。

設計方針に依るトレードオフはあるにせよ、安定してくれば選択肢の一つとして検討できるかもしれません。今後に期待です。

TOPに戻る