Vue を使って Electron アプリを開発する

blog.kondoumh.com

Vue のことがちょっと分かった気になれました。すると、最近よく触っている Electron でのアプリ開発にも取り込みたくなります。

github.com

Scrapbox in Electron は WebView でサイトの画面を表示していますが、Electron では当然自前で画面を作ることもできます。その場合は Vue のようなフレームワークを適用するのが自然でしょう。

  • Web とアセットを共有したい
  • フレームワークのツールチェインや知識を流用したい

という意図があります。

electron-vue という Vue と Electron を使ったプロジェクトのボイラープレートがあります。

f:id:kondoumh:20190224130025p:plain

github.com

vue-cli が導入されていれば、以下のコマンドを叩いて、プロジェクト名などを入力するだけ。

$ vue init simulatedgreg/electron-vue my-project

Electron のインストールもお任せできます。

生成されたプロジェクトディレクトリに移動して

$ npm run dev

で、デフォルトの Electron アプリが起動します。

f:id:kondoumh:20190224125417p:plain

Vue 用のフォルダは src/renderer/components 配下になりますので、ここに Web アプリ用の Vue ファイルなどを配置します。

f:id:kondoumh:20190224140252p:plain

動きました。

f:id:kondoumh:20190224133624p:plain

Electron アプリとして作りこむためには、Renderer と Vue コンポーネント間の連携が必要ですが、そこをどう作りこむのか、Web とアセットの共有がどこまで可能かについてはやってみないと分からないところです。

2019/2/27 追記

Main Process のメニューから Renderer Process 経由で、ダイアグラムにノードを追加するコードはこんな感じになりました。

src/main/index.js

function createMenu () {
  console.log('createMenu')
  const template = [
    {
      label: 'Edit',
      submenu: [
        {
          label: 'add',
          click () {
            mainWindow.webContents.send('add', 'hoge')
          }
        }
      ]
    }
  ]

  const menu = Menu.buildFromTemplate(template)
  Menu.setApplicationMenu(menu)
}

src/renderer/components/JointDia.vue

<script>
  import joint from 'jointjs'

  export default {
    name: 'JointDia',
    mounted () {
      this.graph = new joint.dia.Graph()
         :
      this.$electron.ipcRenderer.on('add', (e, data) => {
        this.addNode(data)
      })
    },
</script>

this.$electron.ipcRenderer で IPC イベントを処理できます。

この例では、イベントを受けたいコンポーネントの mounted に直接ハンドラーを書きましたが、App.vue からディスパッチするようにすれば、サブコンポーネントは Web と同一にできそうな気がしました。