モジュール:import と export
名前付きエクスポートとデフォルトエクスポートを使ってコードを ES モジュールに分割し、必要なものだけをインポートし、モジュールバンドラーが依存関係グラフを解決する仕組みを理解します。
「モジュール:import と export」はCoddyKit上の無料Frontend Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはFrontend Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Frontend Academyコースには全4レッスンが含まれています。
なぜモジュールを使うのか
モジュールが登場する前は、すべてのJavaScriptがグローバルスコープで実行されていました。変数が衝突し、コードの順序が重要で、ファイルも順番に読み込む必要がありました。ES Modulesでは、各ファイルが独自のスコープ、明示的なインポート、tree-shaking可能なエクスポートを持ちます。
名前付きエクスポート
exportキーワードを使って、特定の値をエクスポートします。1つのファイルに複数の名前付きエクスポートを定義できます。利用側では必要なものだけをインポートします。
// utils.js
export const PI = 3.14159;
export function add(a, b) {
return a + b;
}
export class Vector {
constructor(x, y) { this.x = x; this.y = y; }
}名前付きインポート
波括弧を使って名前付きエクスポートをインポートします。1つの文で、1つのモジュールから複数のエクスポートをインポートできます。
import { PI, add, Vector } from './utils.js';
console.log(PI); // 3.14159
console.log(add(2, 3)); // 5デフォルトエクスポート
各モジュールには、通常そのモジュールが提供する主な機能となるデフォルトエクスポートを1つ定義できます。波括弧なしでインポートし、任意の名前を付けられます。
// Button.js
export default function Button({ label }) {
return `<button>${label}</button>`;
}
// Importing:
import Button from './Button.js';
import MyButton from './Button.js'; // any name works再エクスポート
モジュールは他のモジュールから再エクスポートして、barrelファイルを作成できます。barrelファイルは、複数の機能を再エクスポートする単一のエントリーポイントです。
// components/index.js
export { default as Button } from './Button.js';
export { default as Input } from './Input.js';
export { default as Modal } from './Modal.js';
// Consumer:
import { Button, Input, Modal } from './components';名前空間インポート
import * as nameを使うと、モジュールのすべてを名前空間オブジェクトにインポートできます。多くのエクスポートが必要な場合や、どのモジュール由来かを明示したい場合に便利です。
import * as utils from './utils.js';
console.log(utils.PI); // 3.14159
console.log(utils.add(1, 2)); // 3副作用のみのインポート
一部のモジュールは、副作用(ポリフィルやイベントハンドラーの登録)だけを目的にインポートします。バインディングなしでインポートしてください。
import './polyfills.js'; // runs the code, imports nothingDynamic import() — コード分割
動的なimport()関数はPromiseを返します。必要なときだけモジュールを遅延読み込みするために使用してください。バンドラーは、動的にインポートされるモジュール用に別のチャンクを自動的に作成します。
// Load a heavy module only when the button is clicked:
button.addEventListener('click', async () => {
const { processFile } = await import('./fileProcessor.js');
processFile(data);
});import.meta
import.metaは、モジュール内で利用できる特別なオブジェクトです。import.meta.urlはモジュールのURLです。Viteでは、環境変数にimport.meta.envを使用します。
// Vite environment variables:
console.log(import.meta.env.VITE_API_URL);
console.log(import.meta.env.MODE); // 'development' or 'production'モジュール解決
Viteなどのバンドラーは、ファイルシステム('./utils'のような相対パス)、node_modules('lodash')、またはパスエイリアス(vite.config.jsで設定した'@/components')からモジュールを解決します。
CommonJSとES Modulesの比較
Node.jsはもともとCommonJS(require / module.exports)を使用していました。ブラウザーではES Modules(import / export)を使用します。現在のNode.jsは、package.jsonのtype: "module"によってES Modulesもサポートしています。
// CommonJS (Node.js, older tooling):
const fs = require('fs');
module.exports = { myFunc };
// ES Modules (modern):
import fs from 'fs';
export { myFunc };確認問題
静的インポートではなくdynamic import()を使用する主な利点は何でしょうか。
まとめ:ES Modules
名前付きエクスポートとインポートは複数の値に使用します。デフォルトエクスポートとインポートは主な機能に使用します。再エクスポートでbarrelファイルを作成できます。Dynamic import()によって遅延読み込みとコード分割が可能になります。import.metaはモジュールのメタデータを提供します。バンドラーはエイリアス、node_modules、相対パスを解決します。
よくある質問
「モジュール:import と export」レッスンは無料ですか?
はい。「モジュール:import と export」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Frontend Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Frontend Academyコースには全4レッスンが含まれています。
「モジュール:import と export」で何を学びますか?
名前付きエクスポートとデフォルトエクスポートを使ってコードを ES モジュールに分割し、必要なものだけをインポートし、モジュールバンドラーが依存関係グラフを解決する仕組みを理解します。 ブラウザで直接実行するハンズオンコードでFrontend Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Frontend Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのFrontend Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「モジュール:import と export」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このFrontend Academyレッスンでコードを書いて実行できますか?
はい。すべてのFrontend Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 配列メソッド:map・filter・reduce・find
- オブジェクトの分割代入とスプレッド
- テンプレートリテラルとオプショナルチェーン
- モジュール:import と export