0Pricing
Frontend Academy · レッスン

コード分割と遅延読み込みルート

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 component

Vue 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 cases

Prefetchと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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Core Web Vitals:LCP・FID・CLS
  2. Lighthouse の監査とスコアリング
  3. 画像の最適化:遅延読み込みと WebP 形式
  4. コード分割と遅延読み込みルート
← Frontend Academyに戻る