web-dev-qa-db-ja.com

SyntaxError:モジュールの外部ではimportステートメントを使用できません

問題を引き起こしているApolloServerプロジェクトを持っているので、最新のBabelを使用すると、プロジェクトを更新して問題が発生する可能性があると思いました。私の「index.js」は:

require('dotenv').config()
import {startServer} from './server'
startServer()

そして、それを実行すると、「SyntaxError:モジュールの外でimportステートメントを使用できません」というエラーが表示されます。最初に、TPTB *にこれがモジュールであると納得させるために何かを試みました(成功しませんでした)。そこで、「インポート」を「必須」に変更し、これが機能しました。

しかし、今では他のファイルに約24の「インポート」があり、同じエラーが発生しています。

*問題の根本原因は、問題の不満がどこにあるかさえわからないことだと確信しています。私はそれがBabel 7であると想定していました(私はBabel 6から来ており、プリセットを変更する必要があったためです)が、100%確実ではありません。

私が見つけた解決策のほとんどは、まっすぐなノードには当てはまらないようです。このようにここに:

「Uncaught SyntaxError:Unexpected identifier」を与えるES6モジュールのインポート

「type = module」を追加することで解決されたと言いますが、これは通常、HTMLで行われますが、私にはありません。プロジェクトの古いプリセットを使用してみました:

"presets": ["es2015", "stage-2"],
"plugins": []

しかし、それによって別のエラーが発生します。「エラー:プラグイン/プリセットファイルは、オブジェクトのみをエクスポートできません。関数のみです。」

更新:ここに私が始めた依存関係があります:

"dependencies": {
"@babel/polyfill": "^7.6.0",
"apollo-link-error": "^1.1.12",
"apollo-link-http": "^1.5.16",
"apollo-server": "^2.9.6",
"babel-preset-es2015": "^6.24.1",
44
user3810626

2020アップデート(ノード13.2.0以降)

最新バージョンのNodeがインストールされていることを確認します。--experimental-modulesフラグは不要になりました。-次のいずれか)を実行してください

  • "type": "module"を最も近い親package.jsonに追加します。これにより、すべての.jsおよび.mjsファイルがESモジュールとして解釈されます。 .cjs拡張子を使用して、個々のファイルをCommonJSとして解釈できます。

[〜#〜]または[〜#〜]

  • .mjs拡張子を付けてファイルに明示的に名前を付けます。 .jsなどの他のすべてのファイルはCommonJSとして解釈されます。これは、typepackage.jsonで定義されていない場合のデフォルトです。
27
jabacchetta

公式ドキュメントによると( https://nodejs.org/api/esm.html#esm_code_import_code_statements ):

importステートメントはESモジュールでのみ許可されます。 CommonJSの同様の機能については、import()を参照してください。

NodeをファイルをESモジュールとして扱う必要がある場合( https://nodejs.org/api/esm.html#esm_enabling ):

  • 「type」:「module」をpackage.jsonに追加します
  • ノード呼び出しに「--experimental-modules」フラグを追加します
17
shmekor

私は同じ問題を抱えていて、以下はそれを修正しました(ノード12.13.1を使用):

  • .jsファイル拡張子を.mjsに変更します
  • アプリの実行時に--experimental-modulesフラグを追加します。
  • オプション:package.jsonに "type": "module"を追加します

詳細: https://nodejs.org/api/esm.html

4
iseenoob