export 文は、モジュールから関数、オブジェクト、プリミティブ値をエクスポートするための JavaScript モジュールを作成するときに使用し、これらは別のプログラムから import 文で利用することができます。
エクスポートされたモジュールは、宣言のあるなしにかかわらず strict モードで動作します。エクスポート文は、埋め込みスクリプトでは使えません。
構文
3種類のエクスポート方法があります。
- 名前付きエクスポート (モジュール当たり0個以上のエクスポート)
- デフォルトエクスポート (モジュール当たり1個のエクスポート)
- 混合エクスポート
// 個々の機能のエクスポート
export let name1, name2, …, nameN; // var, const も
export let name1 = …, name2 = …, …, nameN; // var, const も
export function functionName(){...}
export class ClassName {...}
// エクスポートリスト
export { name1, name2, …, nameN };
// エクスポート時の名前変更
export { variable1 as name1, variable2 as name2, …, nameN };
// Exporting destructured assignments with renaming
export const { name1, name2: bar } = o;
// 既定のエクスポート
export default expression;
export default function (…) { … } // class, function* も使用可
export default function name1(…) { … } // class, function* も使用可
export { name1 as default, … };
// モジュールのアグリゲート
export * from …;
export { name1, name2, …, nameN } from …;
export { import1 as name1, import2 as name2, …, nameN } from …;
export { default } from …;
nameN- (別のスクリプトで
importを使用してインポートできるようにするため) エクスポートする識別子です。
解説
エクスポート方法は、名前付きとデフォルトの 2 種類あります。名前付きエクスポートはモジュールごとに複数持てますが、デフォルトエクスポートは 1 つに限ります。それぞれのエクスポート方法は、上記の構文のひとつに対応します。
名前付きエクスポート:
// 事前に宣言された機能のエクスポート
export { myFunction, myVariable };
// 個別の機能のエクスポート (var, let,
// const, function, class がエクスポート可能)
export let myVariable = Math.sqrt(2);
export function myFunction() { ... };
デフォルトエクスポート:
// デフォルトとして事前に定義された機能のエクスポート
export { myFunction as default };
// 個別の機能をデフォルトとしてエクスポート
export default myFunction() { ... }
export default class { .. }
名前付きエクスポートは、さまざまな値をエクスポートするのに役立ちます。インポートするときは、対応するオブジェクトと同じ名前を使用しなければなりません。
一方、デフォルトエクスポートは以下のように任意の名前を使用できます。
// ファイル test.js let k; export default k = 12;
// 他のファイル import m from './test'; // k がデフォルトエクスポートなので、インポートする k の代わりに m を使用することができる点に注意してください console.log(m); // log 12 になる
名前の競合を防ぐために、名前付きエクスポートの名前を変更することもできます。
export { myFunction as function1,
myVariable as variable };
親モジュールでサブモジュールをまとめれば、そのモジュールからインポートすることができるようになります。
// In parentModule.js
export { myFunction, myVariable } from 'childModule1.js';
export { myClass } from 'childModule2.js';
// 最上位モジュールで
import { myFunction, myVariable, myClass } from 'parentModule.js'
例
名前付きエクスポートの使用
module.js モジュールの中で、以下のコードをインクルードすることができます。
// "my-module.js" モジュール
function cube(x) {
return x * x * x;
}
const foo = Math.PI + Math.SQRT2;
var graph = {
options: {
color:'white',
thickness:'2px'
},
draw: function() {
console.log('From graph draw function');
}
}
export { cube, foo, graph };
HTML ページの中に含まれる最上位モジュールの中では、次のようにすることができます。
import { cube, foo, graph } from 'my-module.js';
graph.options = {
color:'blue',
thickness:'3px'
};
graph.draw();
console.log(cube(3)); // 27
console.log(foo); // 4.555806215962888
以下の点に注意することが重要です。
- このスクリプトを HTML の
<script>要素で type="module" を指定したものに入れる必要があり、そうすれば適切にモジュールとして認識され、扱われます。 file://の URL で JavaScript モジュールを実行することはできません。 — CORS エラーになります。 HTTP サーバーを通して実行する必要があります。
デフォルトエクスポートの使用
値をひとつエクスポートしたい、あるいはモジュールでフォールバック先の値を持ちたい場合は、デフォルトエクスポートを使用するとよいでしょう。
// module "my-module.js"
export default function cube(x) {
return x * x * x;
}
別のスクリプトからの、デフォルトエクスポートのインポートは簡単です。
import cube from './my-module.js'; console.log(cube(3)); // 27
仕様書
| 仕様書 | 状態 | 備考 |
|---|---|---|
| ECMAScript (ECMA-262) Exports の定義 |
現行の標準 | |
| ECMAScript 2015 (6th Edition, ECMA-262) Exports の定義 |
標準 | 初回定義 |
ブラウザーの互換性
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
export | Chrome 完全対応 61 | Edge
完全対応
16
| Firefox
完全対応
60
| IE 未対応 なし | Opera 完全対応 47 | Safari 完全対応 10.1 | WebView Android 未対応 なし | Chrome Android 完全対応 61 | Firefox Android
完全対応
60
| Opera Android 完全対応 44 | Safari iOS 完全対応 10.3 | Samsung Internet Android 完全対応 8.0 | nodejs
完全対応
13.2.0
|
凡例
- 完全対応
- 完全対応
- 未対応
- 未対応
- 実装ノートを参照してください。
- 実装ノートを参照してください。
- ユーザーが明示的にこの機能を有効にしなければなりません。
- ユーザーが明示的にこの機能を有効にしなければなりません。
関連情報
import- JavaScript modules guide
- ES6 in Depth: Modules, Hacks blog post by Jason Orendorff
- ES modules: A cartoon deep-dive, Hacks blog post by Lin Clark
- Axel Rauschmayer's book: "Exploring JS: Modules"