BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース ECMAScript 6モジュールがCommandJS,AMDを超える

ECMAScript 6モジュールがCommandJS,AMDを超える

原文(投稿日:2014/09/16)へのリンク

Axel Rauschmayer博士は,ECMAScript 6(ES6)のモジュール構文の最終仕様を発表した。

記事 "ECMAScript 6 modules: the final syntax" の中で博士は,ECMAScript 6モジュールやモジュールメタデータ,ECMAScript 6モジュールローダAPIなどを含む,ES6モジュールシステム全体の概要を詳細に説明している。

Rauschmayer博士は,CommonJSやAMDのユーザがともにハッピーになるようなフォーマットの実現がES6モジュールの目標であり,言語に組み込むことによって,CommonJSやAMDを越えることが可能になる,と述べている。

ES6には2つのエクスポートがある。名前付きエクスポート(モジュールに複数)と,デフォルトエクスポート(モジュール毎に1つ)である。名前付きエクスポートでは,モジュール宣言でプレフィックスしたキーワードエクスポートによって,複数のものをエクスポートすることが可能で,それぞれ名前によって区別される。

博士は言う。

名前付きエクスポートを指定する方法は2つありますが,外部のことをまったく考えずに単純にコードを記述して,後でエクスポートするものすべてにキーワードを付け加えるようにすると,非常に便利だと思います。

必要ならばモジュール全体をインポートして,その名前付きエクスポートをプロパティ表記で参照することも可能です。

ES6のDefaultエクスポートはもっとも重要なエクスポート値なので,特に簡単にインポートできるようになっている,と博士は言う。フロントエンドの開発では,単一の値のみをエクスポートするモジュールが一般的であるが,モデルはモジュール毎にひとつであっても,複数のコンストラクタやクラスがあることが多い,とも述べている。

ES6では,現在のモジュール(モデルのURLなどのように)に関する情報に対して,モジュール内部からアクセスする手段も用意されている。この場合のモジュールは,メタデータが"モジュールとして"インポートされていることを示すトークンである。次のようなものだ。

import { url } from this module;
console.log(url);

メタデータには,オブジェクト経由でアクセスすることもできる。

import * as metaData from this module;
console.log(metaData.url);

モジュールを操作する宣言構文に加えてES6では,開発者がモジュールやスクリプトをプログラムから操作したり,モジュールのローディングを設定したりするための,プログラムAPIも用意されている。APIについて,博士は次のように述べている

ローダはモジュール指示子("import ... from"の最後にある文字列ID)の解決やモジュールのロードなどを処置します。コンストラクタはReflect.Loaderです。各プラットフォームは,グローバル変数System(システムローダ)に, それぞれのモジュールロード方法を実装した独自のインスタンスを保持します。

続いて博士は,モジュールローダAPIに用意された,コンフィギュレーション用のさまざまなフックについて言及する。"現在開発中"と前置きした上で,ローダAPIが"ローディングプロセスの多くをカスタマイズ可能になる",ということだ。例えば

  • インポート時のモジュールチェック(JSLintやJSHintによる)。
  • インポート時のモジュールの自動変換(CoffeeScriptやTypeScriptコードも可能)。
  • レガシーモジュール(AMD, Node.js)の利用

コンフィギュレーション可能なローディングは,Node.jsやCommonJSでは制限されていた領域だ,と博士は言う。

ES6モジュール構文の最終的な詳細に対するJavaScriptコミュニティからの反応は,概ね好意的なものだ。

Redditの"ECMAScript 6 modules: the final syntax"ディスカッションで,ユーザのbrtt3000は,"重要な部分はすべてカバーされていますし,構文も非常によいので,気に入っています"とコメントしている。Hack Newsでは,Alan Johnson氏 -- Hackeratiのソフトウェアエンジニア -- が,"ES6は新鮮な息吹のよう"とコメントしている

その一方で,一部では混乱や不安もあった。

博士の記事に対するコメントでは,Evan Winslow氏が次のように述べている

デフォルトのエクスポートが名前付きならば,デフォルトエクスポートをあえて使用する必要があるのでしょうか?名前付きエクスポートが望ましい方法で,デフォルトエクスポートはその上のハックに過ぎない,ということではないのですか?モジュールの非同期ロードにSystem.importメソッドを使うのであれば,デフォルトエクスポートの取得には .default を使わなければなりません。これは混乱を招くことになるでしょう。

博士の返答は次のとおりだ。

JSモジュールのコミュニティは多様であり,ES6はそのユースケースのすべてをサポートする必要があります。 そのため,必要以上に複雑な部分はあるかも知れませんが,同時にコミュニティを統一する可能性も持っています。

ES7+に対して提案を行いたいInfoQ読者は,ECMAScript6 Githubを参照する必要がある。

この記事に星をつける

おすすめ度
スタイル

BT