Nuxt + Vue + Cordovaでアプリ開発をしよう！

こんにちは、フロントエンドの初心者のYちゃんです。スマートフォン向けのアプリケーションを作るために、自分の使えるフレームワークであるVueやNuxtを使ってやろうと思っていろいろ調べていると、Cordovaというフレームワークでアプリケーションを作れるというのを知って、いろいろ試したんですが、いろいろ詰まったので備忘録的に書き記しておこうと思います。

# 開発環境
私はWindowsでもろもろをやる変態エンジニアなのでいろいろ詰まってた感はあります。

- Windows 10 Pro Insider Preview 2004 Build 20190.1000(変態なのでInsider Previewerですがあまり気にしないでくださいw 普通のWindowsで十分だと思いますw)
- Android Studio Ver 4.0.1
  - とりあえずインストールするだけでOK
- Node.js v12.18.2
  - yarn 1.22.4
- Git for Windows 2.27.0
  - Windows上で軽くUnixコマンドを扱うために入れています。`package.json`内なんかでUnixコマンドを使うことがあるためです。なお、これはインストール時の設定によって変わるので、使えるようにしている場合とそれ以外の場合とで二通り紹介します。

# そもそもなぜNuxt + Vue + Cordova?
Vue + Cordovaでええやん、と思う人は結構いると思うんですが、私自身フロントエンド初心者で[東京都 新型コロナウイルス感染症対策サイト](https://stopcovid19.metro.tokyo.lg.jp)からフロントエンドを触り始めたので、扱えるフレームワークがNuxtとVue(とVuetify)なのです。調べれば解決するでしょうがVue単体を切り離して使う方法がわからないですし、自分の中でVueを使うならNuxtとセットという固定概念が出来てしまっているということでNuxt + Vue + Cordovaという選択肢に行き着いたのです。

# 開発開始
## Gradleのインストール(設置)
Gradleというオープンソースのビルド自動化ツールを導入しておく必要があります。Android Studioが入っている時点で導入されているというお話があったんですが、結局わからなかったのでマニュアルインストールします。
Gradleは6.6が最新版なんですが、2020/08/22現在、最新版をインストールしても後のビルドの段階では6.5を使っているようなので、別に6.5でいいと思います。なので、今回は6.5をインストールしていきます。
[ここ](https://gradle.org/next-steps/?version=6.5&format=bin)にアクセスすると直接6.5のバイナリが落とせます。落とせたら、zipなので普通に開いてあげます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/9ebef2ff-ecfd-d8eb-e717-30f316ae14f9.png)
この、`gradle-6.5`をそのままCドライブ直下にコピーしちゃいましょう。(Gradleの公式ドキュメントにはそう書いてあったので別にいいはず)
パスを通さなければなりませんが、次の章でまとめてやります。

## 環境変数の設定
Windowsなので、環境変数がいろいろめんどくさいです(Linuxなんかと違って`export`なんかが使えないので)。とりあえず[スタートボタン]->[設定]->[システム]->[詳細情報]から関連設定の[システムの詳細設定]を開き、一番下の[環境変数]まで行きましょう。そこまでいけば環境変数を設定できます。わからなければ、ここら辺の記事はいろんなところにたくさんあるので、ここでは解説しません...
編集するのはユーザー環境変数です。

まずは先ほどCドライブ直下に配置したgradleのパスを通します。
ユーザー環境変数のPathの中に入り、未使用の部分をダブルクリックするか右上の新規ボタンよりPathを追加していきます。
`C:\gradle-6.5\bin`を追加してあげればよいです。

つぎにJDKのパスを通します。Android Studioをインストールした時点でJDKも同時にインストールしてくれるので、特に何もなければそれを使いましょう。学生はOracleからJDKを落とすのが難しいのでありがたい限りです。
それではAndroid Studioの設定からJDKのパスを取得しましょう。何もプロジェクトを作っていなければ右下の[Configure]->[Default Project Structure...]から、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/b48d3086-e473-761a-a79e-b3522711033a.png)
すでにプロジェクトを作っていて、上のような初期画面が開かない場合は[File]->[Other Settings]->[Default Project Structure...]から、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/31df8370-944f-4dd5-0519-db30a6cc9a18.png)
以下の画面にアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/6191f251-350c-d7af-543c-b4fe354a71e2.png)
この中のJDK locationをコピーします。
Gradleの時と同じようPathを追加していきます。
ここで注意ですが、先ほどコピーしたものを貼り付けるだけでなく、"**\bin**"を付け加えてください。でなければちゃんとパスが通りません。
以下の図、した二つの欄のようにできていれば、OKを押し、大本の環境変数画面もOKを押しましょう。コマンドプロンプトなどから"gradle -v"コマンドと"java -version"コマンドを叩き、それぞれが動けば大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/898d6968-c85f-d877-7846-ff725dd91d3a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/7e4608be-93c9-79fc-09a2-c88a2e9c1dd6.png)


