Vue 3での同期と非同期コンポーネントの組み合わせによる効率的なロード

Vue 3での同期と非同期コンポーネントの組み合わせによる効率的なロード

Vue 3では同期コンポーネントと非同期コンポーネントを適切に組み合わせることで、初期ロード時間を短縮し、アプリケーションのパフォーマンスを向上させることができます。本記事では、同期および非同期コンポーネントの使い分け、効果的なロード戦略、そして実装方法について詳しく説明します。

同期コンポーネントとは

同期コンポーネントは、アプリケーションのビルド時にすべてのコンポーネントが一括で読み込まれます。

import MyComponent from './components/MyComponent.vue';

非同期コンポーネントとは

非同期コンポーネントは、特定のタイミングで動的に読み込まれます。

import { defineAsyncComponent } from 'vue';

const MyAsyncComponent = defineAsyncComponent(() => import('./components/MyComponent.vue'));

defineAsyncComponentの基本構文

非同期コンポーネントを定義する基本構文です。

const AsyncComponent = defineAsyncComponent(() =>
  import('./components/MyComponent.vue')
);

ローディング状態の表示

非同期コンポーネントの読み込み中にローディングコンポーネントを表示できます。

const AsyncComponent = defineAsyncComponent({
  loader: () => import('./components/MyComponent.vue'),
  loadingComponent: LoadingComponent,
  delay: 200
});

エラーハンドリング

非同期コンポーネントの読み込みエラーをキャッチし、エラーメッセージを表示します。

const AsyncComponent = defineAsyncComponent({
  loader: () => import('./components/MyComponent.vue'),
  errorComponent: ErrorComponent,
  timeout: 3000
});

同期・非同期コンポーネントの適切な使い分け

コア機能は同期、非コア機能は非同期として使い分けます。

import Header from './components/Header.vue'; // 同期コンポーネント
const Sidebar = defineAsyncComponent(() => import('./components/Sidebar.vue')); // 非同期コンポーネント

コードスプリッティングの活用

非同期コンポーネントとコードスプリッティングを組み合わせることで、効率的にコンポーネントを読み込めます。

const Dashboard = defineAsyncComponent(() => import(/* webpackChunkName: "dashboard" */ './components/Dashboard.vue'));

Vue Routerでの非同期コンポーネント

Vue Routerを使用して非同期コンポーネントをルートレベルで管理します。

const routes = [
  { path: '/dashboard', component: () => import('./components/Dashboard.vue') }
];

Suspenseコンポーネントの活用

Suspenseを使用して非同期コンポーネントのロード状態を管理します。

<Suspense>
  <template #default>
    <AsyncComponent />
  </template>
  <template #fallback>
    Loading...
  </template>
</Suspense>

パフォーマンス測定

非同期コンポーネントのロード時間を測定し、最適化します。

onMounted(() => {
  console.time('AsyncComponent');
  import('./components/AsyncComponent.vue').then(() => {
    console.timeEnd('AsyncComponent');
  });
});

実際の運用例

アプリケーションの実際の運用例として、重要な部分は同期、ユーザーインタラクションが必要な部分は非同期でロードします。

import Header from './components/Header.vue';
const AsyncProfile = defineAsyncComponent(() => import('./components/Profile.vue'));

まとめ

Vue 3では、同期コンポーネントと非同期コンポーネントを適切に組み合わせることで、初期ロード時間を短縮し、効率的なパフォーマンス向上が可能です。Suspenseやエラーハンドリングも活用し、より堅牢なアプリケーションを構築しましょう。