出落ちで済みませんが、Proton Nativeとか言うのを見つけて試した、というお話です。

React Nativeでモバイルアプリを書くようなノリでデスクトップアプリを書けるよ、っていうProton Nativeというフレームワークがありました。

kusti8/proton-native
A React environment for cross platform native desktop apps - kusti8/proton-native

裏ではlibui、そしてそのJSバインディングであるlibui-nodeが使われているらしい。libui、なに?って感じなので今度調べます。

インストールからひな形アプリの生成、そして起動までざっとやってみます。これはquick startに書いてある通りです。

% npm install -g create-proton-app
% create-proton-app my-app
% cd my-app
% npm run start

で、これをすると簡単なアプリが起動します。

class Example extends Component {
  render() { // all Components must have a render method
    return (
      <App> // you must always include App around everything
        <Window title="Proton Native Rocks!" size={{w: 300, h: 300}} menuBar={false}>
            {/* all your other components go here*/}
        </Window>
      </App>
    );
  }
}

コードはほぼReactです。サンプルとしてこれじゃあまりにアレなので、ボタンを置いて動かしてみました。

コードを↓のように変更して、ボタンを押したらダイアログを表示してみます。

class Example extends Component {
  render() { // all Components must have a render method
    return (
      <App> // you must always include App around everything
        <Window title="Proton Native Rocks!" size={{w: 300, h: 300}} menuBar={false}>
          <Button onClick={() => {
            Dialog('Message', {title: "ダイアログを開きましたね?"})
          }}>
            Open the Dialog!
          </Button>
        </Window>
      </App>
    );
  }
}

なんか小さくなった

ダイアログが出た

↑の例ではWindowサイズが無視されてボタンのサイズにフィットしてしまいました。余白をいれたり中央に配置したりできないかと色々試しましたが、どうやらレイアウトを微調整するのがかなり難しいことがわかりました。そもそもlibuiの癖なのか、ProtonNativeにAPIが足りないのか、そこまではまだわかっていません。実用にはもう少し成熟が必要そうです。

とはいえ、デスクトップアプリをサクッと作りたいと常日頃思っていたので、React Nativeに慣れている僕にとっては、似たような考え方で書けるProton Nativeの存在は期待しています。