中学理科1626729 views
いろは2988729 views
高校倫理1433840 views
世界の国560930 views
ヒストリア284663 views
数学講師2856326 views
高校国語785873 views
高校物理158371 views
英語608453 views
中学数学621573 views
Help
Tools

English

条件付きインポートのパターン

通常の import 文は静的で、条件分岐の中では使用できません。しかし、動的インポート import() を活用することで、条件に応じたモジュールの読み込みが可能になります。

静的インポートの制約

import 文はモジュールのトップレベルでしか使用できず、条件分岐内では構文エラーになります。

// これはエラーになる
if (condition) {
  import { func } from './module.js'; // SyntaxError
}

動的インポートによる条件付き読み込み

import() 関数を使えば、実行時に条件に応じてモジュールを読み込めます。

async function loadFeature(isAdvanced) {
  if (isAdvanced) {
    const module = await import('./advanced.js');
    return module.AdvancedFeature;
  } else {
    const module = await import('./basic.js');
    return module.BasicFeature;
  }
}

環境に応じたインポート

開発環境と本番環境で異なるモジュールを読み込むパターンです。

async function getLogger() {
  if (process.env.NODE_ENV === 'development') {
    const { DevLogger } = await import('./DevLogger.js');
    return new DevLogger();
  } else {
    const { ProdLogger } = await import('./ProdLogger.js');
    return new ProdLogger();
  }
}

プラットフォーム検出

ブラウザと Node.js で異なるモジュールを使用する例です。

async function getStorage() {
  if (typeof window !== 'undefined') {
    // ブラウザ環境
    const { BrowserStorage } = await import('./BrowserStorage.js');
    return new BrowserStorage();
  } else {
    // Node.js 環境
    const { FileStorage } = await import('./FileStorage.js');
    return new FileStorage();
  }
}

機能検出によるポリフィル読み込み

必要な場合のみポリフィルを読み込むことで、バンドルサイズを最適化できます。

async function ensureIntlSupport() {
  if (typeof Intl.Segmenter === 'undefined') {
    await import('intl-segmenter-polyfill');
    console.log('Intl.Segmenter polyfill loaded');
  }
}

ユーザー設定に基づくインポート

ユーザーの選択に応じて、必要なモジュールだけを読み込むパターンです。

async function loadTheme(themeName) {
  const themes = {
    light: () => import('./themes/light.js'),
    dark: () => import('./themes/dark.js'),
    system: () => import('./themes/system.js')
  };
  
  const loader = themes[themeName] || themes.light;
  const theme = await loader();
  return theme.default;
}

遅延初期化パターン

初回使用時にのみモジュールを読み込む遅延初期化のパターンです。

let heavyModule = null;

async function getHeavyModule() {
  if (!heavyModule) {
    heavyModule = await import('./heavyModule.js');
  }
  return heavyModule;
}

// 必要になった時だけ呼び出す
document.getElementById('btn').addEventListener('click', async () => {
  const module = await getHeavyModule();
  module.doHeavyWork();
});

複数候補からのフォールバック

優先順位を付けて、利用可能なモジュールを読み込む例です。

async function loadImageProcessor() {
  try {
    // まず WebAssembly 版を試す
    return await import('./imageProcessor.wasm.js');
  } catch {
    try {
      // 次に最適化された JS 版を試す
      return await import('./imageProcessor.optimized.js');
    } catch {
      // 最後にフォールバック版を使用
      return await import('./imageProcessor.fallback.js');
    }
  }
}
メリット

初期読み込みを高速化し、必要なコードだけをオンデマンドで読み込める。

注意点

動的インポートは非同期なので、await が必要。エラーハンドリングも忘れずに。

条件付きインポートを活用することで、アプリケーションのパフォーマンスと柔軟性を両立できます。