default export とは何か(まずイメージから)
default export は、
「このモジュール(ファイル)の“看板商品”を 1 つだけ外に出す」ための仕組みです。
- 名前付き export:
export function add() {}など、いくつでも出せるメニュー一覧 - default export:
export default ...で 1 つだけ指定する“主役”
というイメージを持つと分かりやすいです。
// greet.js
export default function greet(name) {
console.log(`Hello, ${name}`);
}
JavaScriptこのファイルでは greet が「default export」=看板商品です。
他のファイルからは「好きな名前を付けて」 import できます。
default export の基本構文
その場で export default を付けて宣言する
一番よく見る書き方です。
// User.js
export default class User {
constructor(name) {
this.name = name;
}
greet() {
console.log(`こんにちは、${this.name} です`);
}
}
JavaScriptこの場合、「User クラス」がモジュールの主役です。
関数でも同じです。
// sum.js
export default function sum(numbers) {
return numbers.reduce((acc, n) => acc + n, 0);
}
JavaScript変数でも書けます。
// config.js
const config = {
apiBaseUrl: "https://api.example.com",
timeoutMs: 5000
};
export default config;
JavaScriptあとから export default を付ける書き方
先に定義しておいて、最後にまとめて default にすることもできます。
function greet(name) {
console.log(`Hello, ${name}`);
}
export default greet;
JavaScriptクラスも同様です。
class User {
constructor(name) {
this.name = name;
}
}
export default User;
JavaScriptdefault import の書き方(名前付き import との違い)
default export は {} なしで import する
default export されたものを import するときは、{} を付けずに、その場で好きな名前を付けます。
// greet.js
export default function greet(name) {
console.log(`Hello, ${name}`);
}
JavaScript// main.js
import greet from "./greet.js";
// ↑ 好きな名前で OK
greet("Alice");
JavaScript別のファイルで別名にしても構いません。
import hello from "./greet.js";
hello("Bob");
JavaScriptここが重要です。
default export は “名前を固定しない” 代わりに、モジュールにつき 1 つだけ。
import 側が、文脈に合う名前を自由に付けられます。
名前付き export と同時に使う
1 つのモジュールに、default export と名前付き export が共存しているケースもあります。
// user.js
export default class User {
constructor(name) {
this.name = name;
}
}
export function createGuest() {
return new User("Guest");
}
JavaScriptこのモジュールを使う側:
// main.js
import User, { createGuest } from "./user.js";
// ↑ default ↑ 名前付き
const u1 = new User("Alice");
const u2 = createGuest();
JavaScriptdefault export は先頭に書いて、
あとに { ... } で名前付き export を並べます。
名前付き export との import の書き方を比較する
名前付き export:
// math.js
export function add(a, b) { return a + b; }
export function sub(a, b) { return a - b; }
JavaScript// main.js
import { add, sub } from "./math.js"; // {} 必須、名前は一致
JavaScriptdefault export:
// math.js
export default function add(a, b) { return a + b; }
JavaScript// main.js
import add from "./math.js"; // {} 不要、名前は自由
JavaScriptここが重要です。
- 名前付き export →
import { 名前 } from "..." - default export →
import 任意の名前 from "..."
この違いを体で覚えると、 import 関連のエラーがかなり減ります。
どんなときに default export を使うか(設計の視点)
「このモジュールは“これ”がメイン」と決めたいとき
例えば、1つのクラスが主役のモジュールは、default export との相性が良いです。
// Player.js
export default class Player {
constructor(name, hp = 100) {
this.name = name;
this.hp = hp;
}
damage(amount) {
this.hp = Math.max(0, this.hp - amount);
}
show() {
console.log(`${this.name} HP: ${this.hp}`);
}
}
JavaScript使うとき:
import Player from "./Player.js";
const p = new Player("勇者");
p.damage(30);
p.show();
JavaScriptPlayer モジュールといえば「Player クラス」というのが一目瞭然です。
1つの関数がメイン機能のとき
例えば、配列をソートする独自関数だけを提供したいモジュール。
// sortNumbers.js
export default function sortNumbers(arr) {
return [...arr].sort((a, b) => a - b);
}
JavaScript// main.js
import sortNumbers from "./sortNumbers.js";
const nums = [5, 2, 9, 1];
console.log(sortNumbers(nums)); // [1, 2, 5, 9]
JavaScriptdefault export にしておくと、
「sortNumbers.js は sortNumbers 関数をメインで提供する」という意図がはっきりします。
「その他のオプション」的なものは名前付き export にする
主役が default、補助が名前付き、という分け方もよく使います。
// api.js
export default function request(url, options = {}) {
// メインの HTTP リクエスト関数
}
export const DEFAULT_TIMEOUT = 5000;
export function buildUrl(path) {
return "https://api.example.com" + path;
}
JavaScript使う側:
import request, { DEFAULT_TIMEOUT, buildUrl } from "./api.js";
const url = buildUrl("/users");
request(url, { timeout: DEFAULT_TIMEOUT });
JavaScriptここが重要です。
default export を「メインの1つ」、名前付き export を「補助機能たち」、
と設計すると、モジュールの役割がとても読みやすくなります。
default export のよくあるパターンと注意点
1 モジュールに default export は 1 つだけ
次のように複数書くことはできません。
// NG
export default function a() {}
export default function b() {} // エラー
JavaScript必ず 1 つだけにします。
一方、名前付き export は何個でも OK です。
// OK
export function a() {}
export function b() {}
export function c() {}
JavaScript「default だけ」のモジュールにするか、「名前付きも混ぜる」か
小さいプロジェクトでは、
「そのファイルの中にあるもの全部を default でまとめてしまう」
という乱暴な設計をしがちですが、あまりおすすめしません。
// app.js(微妙な例)
export default {
init() {},
destroy() {},
config: {},
};
JavaScriptこうすると、使う側からは「何が入っているのか」が直感的に分かりにくくなります。
import app from "./app.js";
app.init();
app.destroy();
app.config;
JavaScriptより細かく分けると:
// app.js(良い例より)
export function init() {}
export function destroy() {}
export const config = {};
JavaScriptもしくは:
// app.js(主役がはっきりしている場合)
export default function init() {}
export function destroy() {}
export const config = {};
JavaScript「何を default にして、何を名前付きにするか」は、
そのモジュールの「主役は何か?」を考えて決めるとよいです。
default + 名前付き export を、分かりやすく並べる
書き方は自由ですが、読みやすさのためにある程度のルールを決めるのがおすすめです。例えば:
- 一番上で default export(主役)を定義
- その下に名前付き export(補助)を並べる
// user.js
export default class User {
/* ... */
}
export function createGuest() { /* ... */ }
export function isAdmin(user) { /* ... */ }
JavaScriptこうしておくと、このモジュールを開いた瞬間に、
「User クラスが主役で、createGuest / isAdmin は補助だな」と一目で分かります。
例題で default export に慣れる
例1:クラスを default export する
// Counter.js
export default class Counter {
constructor(initial = 0) {
this.value = initial;
}
increment() {
this.value++;
}
show() {
console.log(this.value);
}
}
JavaScript// main.js
import Counter from "./Counter.js";
const c = new Counter(10);
c.increment();
c.show(); // 11
JavaScript例2:関数を default export する
// formatCurrency.js
export default function formatCurrency(amount, currency = "JPY") {
return new Intl.NumberFormat("ja-JP", {
style: "currency",
currency
}).format(amount);
}
JavaScript// main.js
import formatCurrency from "./formatCurrency.js";
console.log(formatCurrency(12345)); // ¥12,345
console.log(formatCurrency(12345, "USD")); // $12,345.00 など
JavaScript例3:設定オブジェクトを default export する
// appConfig.js
const appConfig = {
appName: "MyApp",
version: "1.0.0",
debug: true
};
export default appConfig;
JavaScript// main.js
import config from "./appConfig.js";
console.log(config.appName, config.version);
JavaScriptまとめ
default export の核心は、
「モジュール(ファイル)ごとに、“主役”を 1 つだけ外に出すための仕組み」 であることです。
押さえておきたいポイントは次の通りです。
export default ...で宣言し、そのモジュールには 1 つだけ持てる- default import は
{}を使わず、import 任意の名前 from "..."と書く - 名前付き export と組み合わせて、「主役(default)」と「補助(名前付き)」を設計できる
- クラスや 1 つの関数が主役のモジュールと相性が良い
- 何を default にするかは、「このモジュールは一言で何をする?」という問いから決める
まずは、自分のコードの中で
「これはこのファイルの主役だな」と思うクラスや関数に export default を付けてみてください。
そこから少しずつ、「モジュールごとに看板を決める」感覚が育っていきます。