GradleとJDKのパスを通すだけではありません。一つ設定しなければならない環境変数があります。`ANDROID_HOME`です。先ほどのAndroid StudioのDefault Project Stractureに戻りましょう。まずはここのAndroid SDK locationをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/6191f251-350c-d7af-543c-b4fe354a71e2.png)
そして今度はユーザーの環境変数枠の中の[新規]ボタンより、環境変数を設定していきましょう。以下のようにすれば大丈夫です。(今回はそのまま貼り付ければ大丈夫です)OKを押して設定しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/b80802da-4f58-b8e6-9b77-de6a1462bd5a.png)
これにて環境変数の設定は終了です。この環境変数が設定できているかを確認するのはCordovaが動くかどうかなので今のところは確認できません...一応環境変数に関するウィンドウとコマンドプロンプトなどはすべて閉じておきましょう。(反映されないことがあるので)

## Nuxtプロジェクトの作成
では、Nuxtプロジェクトを作っていきます。あれ、Cordovaのプロジェクトじゃないの？と思うかもしれませんが、それは後で作ります。

```shell
yarn create nuxt-app <project name>
```
まぁここはNuxtの公式ドキュメントにも書いてありますし、特に困ることはなさそうですね。
そのあとの設定は自由でいいですが、一つだけ注意点があって、`Rendering mode`はSPAにしましょう。Universalにして、SSGでも動くんですが、SPAのほうが事故らないはずです(axiosとか使ってる場合は特に...?私は初心者なのでまだ事故ったことがまだない...)。まぁ、あとから`nuxt.config.js`内の`mode`を書き換えれるので結局どっちを選んでもあんまり変わりませんが...w
今回はプロジェクトネームを`cordova-test`としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/06d04d57-dc23-3cb7-9d53-d736bc5d5722.png)
無事に生成できれば、`cd`してプロジェクトディレクトリに入りましょう。

## `nuxt.config.js`を手直しする
題の通りです。`nuxt.config.js`に以下のものを足したり、書き換えたりします。

1. `head`の中に`script: [{ src: "cordova.js" }]`を足す
  `link`の下にでも足しておきましょう。これによってcordovaで動作します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/4d80ab32-8e81-6983-8b1b-e9687000ccd4.png)

2. `build`の中に`publicPath: "/nuxt/"`を足す
  cordovaが`_nuxt`というディレクトリを認識できない(正確には`_`を認識できない)ので、それに対応するために書き換えます。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/8bfd9ada-8850-6c0c-860c-8b5369cd3846.png)

3. `router`を新設し、`mode: "hash"`を足す
  `router`という項目がデフォルトではないので付け加えてあげます。この設定はよくわからないんですが、`/index.html`が開かれないようにするためのよう...?いずれにせよcordovaにとって悪影響を及ぼすから変えなければならないようです。`build`の下にでも入れておいてあげましょう。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/1cce9399-a12e-0582-b922-2c0f3b87def9.png)

4. `mode`を`spa`にする
  プロジェクト作成の時点でSPAを選択している人は不要です。また、俺は/私はSSGで行くんや！って人は別にuniversalでもいいと思います。(確認した限りだと動くには動くようなので...どんな問題があるかは私にはわからないのでお勧めはしないです...)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/cf862ed7-bc91-782d-410e-a35aec015274.png)

これで一通り手直しは終わりました。

## `package.json`の`script`を手直しする
`generate`コマンドの修正と`cordova-run-android`のようなコマンドを作ります。
まずは`generate`の修正から。

```
"generate": "nuxt generate && rm app/www/* -r && cp dist/* app/www/ -r && replace '/nuxt/' 'nuxt/' app/www -r"
```
`app`ディレクトリはCordovaのものです。後で作ります。なお、`app`以外のディレクトリで作成した場合はすべて別の名前に書き換えてください。

コマンドを解説していきます。`nuxt generate`はごく普通の、NuxtでHTMLやJSなんかを生成するコマンドです。
次の`rm app/www/* -r&& cp dist/* app/www/ -r`では、cordovaプロジェクトのディレクトリにある`www`というHTMLやCSS、JS、画像ファイルといったものを入れておくディレクトリの中身をいったん全削除し、先ほどの`nuxt generate`で`dist`ディレクトリ内に生成されたものと入れ替えています。
最後に`replace '/nuxt/' 'nuxt/' app/www -r`では、Cordovaはルートディレクトリの都合上、`/nuxt/`が使えないので、`nuxt/`に置き換えています。

