Node.js で ECMAScript Modules を使ってみました

以前、 ECMAScript 2015 (ES6) in Node.js で import と export がエラーになるという記事を書きました。 この記事の中では、結局、 importexport を使わないで実行する方向で終わってしまいました。 今回は、 importexport を使って、とりあえずでも、実行する方法を調べました。

環境

  • Node.js v8.9.4

ECMAScript Modules の実装

ECMAScript Modules

Stability: 1 - Experimental

ECMAScript Modules | Node.js v8.10.0 Documentation

記事 を書いたのが 2016 年なので、もう 2 年も前なのですが、調べてみると、 2018 年の現在でも、まだ、 ECMAScript Modules は正式な実装になっていないようです。 実験的な実装のようです。

Enabling

The –experimental-modules flag can be used to enable features for loading ESM modules. Once this has been set, files ending with .mjs will be able to be loaded as ES Modules. node –experimental-modules my-app.mjs

ECMAScript Modules | Node.js v8.10.0 Documentation

実験的だとしても、とにかく ECMAScript Modules を使うには、ファイルの拡張子を .mjs にして、オプションに --experimental-modules をつけるようです。

サンプルのファイル

以前の記事と同じですが、次の 2 つのファイルを作成しました。

import しているファイル。

// a.mjs
import b from './b.mjs';

(() => {
  console.log(`b: ${b()}`)
})()

export しているファイル。

// b.mjs
export default () => {
  return 'b!';
}

ファイルの拡張子は .mjs にしました。 import しているファイル (a.mjs) は .mjs じゃなくても良さそうに思いましたが、 .mjs じゃないとダメなようです。

実行する

–experimental-modules オプションをつけて実行してみます。

$ $ node --experimental-modules a.mjs
(node:204) ExperimentalWarning: The ESM module loader is experimental.
b: b!

うーん、実行したときにも、 “ESM module loader is experimental” と警告が出力されます。

終わり

なんでまだ ECMAScript Modules が正式に実装されていないのかな。 と疑問を持ったのですが、次の記事にたくさん勉強になることが書いてありました。

そもそも ECMAScript 2015 自身で定義されたのは構文だけなので、構文はともかく、どうやってモジュールを取ってくるかという Loader の部分がまだ決まりきっていません。

https://whatwg.github.io/loader/

現時点はいくつも決めなきゃいけないポイントがあって

  • 参照解決処理
  • 取得処理
  • script タグでどう書くのか
  • メモ化処理(所謂caching)

の全てを決めて一旦ロードマップ上のMilestone 0 が達成されるような状況です。

ES Modules と Node.js について - from scratch

この記事が書かれたのが、 2016-05-10 のことのようですので、これももう 2 年近く前のことです。

言語仕様の決定は大変そうです。 でも、そういうことに関わってみたいです。