コード分割と遅延読み込みルート
dynamic import() でルートの境界ごとにバンドルを分割し、React と Vue のコンポーネントを遅延読み込みし、ビルド出力でチャンクサイズを監視します。
「コード分割と遅延読み込みルート」はCoddyKit上の無料Frontend Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはFrontend Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Frontend Academyコースには全4レッスンが含まれています。
コード分割を行う理由
モノリシックなJavaScriptバンドルでは、使わない機能のコードまで、アプリのすべてのコードをすべての訪問者がダウンロードすることになります。コード分割によってバンドルを分割し、必要なときにチャンクを読み込みます。
Dynamic import()
import('./module')は、モジュールに解決されるPromiseを返します。バンドラー(Vite、webpack)はこれを検出し、実行時に読み込む別のチャンクを出力します。
// Without split — entire heavy lib in main bundle:
import { generateChart } from 'heavy-chart-lib';
// With split — loaded only when needed:
button.addEventListener('click', async () => {
const { generateChart } = await import('heavy-chart-lib');
generateChart(data);
});React.lazy():コンポーネント単位の分割
React.lazy(() => import('./Heavy'))は、初めて描画されるときにだけコードを読み込むコンポーネントを作成します。読み込み中にフォールバックを表示するには、<Suspense>でラップします。
import { lazy, Suspense } from 'react';
const Dashboard = lazy(() => import('./Dashboard'));
function App() {
return (
<Suspense fallback={<Spinner />}>
<Dashboard />
</Suspense>
);
}React Routerでのルート単位の分割
各ルートに専用のチャンクが割り当てられるため、ユーザーは訪問するページのコードだけをダウンロードします。
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import { lazy, Suspense } from 'react';
const Home = lazy(() => import('./pages/Home'));
const Profile = lazy(() => import('./pages/Profile'));
const Admin = lazy(() => import('./pages/Admin'));
const router = createBrowserRouter([
{ path: '/', element: <Suspense fallback={<Spinner/>}><Home /></Suspense> },
{ path: '/profile', element: <Suspense fallback={<Spinner/>}><Profile /></Suspense> },
{ path: '/admin', element: <Suspense fallback={<Spinner/>}><Admin /></Suspense> }
]);Vue 3の非同期コンポーネント
Vueでは、同じパターンにdefineAsyncComponentを使用できます。
import { defineAsyncComponent } from 'vue';
const Dashboard = defineAsyncComponent(() =>
import('./Dashboard.vue')
);
// Use in template like a normal componentVue Routerの遅延ルート
Vue Routerはルート定義での動的インポートをサポートしており、ルートごとにチャンクが出力されます。
const routes = [
{ path: '/', component: () => import('./pages/Home.vue') },
{ path: '/profile', component: () => import('./pages/Profile.vue') },
{ path: '/admin', component: () => import('./pages/Admin.vue') }
];webpackのマジックコメント
import文の中にwebpackの「マジックコメント」を記述すると、チャンク名やprefetchの動作を指定できます。
const Profile = lazy(() =>
import(/* webpackChunkName: "profile", webpackPrefetch: true */ './Profile')
);
// Vite supports a subset; @vite-ignore for special casesPrefetchとPreload
prefetch:次に移動する可能性が高いページのチャンクを、アイドル時間にダウンロードします。preload:現在のルートで必要な重要チャンクを、高い優先度で今すぐダウンロードします。リンクへのホバー時など、次に必要になる可能性が高い場合はprefetchを、まもなく確実に必要になる場合はpreloadを使用します。
バンドルアナライザー
rollup-plugin-visualizer(Vite)またはwebpack-bundle-analyzerを使って、チャンクサイズを可視化します。サイズが大きすぎるチャンク、重複した依存関係、tree-shakingし忘れたライブラリを探します。
// vite.config.ts
import { visualizer } from 'rollup-plugin-visualizer';
export default {
plugins: [visualizer({ open: true, gzipSize: true })]
};ベンダーチャンクの分割
サードパーティライブラリを、アプリのコードより変更頻度が低い独立したベンダーチャンクに分割します。ブラウザーはデプロイ後もそのチャンクをキャッシュに保持できます。
// vite.config.ts
export default {
build: {
rollupOptions: {
output: {
manualChunks: {
react: ['react', 'react-dom'],
ui: ['@radix-ui/react-dialog', '@radix-ui/react-tooltip']
}
}
}
}
};分割しないほうがよい場合
小さすぎるチャンク(20KB未満)は、メリットよりもデメリットが大きくなります。HTTPのオーバーヘッドがバンドル削減分を上回るためです。すべてのコンポーネントを分割するのではなく、ルートの境界や、本当に大きな機能の周辺で分割します。
クイックチェック
Reactのlazy()ラッパーは、正しく描画するために何と組み合わせる必要がありますか?
まとめ:コード分割
動的なimport()によって別々のチャンクが出力されます。コンポーネントの分割にはReact.lazyとSuspenseを使用します。React Router/Vue Routerではルートコンポーネントを遅延読み込みします。次に必要になる可能性が高いチャンクにはprefetchを、重要なチャンクにはpreloadを使用します。バンドルアナライザーで無駄を見つけます。キャッシュしやすくするためにベンダーライブラリを分割します。20KB未満のマイクロチャンクは避けます。
よくある質問
「コード分割と遅延読み込みルート」レッスンは無料ですか?
はい。「コード分割と遅延読み込みルート」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Frontend Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Frontend Academyコースには全4レッスンが含まれています。
「コード分割と遅延読み込みルート」で何を学びますか?
dynamic import() でルートの境界ごとにバンドルを分割し、React と Vue のコンポーネントを遅延読み込みし、ビルド出力でチャンクサイズを監視します。 ブラウザで直接実行するハンズオンコードでFrontend Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Frontend Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのFrontend Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「コード分割と遅延読み込みルート」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このFrontend Academyレッスンでコードを書いて実行できますか?
はい。すべてのFrontend Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。