TL;DR - 2019 年 10 月まではしないでください。Node.jsモジュール チームは次のように求めています。
[2019 年 10 月] までは、Node.js での使用を目的とした ES モジュール パッケージを公開しないでください。
2019年5月更新
この質問がされた2015年以来、モジュールのJavaScriptサポートは大幅に成熟しており、うまくいけば2019年10月に正式に安定する予定です。他のすべての回答は現在廃止されているか、過度に複雑です。これが現在の状況とベスト プラクティスです。
ES6 サポート
ES6 (aka 2015) の 99% は、バージョン 6 以降の Node でサポートされています。Node の現在のバージョンは 12 です。すべてのエバーグリーン ブラウザーは、ES6 機能の大部分をサポートしています。ECMAScript は現在バージョン 2019であり、バージョン管理スキームは現在、年を使用することを優先しています。
ブラウザの ES モジュール (別名 ECMAScript モジュール)
すべてのエバーグリーン ブラウザーは、2017 年以降、ES6 モジュールをサポートし ています。動的インポートは、Chrome (+ Opera や Samsung Internet などのフォーク) と Safari でサポートされています。Firefox のサポートは、次のバージョン 67 で予定されています。import
モジュールをロードするために Webpack/rollup/Parcel などは必要ありません。これらは他の目的にも役立つ可能性がありますが、コードをロードするために必須ではありません。ES モジュール コードを指す URL を直接インポートできます。
ノード内の ES モジュール
ES モジュール ( /.mjs
を含むファイル) は、Node v8.5.0 以降、フラグを指定して呼び出すことでサポートされています。2019 年 4 月にリリースされたノード v12 では、実験的なモジュールのサポートが書き直されました。最も目に見える変更は、インポート時にデフォルトでファイル拡張子を指定する必要があることです。import
export
node
--experimental-modules
// lib.mjs
export const hello = 'Hello world!';
// index.mjs:
import { hello } from './lib.mjs';
console.log(hello);
全体を通して必須の.mjs
拡張子に注意してください。次のように実行します。
node --experimental-modules index.mjs
Node 12 リリースは、Modules チームが開発者に、Node.js で使用することを意図したES モジュール パッケージを、 との両方を介してパッケージを使用するための解決策が見つかるまで公開しないように依頼したときでもrequire('pkg')
ありimport 'pkg'
ます。ブラウザー向けのネイティブ ES モジュールを引き続き公開できます。
ネイティブ ES モジュールのエコシステム サポート
2019 年 5 月の時点で、ES モジュールのエコシステム サポートは未熟です。たとえば、JestやAvaなどのテスト フレームワークは をサポートしていません--experimental-modules
。トランスパイラーを使用する必要があり、名前付きインポート ( ) 構文 (ほとんどの npm パッケージではまだ機能しません) を使用するか、デフォルトのインポート構文 ( ) を使用するかを決定する必要がありimport { symbol }
ますimport Package from 'package'
。 TypeScript で作成されたパッケージ(graphql-tools、node-influx、faast など) の場合。ただし、Jest/Ava/Mocha などでテストできるように、Babel がコードをトランスパイルする場合と両方で機能する回避策があります。--experimental-modules
import * as ApolloServerM from 'apollo-server'; const ApolloServer = ApolloServerM.default || ApolloServerM;
間違いなく醜いですが、この方法では、トランスパイラーなしで、import
/を使用して独自の ES モジュール コードを記述し、export
それを で実行できます。node --experimental-modules
まだ ESM に対応していない依存関係がある場合は、上記のようにインポートすると、Babel を介してテスト フレームワークやその他のツールを使用できるようになります。
質問に対する以前の回答 - Node が require/import の問題を解決するまで、できれば 2019 年 10 月頃にこれを行わないでください。
下位互換性を備えた ES6 モジュールの npm への公開
ES モジュールを npmjs.org に公開して、Babel や他のトランスパイラーを使用せずに直接インポートできるようにするには、単にmain
フィールドをpackage.json
ファイル.mjs
に指定しますが、拡張子は省略します。
{
"name": "mjs-example",
"main": "index"
}
それが唯一の変更点です。拡張子を省略することにより、Node は --experimental-modules で実行された場合に最初に mjs ファイルを探します。それ以外の場合は .js ファイルにフォールバックするため、古い Node バージョンをサポートするための既存の変換プロセス.mjs
は以前と同じように機能します — Babel がファイルを指すようにしてください。
これは、NPM に公開したNode < 8.5.0 の下位互換性を備えたネイティブ ES モジュールのソースです。Babel などを使わなくても、すぐに使用できます。
モジュールをインストールします。
npm install local-iso-dt
# or, yarn add local-iso-dt
テスト ファイルtest.mjsを作成します。
import { localISOdt } from 'local-iso-dt/index.mjs';
console.log(localISOdt(), 'Starting job...');
--experimental-modules フラグを指定してノード (v8.5.0+) を実行します。
node --experimental-modules test.mjs
TypeScript
TypeScript で開発する場合は、ES6 コードを生成して ES6 モジュールを使用できます。
tsc index.js --target es6 --modules es2015
*.js
次に、出力の名前を に変更する必要があります。これは、ファイルを直接出力できるように、すぐに修正されることが期待さ.mjs
れる既知の問題です。tsc
.mjs