LaTeX963205 views
高校倫理1441553 views
高校生物552189 views
中学社会669191 views
世界の国565381 views
中学英語812311 views
小学理科720453 views
MathPython498591 views
高校日本史190688 views
小学算数1201510 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 が必要。エラーハンドリングも忘れずに。

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