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


53

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

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

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

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

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

私が見つけたソリューションのほとんどは、まっすぐなノードには当てはまらないようです。このようにここに:

ES6モジュールのインポートで「Uncaught SyntaxError:Unexpected identifier」が表示される

「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",

1
こんにちは、今同じ問題を抱えています。依存関係も共有できますか?たぶんあなたの更新の前後の差分です。私が問題を引き起こす可能性のある同様のパッケージを見つけることができるかどうかを確認するために私をチェックすることができます。
lynx

私はすべての「インポート」を「必要」に置き換えただけで、すべて順調です。ばかげているが、今それを理解する努力の価値はなかった。ただし、依存関係を使用してオリジナルを更新します。リードがあったら、元のコードと照合してチェックします。
user3810626

1
CommonJS構文(requireおよびmodule.exports)はノードの元の形式であり、webpackもサポートしていますが、ES6モジュール構文(export、import)が新しい方法であり、現在はノードとWebpackがサポートしています。私はそのノードがインポートをサポートすることを今読んだのですが、多くのチュートリアルが純粋なノードのものを必要とすることを示しているので、ノードにその構文を使用するほうが良いでしょう。
テッドフィッツパトリック

1
最後に、私にとって行く方法はこれであるように見えました:github.com/vuejs/vue-jest/issues/134#issuecomment-461755061 にプリセットを設定jest.config.jsする'ts-jest/presets/js-with-ts'-まだ他のいくつかの問題がありますが、これにより大きな問題は解決しました。.....ええと、私の問題はテスト関連でした...通常のビルドは問題ありませんでした
lynx '16

リンクス、面白い。私自身、ジェストを使用していません。テッド、面白い。はい、汗をかきません。
user3810626

回答:


51

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

最新バージョンのノードがインストールされていることを確認します。--experimental-modulesフラグはもはや必要ではありません。次のいずれかを実行してください。

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

または

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

これを使用する場合は、パスを変更して必要なファイルの「js」を含め、必要なファイルのエクスポートステートメントの形式を変更してから、「インポート」から変更したすべての「必要」ステートメントを使用します。 「require」は不明です—これは機能するので、この回答を受け入れます。
user3810626

2
問題がnode_modules /の下にある場合、これは実際にはオプションではありませんか?その場合の修正方法はありますか?
トレントビン

18

公式ドキュメント(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」フラグを追加します

6

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

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

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


0

私は生まれたばかりのExpress APIプロジェクトでこの問題を抱えていました。

の問題のサーバーコードsrc/server/server.js

import express from 'express';
import {initialDonationItems, initialExpenditureItems} from "./DemoData";

const server = express();

server.get('/api/expenditures', (req, res) => {
  res.type('json');
  res.send(initialExpenditureItems);
});

server.get('/api/donations', (req, res) => {
  res.type('json');
  res.send(initialDonationItems);
});

server.listen(4242, () => console.log('Server is running...'));

ここに私の依存関係がありました:

{
  "name": "contributor-api",
  "version": "0.0.1",
  "description": "A Node backend to provide storage services",
  "scripts": {
    "dev-server": "nodemon --exec babel-node src/server/server.js --ignore dist/",
    "test": "jest tests"
  },
  "license": "ISC",
  "dependencies": {
    "@babel/core": "^7.9.6",
    "@babel/node": "^7.8.7",
    "babel-loader": "^8.1.0",
    "express": "^4.17.1",
    "mysql2": "^2.1.0",
    "sequelize": "^5.21.7",
    "sequelize-cli": "^5.5.1"
  },
  "devDependencies": {
    "jest": "^25.5.4",
    "nodemon": "^2.0.3"
  }
}

そして、ここにエラーを投げたランナーがいました:

nodemon --exec babel-node src/server/server.js --ignore dist

うまく機能する同様のExpressプロジェクトがあったので、これはイライラしました。

解決策は最初にこの依存関係を追加することでした:

npm install @babel/preset-env

次にbabel.config.js、プロジェクトルートでを使用して接続します。

module.exports = {
  presets: ['@babel/preset-env'],
};

なぜこれが機能するのかを完全に理解しているわけではありませんが、信頼できるソースからコピーしたので、そのまま使用できます。


ええ、私の問題は、コードにたくさんのプリセットがあり、私が望むものと望まないもののバランスをとることができなかった/ものを壊したことです。
user3810626

私は@ user3810626-混乱するJSクラッシュを終日押し続けてきました-私の問題は、言語とエコシステムに非常に慣れていないためだと思います。そこに着く...:-)
半分

1
幸運を!ジャングルだよ!(つまり、文字通り、JSエコシステムはジャングルです...)
user3810626

-2
  1. babelを使い始めたときも同じ問題がありました...しかし、後で解決策が見つかりました...これまでのところ問題はありません...現在、Node v12.14.1、「@ babel / node」 :「^ 7.8.4」、私はbabel-nodeとnodemonを使用して実行します(ノードも問題ありません。)
  2. package.json: "start": "nodemon --exec babel-node server.js" debug ":" babel-node debug server.js "!!注:server.jsは私のエントリファイルであり、使用できます。
  3. launch.jsonデバッグ時には、launch.jsonファイル "runtimeExecutable": "$ {workspaceRoot} /node_modules/.bin/babel-node" !! note:plus runtimeExecutableも構成に含める必要があります。
  4. もちろん、babel-nodeを使用すると、通常はbabel.config.js / .babelrcファイルなどの別のファイルも必要になり、編集します

-2

私の解決策は、次のようにnodemonを実行しているときにbabel-nodeパスを含めることでした。

nodemon node_modules/.bin/babel-node index.js

あなたはpackage.jsonスクリプトに次のように追加できます:

debug: nodemon node_modules/.bin/babel-node index.js

注:エントリファイルはindex.js、エントリファイルに置き換えます(多くの場合、app.js / server.jsがあります)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.