Rails 7でViteとVue.jsを使った際のトラブルシューティング

Rails 7は、WebpackerからViteへと大きく移行しました。この変更は、フロントエンドの開発体験を大幅に向上させますが、同時に新しいチャレンジももたらします。この記事では、ViteとVue.jsをRails 7プロジェクトで使う際に直面する可能性のあるいくつかの一般的な問題とその解決策について紹介します。
なお、以下の完全版も参考にしてください。

https://qiita.com/KM9973/items/1e9329de57bb8fafb9f3


## ViteRubyのMissingEntrypointError

エラーメッセージ:

```bash
ViteRuby::MissingEntrypointError in Tops#index
Showing /path/to/app/views/layouts/application.html.erb where line #13 raised:

Vite Ruby can't find entrypoints/application.js in the manifests.

Possible causes:
  - The last build failed. Try running `bin/vite build --clear --mode=development` manually and check for errors.
```

このエラーは、Viteがマニフェストファイルの中で`entrypoints/application.js`を見つけることができないことを意味します。マニフェストファイルは、ビルド時に生成されるファイルの一覧を含むもので、Viteがアセットを正しくロードするために使用します。

### 解決策
**プラグインのインストール: **
`@vitejs/plugin-vue`プラグインがインストールされていない場合は、プロジェクトにインストールする必要があります。ターミナルで以下のコマンドを実行してください。

```
npm install @vitejs/plugin-vue --save-dev
```

**Viteの設定ファイルを更新:**
`vite.config.js`ファイルを開き、`@vitejs/plugin-vue`をインポートし、`plugins配列`に追加してViteにVueファイルのサポートを指示します。

```vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    RubyPlugin(),
    vue(),
  ],
});
```

**ビルドの実行:**
以下のコマンドを実行してビルドエラーをチェックします。もしビルドに失敗していれば、そのエラーの内容から問題を解決する手がかりを得ることができます。
```
bin/vite build --clear --mode=development
```
次に、`app/javascript/entrypoints/application.js`がプロジェクト内の正しい場所に存在していることを確認してください。ファイルがない場合は、エントリポイントとして期待される場所にファイルを作成または移動させます。

## SyntaxError: Single File Component

エラーメッセージ:

```bash
error during build:
SyntaxError: Single file component can contain only one <script> element
```

このエラーはVueのシングルファイルコンポーネント（`.vue`ファイル）内に複数の`<script>`タグが存在するときに発生します。Vueでは、一つのコンポーネントファイルに一つの`<script>`タグしか許されません。

### 解決策

`.vue`ファイルを開き、複数の`<script>`タグがないか確認してください。もし存在する場合は、それらを一つの`<script>`タグに統合する必要があります。もしComposition APIの`<script setup>`構文を使用している場合は、それを単一の`<script setup>`タグにまとめることができます。



## Vueコンポーネントでのスタイルの読み込み問題

Vueコンポーネント内でアニメーションライブラリ（例えば`vue2-animate`）を使用しようとした際に、ビルドプロセスで以下のようなエラーが発生することがあります。

```Vue.js
x Build failed in 63ms
error during build:
Error: [vite]: Rollup failed to resolve import "vue2-animate/dist/vue2-animate.min.css" from "app/javascript/entrypoints/application.js".
This is most likely unintended because it can break your application at runtime.
```

これは、`vue2-animate`のCSSファイルがプロジェクトの依存関係として正しく認識されておらず、インポート解決が失敗していることを示します。

### 解決策

1. **依存関係の確認**: `vue2-animate`がプロジェクトの`package.json`に記述されていて、`node_modules`ディレクトリにインストールされていることを確認してください。インストールされていない場合は、`npm`や`yarn`を使用してインストールします。

   ```bash
   npm install vue2-animate
   ```

   もしくは、

   ```bash
   yarn add vue2-animate
   ```

2. **CSSインポートの修正**: `application.js`ファイルでのインポートパスが正しいことを確認してください。`node_modules`からの相対パスを使用している場合、パスは次のようになります。

   ```javascript
   // app/javascript/entrypoints/application.js
   import 'vue2-animate/dist/vue2-animate.min.css';
   ```

3. **ビルド設定の更新**: エラーメッセージに示されたように、外部化の必要がある場合は`vite.config.js`を更新して、特定のモジュールを外部依存関係として扱うようにします。

   ```javascript
   // vite.config.js
   export default defineConfig({
     // ...
     build: {
       rollupOptions: {
         external: ['vue2-animate']
       }
     }
   });
   ```

4. **ビルドプロセスの再実行**: 変更を加えた後に、もう一度ビルドプロセスを実行して問題が解決されたか確認します。

   ```bash
   bin/vite build --clear --mode=development
   ```

これらの手順により、スタイルシートの読み込みに関する問題は解決し、Vueコンポーネント内でのアニメーションが正しく機能するようになるはずです。

---


## ディレクトリ構造とファイルの配置

Rails 7プロジェクトでViteを使用する場合、ディレクトリ構造とファイルの配置がエラーに影響を与えることがあります。Viteはエントリポイントのファイルを特定の場所で期待しており、これが見つからないとビルドが失敗します。

### 問題の特定

プロジェクトには以下のディレクトリ構造があるとします。

```
app/
├── javascript/
│   ├── components/
│   │   └── ExampleComponent.vue
│   ├── controllers/
│   │   ├── application.js
│   │   └── hello_controller.js
│   └── entrypoints/
│       └── application.js
```

ここで問題となるのは、`app/javascript/entrypoints/application.js`がビルド時に正しいエントリポイントとして認識されているかどうかです。

### メモ

1. **エントリポイントの確認**: `vite.config.js`を確認し、`entrypoints/application.js`が正しく指定されていることを確認します。もしファイル名やパスに誤りがあれば修正します。

2. **重複の解消**: エントリポイントが複数の場所で宣言されていると混乱を招くため、重複する宣言は削除します。通常は`application.js`ファイル内でVueアプリケーションを初期化します。

3. **CSSファイルのインポート**: アニメーションCSSファイルが正しくインポートされているか再確認します。このCSSはエントリポイントファイル内でインポートする必要があります。

   ```javascript
   // app/javascript/entrypoints/application.js
   import 'vue2-animate/dist/vue2-animate.min.css';
   // 他のインポートとアプリケーションの初期化...
   ```

4. **ビルドプロセスの再実行**: すべての変更を行った後、もう一度ビルドを実行します。

   ```bash
   bin/vite build --clear --mode=development
   ```

これにより、Viteは正しいエントリポイントを見つけ、Vueコンポーネントのスタイルを含むすべてのファイルを正しくビルドするはずです。

## 参考記事
**前回記事:**

https://qiita.com/KM9973/items/a237ee70edada86c4e12