なお、これはGit for WindowsでUnixコマンドを使えるようになっている人向けのコマンドです。Linuxなどでも使用可能な形になっています。では、次にWindows標準コマンドを使ったバージョンを貼っておきます。

```
"generate-by-windows": "nuxt generate && del /s /q app\\www\\* && xcopy /e dist\\ app\\www && replace '/nuxt/' 'nuxt/' app/www -r"
```
`generate-by-windows`としましたが、これを使う場合は普通の`generate`コマンドとは分けたほうがいいです。(windowsでしか使えないコマンドをいれているわけなので)
なお、どちらにも出てくる`replace`コマンドについてですが、これは

```
yarn add replace
```
でプロジェクト自体にくっつけるか、

```
yarn global add replace
```
でグローバルに埋め込むかすれば使えます。個人的にはプロジェクト自体にくっつけたほうが、ほかの環境に移った時なんかは楽だと思います。

次に`cordova-run-android`コマンドです。
WindowsなのでAndroidのコマンドのみ追加しますが、Mac使ってiOS版もビルドするのであれば、`android`の部分を`ios`に変えてあげればいいです。

```
"cordova-run-android": "cd app && cordova build android && cordova run android"
```
これを実行するだけでビルドから実機(orエミュレータ)での実行まで自動でできるようになります。
修正はここまでです、いよいよビルドに向かいます...!

## Cordovaプロジェクトの作成
さて、ようやくCordovaプロジェクト作成の区域に入りました。
まずは、Cordovaをインストールしましょう。

```
yarn global add cordova
```
これでcordovaコマンドを実行できるようになりました。
次に、Nuxtプロジェクトのルートで以下を実行しましょう。

```
cordova create app <識別子> <application name>
```
識別子ってなに？って思うかもしれませんが、Androidアプリを日常的に作っている人とかならわかるかもしれません。`逆引きドメイン スタイル識別子`というやつです。もっと？？？となるかもしれませんが、`com.example.helloworld`みたいな、ドメインを逆にした感じのやつです。実在するものでなくてもいいようです。ストアにアプリ申請するときなんかに使われます(数百万とあるアプリを識別し、同一の識別子を持つことがないようにする...データ保管のディレクトリ名に使われたりするので...)
何も決まっていなければ適当でいい気がします。(あんまり適当なこと言えないけど...w)

ディレクトリは確実に指定しないといけないようですが、識別子やアプリ名は何も指定しないと、それぞれ`io.cordova.hellocordova`、`HelloCordova`になるようです。
今回は、ディレクトリは`app`で固定、識別子は`com.example.cordova_test`、アプリ名は`cordova-test`にしてみます。(確か識別子に`-`は使えない...)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/201b78da-1cf3-d61b-7fa1-400d7be5aba8.png)
あっさりと終ります。それでは、`app`ディレクトリに`cd`して、platformを追加しましょう。今回はAndroidのみやります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/14ec5bcf-ff17-47a1-a5ae-14fa5b1b68eb.png)
これでビルド準備が整いました...!

## いざ、ビルド...!
Nuxtプロジェクトのルートに戻ります。そこで、さっき設定を変更した`yarn generate`(or `yarn generate-by-windows`)と`yarn cordova-run-android`を実行していきます。

実機で実行したい場合は、`yarn cordova-run-android`を実行する前にでもデバッグモードをオンにしたスマホをUSBでつないであげるとよいでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/b7399390-e952-ecae-9b5b-b1f00142aae2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/2cb44069-659b-2e64-27af-f71a323ea744.png)

上の画像がちょうどそうですが、`run`してもエミュレータも実機もなかった場合は失敗して終わります(apkはあるのであとは実機に流し込むだけです)

# まとめ
いかがでしょうか。ネット上で2つほど記事を見かけ、参考にして試してみようと思っていたところ、案外詰まった(javaとかgradleとかもろもろ)ので、自分が見て後で環境を再構築できるように書き残しました。ほかの方の参考にもなれば。
ところでNuxt + Vue + Cordovaの組み合わせ、かなり便利なのでちょっと推していきたいです。(開発環境ではNuxtで自動リロード/ビルド等があり、そしてCordovaでアプリ化できるというのがかなり良い)

# おまけ
実際にアプリをインストールしてみました。Vuetify Logoは何があったんだろう...w
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535794/75b6a00b-eee2-e13b-65b7-31c8e3252dce.png" />

# 問題点(追記)
今のままの状態だとCordovaのプラグインを使用することができません。これを解決する必要があります。

# 参考文献
- [Nuxt.jsで作成したWebサイトを簡単にCordovaアプリ化する方法【ホームページを簡単アプリ化】](https://mameko.jp/218/)
- [nuxt cordova web ハイブリッドアプリ作成した時のメモ](https://hapicode.com/nuxtcordova.html)