Node 8.9.1をインストールしました(v10.5.0でも同じ問題が発生します)。
.mjs
を含むファイルでnpmパッケージからの名前付きインポートを使用しようとしています
import { throttle } from lodash;
走る:
node --experimental-modules index.mjs
そして私は得る:
SyntaxError:要求されたモジュール 'lodash'は、ModuleJob._instantiate(internal/modules/esm/module_job.js:80:21)で 'throttle'という名前のエクスポートを提供しません
--experimental-modules
は v10 LTSでは実験的ではなくなりました と想定されているので、モジュール作者がバンドワゴンに飛びついていないのはなぜですか?
編集された新しい(そしてかなり良い)答え
Nodeチームは...遅いです。その間、Lodash(John-David Dalton)を連れてきた同じ男が素晴らしいソリューションを想像しました、彼のアイデアは、2019年にES6モジュールを完全にサポートするための最良の方法です。
(実際、私は以前の回答を削除したいが欲しい(しかし、私は歴史的な目的のためにそれを残した)
新しいソリューションは非常にシンプルです。
ステップ#1:
npm i esm
( https://www.npmjs.com/package/esm パッケージの詳細)
ステップ#2:
node -r esm yourApp.js
それだけです。本当に簡単です。 Node argとして-r esm
を追加するだけで、すべてが魔法のように機能します(--experimental-modules
よりも入力が少なくなります!)ありがとうJohn-David Dalton !!!
私の元の答えで述べたように、おそらくsomedayNodeは最終的に完全なES6サポートをリリースしますが、それが起こると、それを採用するのは簡単ですいくつかのスクリプトから「-r esm」を削除:D
最後に、正当な理由を説明するために、私は彼の答えからそれを見つけられませんでしたが、@ Divyanshu Rawatは実際に、この更新を行うずっと前に、このライブラリの前兆として答えを提供しました。
元の回答
--experimental-modules
は、名前付きエクスポートをまだサポートしていません。
--experimental-modulesは、commonjsモジュールからの名前付きエクスポートのインポートをサポートしていません(ノード自体の組み込みを除く)。
これが、構文を使用できない理由です。
import { throttle } from 'lodash';
代わりに(少なくとも今のところ)必要なものを破棄する必要があります。
import lodash from 'lodash';
const { throttle } = lodash;
おそらくいつかNodeはESモジュールのすべての機能のサポートを追加するでしょう。
.mjs
拡張子を使用する必要があります。
これを設定すると、.mjsで終わるファイルをESモジュールとしてロードできるようになります。
参照: https://nodejs.org/api/esm.html
更新:
メソッドをまだエクスポートしていないようです。
hello.mjs
にコンテンツがあるとします
export function sayHello() {
console.log('hello')
}
このようにindex.mjs
で使用できます
import {sayHello} from './hello.mjs'
sayHello()
Lodashがモジュールとして書かれていて、lodash/index.mjs
エクスポート済みthrottle
:export const throttle = ...;
、それからimport { throttle } from lodash;
ここでの問題は、commonjsには名前付きエクスポートなどがないことです。つまり、commonjsモジュールでは1つのものだけをエクスポートします。
したがって、lodashがthrottle
という名前のプロパティを含むオブジェクトをエクスポートすると考えてください。
質問の2番目の部分については、ESモジュールがもう実験的ではなくなったら、徐々に採用を開始するだろうと思います。これを書いている時点では、まだ(Node.js v11.14)です。
Nodejs express * .mjsファイルと--experimental-modules
フラグがgoogleapisで有効になっていると、このエラーが発生しました。
「googleapis」から{google}をインポートします。
SyntaxError:リクエストされたモジュール 'googleapis'は 'google'という名前のエクスポートを提供しません
解決
//not working!
//import { google } from "googleapis";
//working
import googleapis from "googleapis";
const { google } = googleapis;
なぜこれが当てはまるのかわかりません。誰かが理由を知っている場合は、コメントしてください。
ES Libraryがジョブを実行したとしてlodashをロードする私にとって、これはNPMパッケージ 同様に。
ESモジュールとしてエクスポートされたLodashライブラリ。 https://www.npmjs.com/package/lodash-es
次に、utilsを通常の方法でインポートできます。
import { shuffle } from 'lodash-es';