defineAsyncComponent() 非同期コンポーネントの定義

最終更新:2026-10-22

defineAsyncComponent() 非同期コンポーネントの定義

defineAsyncComponent() は必要になった時点で初めて読み込まれるコンポーネントを作成します。ルートレベルや重いコンポーネントの遅延読み込みに使います。

グループグローバル API
種類API
スコープグローバル
Vue バージョン3.0+
SSR 対応対応

📝 構文

const Editor = defineAsyncComponent(() => import("./Editor.vue"))

// ロード中・エラー時のフォールバック付き
const Panel = defineAsyncComponent({
  loader: () => import("./Panel.vue"),
  loadingComponent: Spinner,
  errorComponent: ErrorBox,
  delay: 200
})

⚙️ 引数

loader | optionsPromise を返すローダー関数、または設定オブジェクト(loader/loadingComponent/errorComponent/delay/timeout)

戻り値:非同期コンポーネント(初回レンダリング時に読み込み開始)

▶ 例

以下のコードを編集して結果を確認しましょう:

出力:

'Lazy component ready' appears after about 0.8s.

💡 ポイント

💡 ヒント ルートレベルの遅延読み込みが最も効果が大きいです。初回画面では現在のページのコードだけをダウンロードします。
ℹ️ 補足 設定オブジェクトの delay でローディングのちらつきを避け、timeout でタイムアウトエラーを制御できます。
⚠️ 注意 非同期コンポーネントは、既定では再構築のたびに再読み込みされます(キャッシュされていれば再利用)。状態を保つには KeepAlive を併用してください。
関連ケースは近日公開予定。

📚 関連チュートリアル

❓ よくある質問

Q 動的 import() との関係は?
A import() をラップします。Promise をレンダリング可能なコンポーネントに変え、ロード中・エラー時のフォールバックも提供します。
Q いつ読み込みが始まりますか?
A そのコンポーネントを初めてレンダリングする必要が生じたときです。以降はキャッシュされたモジュールを再利用します。
Q Suspense と組み合わせられますか?
A できます。Suspense が待機状態を引き受ければ、loadingComponent は不要になります。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%