export

export 文は、モジュールから関数、オブジェクト、プリミティブ値をエクスポートするための JavaScript モジュールを作成するときに使用し、これらは別のプログラムから import 文で利用することができます。

エクスポートされたモジュールは、宣言のあるなしにかかわらず strict モードで動作します。エクスポート文は、埋め込みスクリプトでは使えません。

構文

3種類のエクスポート方法があります。

  1. 名前付きエクスポート (モジュール当たり0個以上のエクスポート)
  2. デフォルトエクスポート (モジュール当たり1個のエクスポート)
  3. 混合エクスポート
// 個々の機能のエクスポート
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 Latest Draft (ECMA-262)
Exports の定義
ドラフト
ECMAScript 2015 (6th Edition, ECMA-262)
Exports の定義
標準 初回定義

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
exportChrome 完全対応 61Edge 完全対応 16
完全対応 16
完全対応 15
無効
無効 From version 15: this feature is behind the Experimental JavaScript Features preference.
Firefox 完全対応 60
完全対応 60
未対応 54 — 60
無効
無効 From version 54 until version 60 (exclusive): this feature is behind the dom.moduleScripts.enabled preference. To change preferences in Firefox, visit about:config.
IE 未対応 なしOpera 完全対応 47Safari 完全対応 10.1WebView Android 未対応 なしChrome Android 完全対応 61Firefox Android 完全対応 60
完全対応 60
未対応 54 — 60
無効
無効 From version 54 until version 60 (exclusive): this feature is behind the dom.moduleScripts.enabled preference. To change preferences in Firefox, visit about:config.
Opera Android 完全対応 44Safari iOS 完全対応 10.3Samsung Internet Android 完全対応 8.0nodejs 完全対応 8.5.0
補足 無効
完全対応 8.5.0
補足 無効
補足 Module file names must end with .mjs, not .js. See Node's ECMAScript Modules documentation for more details.
無効 From version 8.5.0: this feature is behind the --experimental-modules runtime flag.

凡例

完全対応  
完全対応
未対応  
未対応
実装ノートを参照してください。
実装ノートを参照してください。
ユーザーが明示的にこの機能を有効にしなければなりません。
ユーザーが明示的にこの機能を有効にしなければなりません。

関連情報