名前付き export とは何か(まずイメージから)
名前付き export は、
「このファイルから、名前を付けて外に公開するものを選ぶ仕組み」です。
// math.js
export const PI = 3.14;
export function add(a, b) {
return a + b;
}
export function sub(a, b) {
return a - b;
}
JavaScriptこのファイルでは、PI, add, sub の3つが「名前付き」で export されています。
つまり、「math.js モジュールは、PI と add と sub を外に提供します」と宣言している状態です。
ここが重要です。
名前付き export されたものだけが、他のファイルから import { PI, add } from "./math.js"; のようにして使える「公開API」になります。
それ以外は、そのファイルの中だけの「内緒」です。
基本の書き方と「何個でも出せる」という性質
その場で export を付けて宣言するパターン
よく使うのは、「宣言するときに export を付ける」書き方です。
// math.js
export const PI = 3.14; // 定数を export
export let counter = 0; // 変数も export できる
export function add(a, b) { // 関数を export
return a + b;
}
export class Calculator { // クラスを export
add(a, b) {
return a + b;
}
}
JavaScriptこのように、export は「その後ろにある宣言を外に公開する」という意味です。
1つのモジュールに、名前付き export はいくつでも追加できます。
あとからまとめて export するパターン
まず普通に定義しておいて、最後にまとめて export することもできます。
// math.js
const PI = 3.14;
function add(a, b) {
return a + b;
}
function sub(a, b) {
return a - b;
}
export { PI, add, sub };
JavaScript途中で export を付けるか、最後に export { ... } で並べるかは好みとスタイルの問題です。
「何を公開しているか」が分かりやすいほうを選べばOKです。
名前付き import との関係(セットで理解する)
名前付き export を使うときの import の形
名前付き export を使っているモジュールからは、{} を使って「どの名前を持ってくるか」を指定して import します。
// math.js
export const PI = 3.14;
export function add(a, b) { return a + b; }
export function sub(a, b) { return a - b; }
JavaScript// main.js
import { PI, add } from "./math.js";
console.log(PI); // 3.14
console.log(add(2, 3)); // 5
JavaScript{ PI, add } の部分は、「math.js から PI と add という名前の export を持ってくる」という意味です。
ここが重要です。
「名前付き export」→「名前付き import({})」 がワンセット。
export 側の名前と import 側の {} の中の名前が一致している必要があります。
名前を変えて import したいとき(as)
もし import する側で別の名前にしたい場合は、as を使えます。
// math.js
export function add(a, b) {
return a + b;
}
JavaScript// main.js
import { add as plus } from "./math.js";
console.log(plus(2, 3)); // 5
JavaScriptadd という名前で export されているけれど、
このファイルでは plus という名前で使う、という指定です。
複数同時に変えることもできます。
import { add as plus, sub as minus } from "./math.js";
JavaScript名前付き export と default export の違い
default export とは「そのモジュールの主役」を1つ
もう一つの export の形として、export default があります。
// greet.js
export default function greet(name) {
console.log(`Hello, ${name}`);
}
JavaScriptdefault export は、モジュールに1つだけ持てる「主役」「看板」です。
一方、名前付き export はいくつでも出せる「メニューの一覧」のようなものです。
import の書き方の違い
名前付き export の import:
import { add } from "./math.js"; // {} が必要
JavaScriptdefault export の import:
import greet from "./greet.js"; // {} なし、名前は自由
JavaScript名前付きと default を同時に持っているモジュールもあります。
// user.js
export default class User { /* ... */ }
export function createGuest() { /* ... */ }
JavaScript// main.js
import User, { createGuest } from "./user.js";
JavaScriptここが重要です。
名前付き export は {} で名前を指定して持ってくる。
default export は {} なしで、import 側が好きな名前を付けられる。
両者を混ぜないように意識すると、エラーがぐっと減ります。
「何を export するか」を設計する発想
モジュールの「外向きの顔」を決める
名前付き export は、
そのファイル(モジュール)の「外向きの顔」を決める作業です。
例えば、日付ユーティリティを作るとします。
// dateUtils.js
function pad2(num) {
return num.toString().padStart(2, "0");
}
export function formatDate(date) {
const y = date.getFullYear();
const m = pad2(date.getMonth() + 1);
const d = pad2(date.getDate());
return `${y}-${m}-${d}`;
}
export function formatTime(date) {
const h = pad2(date.getHours());
const m = pad2(date.getMinutes());
const s = pad2(date.getSeconds());
return `${h}:${m}:${s}`;
}
JavaScriptpad2 は内部だけで使う補助関数なので export しません。
外に見せたいのは formatDate と formatTime だけです。
ここが重要です。
「他のファイルから使わせたいもの」だけに export を付け、「内部専用」は何も付けない。
これだけで、モジュールの中と外の境界線がはっきりします。
名前付き export を「セット」で設計する
例えば、ユーザー関連の処理をまとめるモジュールの場合:
// userService.js
export function createUser(name) {
return { id: Date.now(), name };
}
export function renameUser(user, newName) {
return { ...user, name: newName };
}
export function deactivateUser(user) {
return { ...user, active: false };
}
JavaScriptこの3つをセットで export することで、
「ユーザーを扱うときはこの関数群を使ってね」という意図を示せます。
別ファイルからはこう使います。
// main.js
import { createUser, renameUser, deactivateUser } from "./userService.js";
let user = createUser("Alice");
user = renameUser(user, "Bob");
user = deactivateUser(user);
JavaScript名前付き export を見るだけで、
「このモジュールは何をしてくれるのか」が一覧できます。
名前付き export の応用パターン
index.js で再エクスポートして入口をまとめる
大きくなってきたプロジェクトでは、
複数のモジュールを「まとめて export する窓口」として index.js を使うことがあります。
// math/add.js
export function add(a, b) { return a + b; }
// math/sub.js
export function sub(a, b) { return a - b; }
JavaScript// math/index.js
export { add } from "./add.js";
export { sub } from "./sub.js";
JavaScriptこれで、他のファイルからは:
import { add, sub } from "./math/index.js";
JavaScriptのように、math/index.js だけを意識すればよくなります。
まとめて名前空間として import する(参考)
少しだけ進んだ書き方として、
名前付き export されたものを「まとめて1つのオブジェクトとして」import できます。
// math.js
export function add(a, b) { return a + b; }
export function sub(a, b) { return a - b; }
JavaScript// main.js
import * as math from "./math.js";
console.log(math.add(2, 3));
console.log(math.sub(5, 1));
JavaScriptmath.add, math.sub のように、「名前空間付き」で使えます。
初心者のうちはまず基本の { add, sub } 形に慣れてから、
「全部まとめたい」と思ったときにこの形を覚えれば十分です。
例題で名前付き export に慣れる
例1:簡単なユーティリティモジュール
// utils.js
export function isEven(n) {
return n % 2 === 0;
}
export function isOdd(n) {
return !isEven(n);
}
JavaScript// main.js
import { isEven, isOdd } from "./utils.js";
console.log(isEven(4)); // true
console.log(isOdd(5)); // true
JavaScript例2:クラスを複数 export する
// shapes.js
export class Rectangle {
constructor(width, height) {
this.width = width;
this.height = height;
}
area() {
return this.width * this.height;
}
}
export class Circle {
constructor(radius) {
this.radius = radius;
}
area() {
return Math.PI * this.radius * this.radius;
}
}
JavaScript// main.js
import { Rectangle, Circle } from "./shapes.js";
const r = new Rectangle(10, 5);
const c = new Circle(3);
console.log(r.area());
console.log(c.area());
JavaScript例3:設定値を名前付き export する
// config.js
export const API_BASE_URL = "https://api.example.com";
export const DEFAULT_LANG = "ja";
export const TIMEOUT_MS = 5000;
JavaScript// main.js
import { API_BASE_URL, DEFAULT_LANG } from "./config.js";
console.log(API_BASE_URL, DEFAULT_LANG);
JavaScriptまとめ
名前付き export の核心は、
「このモジュールから、名前を付けて複数の値・関数・クラスを公開する」 ことです。
押さえておきたいポイントを整理すると:
名前付き export は export const ..., export function ..., export class ... または export { A, B } の形で書く
名前付き export されたものは、import { A, B } from "./x.js"; のように {} を使って名前指定で import するas を使えば import 側で別名にできる
export されていないものは、そのモジュールの「内部専用」になる
モジュールの「外向きの顔」(インターフェース)を名前付き export で設計する、という意識が大事
まずは、小さなファイルを作って、
「このファイルから何を外に出したいか?」を考えながら export を付けていってみてください。
それだけで、モジュール設計の感覚が少しずつつかめてきます。
