年末年始連休明けでも続ける自習の記録7: Node.js+Electron開発環境準備

#はじめに
**[連休を機に考える、怠惰な私の自習戦略][Plan]**にて立てた計画に沿った自習の記録です。
前回：**[年末年始Webアプリ開発自習の記録6: Node.js+Electron+Vue.js開発環境準備][Prev]**

#やり直し宣言
前回、Node.js+Electron+Vue.jsの開発環境構築のためにelectron-vueを使ってセットアップしましたが、色んなものが大量に入ってきたことで自身の理解が追いつかなくなりました。**「あれはElectronもVueも使える人のためのツールだった」**と酸っぱいブドウよろしく防衛機制を働かせ、まずはElectron+Node.jsだけでやっていくことにしました。

#準備開始
**[Electron Documentation - Guide](https://electronjs.org/docs/tutorial)**を参考にしました。
「あれ？このドキュメントあったらこの記事いらなくね？」ってくらいしっかり書いてあります

##QuickStartのファイルを落としておく
動かすために**[こちら](https://electronjs.org/docs/tutorial/first-app#trying-this-example)のサンプルをどこかに落としておきます。

```
> git clone https://github.com/electron/electron-quick-start
```

##プロジェクトの作成
この辺りはいい加減慣れてきました。

```
> mkdir simple-downloader2
> cd .\simple-dwonloader2\
> npm init -y
Wrote to C:\Users\dmorita\source\repos\Study-Node\simple-dwonloader2\package.json:

{
  "name": "simple-dwonloader2",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
```

生成された```package.json```は少し変更しておきます。

```json:package.json
{
  "name": "simple-downloader2",
  "version": "0.1.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
```

##Electonインストール

```
> npm i --save-dev electron
```

##テスト用コード配置
先ほどCloneしてきた```electron-quick-start```から```main.js```、```render.js```、```index.html```を```simple-downloader2```ディレクトリ直下にコピーします。


##VSCode設定

Debugペインから構成の追加でNode.jsを選択し、launch.jsonのひな形を作ります。
**[Debugging the Main Process in VSCode](https://electronjs.org/docs/tutorial/debugging-main-process-vscode)**を参考にしました。

```json:launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug Main Process",
      "type": "node",
      "request": "launch",
      "cwd": "${workspaceRoot}",
      "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron",
      "windows": {
        "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron.cmd"
      },
      "args" : ["."],
      "sourceMaps": true
    }
  ]
}
```

他の手段もないか探したところ、**[Debugger for Electron](https://marketplace.visualstudio.com/items?itemName=kodetech.electron-debug)**という拡張機能がありました。
インストールしてみると、構成の追加でElectronというものが増えていますね。
![](https://qiita-image-store.s3.amazonaws.com/0/57293/8b442a30-7929-f9bd-1b12-fec6a5fcf88a.png)
下記のようなlaunch.jsonが生成できるようになりました。

```json:launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Electron Main",
      "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
      "program": "${workspaceFolder}/main.js",
      "sourceMaps": true
    },
    {
    "type": "electron",
    "request": "launch",
    "name": "Launch Electron here",
    "sourceMaps": true
  }]
}
```
マーケットプレイスのページには下記のようにありました。前回レンダープロセスのDebug設定に使った```vscode-chrome-debug```から派生したもののようです。
> A VS Code extension to debug your JavaScript code in Electron. This is a fork of vscode-chrome-debug which automatically downloads and runs Electron. This extension does nothing which fundamentally can not be done via vscode-chrome-debug and a proper launch configuration and exists purely for convenience.

今回はチュートリアル+```"sourceMaps": true```の設定でいきますが、いつかこれが便利だと思える日が来るでしょう。多分。

##Electronコマンドの謎
ちょっとでも楽をしようと上記の部分をごちゃごちゃやってて思ったのですが、```simple-downloader2```直下で```node_modules/.bin/electron .```を実行するとHello worldが表示されます。
![](https://qiita-image-store.s3.amazonaws.com/0/57293/7e4c3aa9-c7c7-eac9-7cfd-b8e0578c5cf7.png)
そして引数なしの```node_modules/.bin/electron```を実行すると、なんかイカしたランディングページみたいなやつが出ます。
![](https://qiita-image-store.s3.amazonaws.com/0/57293/06c15225-649f-53d9-3236-42346b647b10.png)
ここまではわかるのですが、試しにmain.jsを引数にして```node_modules/.bin/electron main.js```を実行すると、崩れたランディングページみたいなやつが出ます。
![](https://qiita-image-store.s3.amazonaws.com/0/57293/da931ecf-ca9d-b3c8-aecb-e0f6b6ea7f3b.png)
どうも```electron.cmd```を見ると、```node %~dp0..\electron\cli.js```を実行しています。これが何を意味しているのか深く追求しませんが、```package.json```の```main```に依存し、エントリポイントとすることは間違いないでしょう。

###Debugしてみる
適当にブレイクポイントを張ってF5。ちゃんと止まっているので良しとします。
![](https://qiita-image-store.s3.amazonaws.com/0/57293/a1c86ee3-f353-dd5f-0c34-fa444222ed40.png)

##Render ProcessのDebug
ここまでやったことで、前回分かれていたRender ProcessのDebugという意味がわかってきました。
参考: **[Debug Electron App with VS Code](https://blog.matsu.io/debug-electron-vscode)**
このプロジェクトに存在する```renderer.js```は```index.html```から呼ばれているため、下記のようなコードを```renderer.js```に追加してブレイクポイントを張っても止めることができません。

```javascript:renderer.js
console.log('hello world!')

document.body.addEventListener('click', () => {
  console.log('hello vscode!')
})
```
そこで、参考ページをみながらRender用の設定をlaunch.jsonに追加しました。

```json:launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug Main Process",
      "type": "node",
      "request": "launch",
      "cwd": "${workspaceFolder}",
      "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
      "windows": {
        "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd"
      },
      "args": ["."],
      "sourceMaps": true
    },
    {
      "name": "Debug Renderer Process",
      "type": "chrome",
      "request": "launch",
      "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
      "windows": {
        "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd"
      },
      "runtimeArgs": [
        "${workspaceFolder}/.",
        "--remote-debugging-port=9222"
      ],
      "sourceMaps": true,
      "webRoot": "${workspaceFolder}"
    }
  ]
}
```

###Debugしてみる
同様に```renderer.js```にブレイクポイントを張って追加したRender Process用のデバッガを実行します。
![](https://qiita-image-store.s3.amazonaws.com/0/57293/06cb5a86-967b-3129-d206-7c6735ab297c.png)
**止まった！**

#おわりに
これで心置きなく基本的なelectron開発を始められそうです。
まずは **[Electron Development in a Nutshell](https://electronjs.org/docs/tutorial/first-app#electron-development-in-a-nutshell)** から読み始めようと思います。

次回：**[年末年始連休明けでも続ける自習の記録8][Next]**

[Plan]:https://qiita.com/dmorita/items/7a85ee9c2de506c27502
[Prev]:https://qiita.com/dmorita/items/3e94371e5aaf1991bc86
[Next]:https://qiita.com/dmorita/items/7ceed4564194498c3780