@wakufactory さんの MarkDownDiagram を Electron で起動するようにしてみた

@wakufactory さんの [MarkDownDiagram](https://github.com/wakufactory/MarkDownDiagram) は、Chrome、Safari や Firefox があれば、ローカルでブラウザのみで動作します。(Internet Explorer 11 では動作せず。)

職場の都合上、自由にブラウザをインストールできないため展開するだけで使える electron 化をしたかったので試してみました。

## 筆者の環境

- [VineSeed](https://vinelinux.org/vineseed.html) ([Vine Linux](https://vinelinux.org/) 開発版) 64bit
- [nodebrew](https://github.com/hokaccha/nodebrew) use v4.4.7(LTS)

## Fork とブランチ作成

誠に勝手ながら、repository を Fork させていただき、use-electron というブランチを切りました。

[yasumichi/MarkDownDiagram at use-electron](https://github.com/yasumichi/MarkDownDiagram/tree/use-electron)

そしてローカルに clone して当該ブランチをチェックアウトしました。

```
$ git clone https://github.com/yasumichi/MarkDownDiagram.git (実際には SSH アクセス)
$ git checkout -b use-electron origin/use-electron
```

## .gitignore の作成

[Node.js](https://nodejs.org/en/) を使用するにあたり、node_modules ディレクトリ以下などを git に無視してもらうために [gitignore/Node.gitignore at master · github/gitignore](https://github.com/github/gitignore/blob/master/Node.gitignore)から、 .gitignore を拝借してきました。

```
$ git add .gitignore
$ git commit -m "message..."
```

## npm 初期化

例のごとく、
```
$ npm init
```
で [package.json](https://github.com/yasumichi/MarkDownDiagram/blob/use-electron/package.json) を作成しました。(個人的に最初からエディタで書くのは気が進まない :sweat_smile: )

name の入力時にデフォルト値を使用しようとすると

```
name: (MarkdownDiagram)
Sorry, name can no longer contain capital letters.
```

というように name に大文字は使えないよ、と怒られたので markdown_diagram にしました。

entry point は、[js/main.js](https://github.com/yasumichi/MarkDownDiagram/blob/use-electron/js/main.js) としました。

## 必要な node_modules の install

electron-prebuilt と electron-packager をプロジェクトローカルにインストールしました。

```
$ npm install --save-dev electron-prebuilt
$ npm install --save-dev electron-packager
```

## メインプロセスの作成

先ほど、entry point に指定した [js/main.js](https://github.com/yasumichi/MarkDownDiagram/blob/use-electron/js/main.js) を作成しました。

単純に BrowserWindow を生成して、 [index.html](https://github.com/yasumichi/MarkDownDiagram/blob/use-electron/index.html) を読み込むだけだとダイアグラム部分が描画されませんでした。

View -> Toggle Developer Tools で開発者ツールを呼び出し、Console を確認すると以下のメッセージが出力されていました。

```
Uncaught ReferenceError: $ is not defined
```

jQuery がうまく認識できていないようです。

@pirosikick さんの[ElectronでjQueryがundefinedになる](http://qiita.com/pirosikick/items/72d11a8578c5c3327069)によるとレンダラプロセス側(index.html)で jQuery の読み込み方を変えるという方法も提示されていたのですが、これをやってしまうと普通にブラウザで開いた時に逆にダイアグラムが描画できなくなってしまいました。

[メインプロセス側JSでBrowserWindowをインスタンス化する時のオプションに'node-integration': falseを追加する](http://qiita.com/pirosikick/items/72d11a8578c5c3327069#node-integration-false) の方を試してみましたが、うまく行きません。

再度、本家の [FAQ](http://electron.atom.io/docs/faq/) を確認してみることにしました。

[I can not use jQuery/RequireJS/Meteor/AngularJS in Electron.](http://electron.atom.io/docs/faq/#i-can-not-use-jqueryrequirejsmeteorangularjs-in-electron) の節を確認すると当時と作法が若干、変わってしまったようです。

```js
// In the main process.
const {BrowserWindow} = require('electron')
let win = new BrowserWindow({
  webPreferences: {
    nodeIntegration: false
  }
})
```

上記のように nodeIntegration オプションが、webPreferences オプションの一部(?)になったようです。(個人的には、メソッドの最後に ; を付けないと落ち着かない… :sweat_smile: )

これで electron を使用した際もブラウザで読み込んだ際も問題なく、ダイアグラムが描画されるようになりました。

## 起動確認

```
$ ./node_modules/.bin/electron .
```

上記コマンドで起動確認をします。[package.json](https://github.com/yasumichi/MarkDownDiagram/blob/use-electron/package.json) の scripts に以下の様に記述を追加すると `$ npm start` でも起動できるようになります。

```diff
   "scripts": {
+    "start": "electron .",
     "test": "echo \"Error: no test specified\" && exit 1" 
   },
```

## GitHub への反映

以下の手順で GitHub のリモートブランチへ反映しました。

```
$ git add js/main.js package.json
$ git commit -m "add files using electron"
$ git push
```

## パッケージ作成例

以下は、Windows 32bit 環境向けにパッケージを作成する例です。(Linux 環境の場合、[wine](https://www.winehq.org/)が必要です。)`--prune`オプションにより、開発時にのみ必要な node_modules を含まないようにできます。

```
$ ./node_modules/.bin/electron-packager --platform=win32 --arch=ia32 --prune --asar=true --out=releases .
```

上記コマンドにより、 releases/markdown_diagram-win32-ia32 以下にパッケージが展開されます。アーカイブはされないので必要に応じ、zip などで圧縮してください。

|:warning: 今の所、リリースパッケージは公開していません。|
|:---:|

## 参考リンク(まとめ)

- [Markdown風テキストでダイアグラムが描けるWebツール - Qiita](http://qiita.com/wakufactory/items/8a0cf4ffdd52936f7469)
- [wakufactory/MarkDownDiagram](https://github.com/wakufactory/MarkDownDiagram)
- [gitignore/Node.gitignore at master · github/gitignore](https://github.com/github/gitignore/blob/master/Node.gitignore)
- [ElectronでjQueryがundefinedになる](http://qiita.com/pirosikick/items/72d11a8578c5c3327069)
 - [解決策](http://qiita.com/pirosikick/items/72d11a8578c5c3327069#%E8%A7%A3%E6%B1%BA%E7%AD%96)
- [Electron FAQ - Electron](http://electron.atom.io/docs/faq/)
 - [I can not use jQuery/RequireJS/Meteor/AngularJS in Electron.](http://electron.atom.io/docs/faq/#i-can-not-use-jqueryrequirejsmeteorangularjs-in-electron)