Capacitor V3 を 試してみる

[Capacitor](https://capacitorjs.com) のV3が出ていたので、[Installing Capacitor](https://capacitorjs.com/docs/getting-started) を試してみる。

以前試したものはこちら。
[Capacitor を 試してみる(router & ionicなし)](https://qiita.com/ganessa/items/a9ddd29b3b70b053b023)
[Capacitor を 試してみる(router & ionicあり)
](https://qiita.com/ganessa/items/d8452fd92335ea5c544a)

## ベースプロジェクトを作る

Vueプロジェクトをベースにしてみます。

### Vue CLI を入れる
```bash
yarn cache clean; yarn global add @vue/cli
```

### Vue プロジェクト生成＆プロジェクトへ移動
```bash
# Vue プロジェクト作成
vue create test

# 今回は以下のように選んでみる
# ? Please pick a preset: Manually select features
# ? Check the features needed for your project: Choose Vue version, Babel, TS, PWA, Router, Vuex, CSS Pre-processors, Linter
# ? Choose a version of Vue.js that you want to start the project with 3.x
# ? Use class-style component syntax? No
# ? Use Babel alongside TypeScript (required for modern mode, auto-detected polyfills, transpiling JSX)? Yes
# ? Use history mode for router? (Requires proper server setup for index fallback in production) Yes
# ? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default): Sass/SCSS (with dart-sass)
# ? Pick a linter / formatter config: Basic
# ? Pick additional lint features: Lint on save
# ? Where do you prefer placing config for Babel, ESLint, etc.? In dedicated config files
# ? Save this as a preset for future projects? No

cd test
```

## Capacitor

### インストール

```bash
yarn add @capacitor/core
yarn add --dev @capacitor/cli
```

### 初期化
```bash
npx cap init test com.xxxxx.test
```

### add 前に build して webDir(dist) を生成
```bash
yarn run build
```
※ Nuxtの場合
```bash
yarn generate
```

### Android / iOS 追加
```bash
yarn add @capacitor/android; npx cap add android
yarn add @capacitor/ios; npx cap add ios
```

### Toast 追加(Toastを使う場合)
```bash
yarn add @capacitor/toast; npx cap sync
```

### 変更を加える
```diff:src/components/HelloWorld.vue
<template>
  <div class="hello">
+   <button @click="toast">Toast</button>
    <h1>{{ msg }}</h1>
    <p>
      For a guide and recipes on how to configure / customize this project,<br>
      check out the
      <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
    </p>
    <h3>Installed CLI Plugins</h3>
    <ul>
      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa" target="_blank" rel="noopener">pwa</a></li>
      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-router" target="_blank" rel="noopener">router</a></li>
      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-vuex" target="_blank" rel="noopener">vuex</a></li>
      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-typescript" target="_blank" rel="noopener">typescript</a></li>
    </ul>
    <h3>Essential Links</h3>
    <ul>
      <li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
      <li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
      <li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
      <li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
      <li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
    </ul>
    <h3>Ecosystem</h3>
    <ul>
      <li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
      <li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
      <li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
      <li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
      <li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
    </ul>
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';
+ import { Toast } from "@capacitor/toast";

export default defineComponent({
  name: 'HelloWorld',
  props: {
    msg: String,
+ },
+ methods: {
+   async toast() {
+     await Toast.show({
+       text: "Toast"
+     });
+   }
  },
});
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="scss">
h3 {
  margin: 40px 0 0;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>
```

### 変更反映
```bash
yarn run build; npx cap copy
```
※ Nuxtの場合
```bash
yarn generate; npx cap copy
```

### Android / iOS 開発環境を開く
```bash
npx cap open android
npx cap open ios
```

### iOS上で確認してみる
toastボタンを押下すると、Toastが表示される。

<img width="400" alt="ShowToast.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42581/8fc1dd47-1402-67f9-4340-9acb50b7ce88.png">

Vue.js / Capacitor がそれぞれ正しく動作することを確認できた。