web-dev-qa-db-ja.com

node --experimental-modules、要求されたモジュールは名前付きのエクスポートを提供しません

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-modulesv10 LTSでは実験的ではなくなりました と想定されているので、モジュール作者がバンドワゴンに飛びついていないのはなぜですか?

27
stackdave

編集された新しい(そしてかなり良い)答え

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モジュールのすべての機能のサポートを追加するでしょう。

30
machineghost

.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()
2
Tuan Anh Tran

Lodashがモジュールとして書かれていて、lodash/index.mjsエクスポート済みthrottleexport const throttle = ...;、それからimport { throttle } from lodash;

ここでの問題は、commonjsには名前付きエクスポートなどがないことです。つまり、commonjsモジュールでは1つのものだけをエクスポートします。

したがって、lodashがthrottleという名前のプロパティを含むオブジェクトをエクスポートすると考えてください。

質問の2番目の部分については、ESモジュールがもう実験的ではなくなったら、徐々に採用を開始するだろうと思います。これを書いている時点では、まだ(Node.js v11.14)です。

2
Willian Balmant

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;

なぜこれが当てはまるのかわかりません。誰かが理由を知っている場合は、コメントしてください。

0
CodingYourLife

ES Libraryがジョブを実行したとしてlodashをロードする私にとって、これはNPMパッケージ 同様に。

ESモジュールとしてエクスポートされたLodashライブラリhttps://www.npmjs.com/package/lodash-es

次に、utilsを通常の方法でインポートできます。

import { shuffle } from 'lodash-es';
0
Divyanshu Rawat