予期しないトークンのエクスポートを取得する


220

プロジェクトでES6コードを実行しようとしていますが、予期しないトークンエクスポートエラーが発生します。

export class MyClass {
  constructor() {
    console.log("es6");
  }
}

5
環境または構成に関する情報が不足しているため、支援を提供できません。このエラーはexport、ES6でのみ利用可能であるように、webpackまたはbabelのいずれかが正しく機能していないことを示唆しており、それらのモジュールはES6サポートを提供するものです。
Claies 2016

24
あなたは使うべきmodule.exports = MyClassではない、export class MyClass
onmyway133

回答:


249

ES6モジュールの構文を使用しています。

つまり、環境(node.jsなど)はES6モジュールの構文をサポートする必要があります。

NodeJSはmodule.exportsES6モジュール構文(exportキーワード)ではなくCommonJSモジュール構文()を使用します。

解決:

  • babelnpmパッケージを使用してES6をcommonjsターゲットにトランスパイルします

または

  • CommonJS構文でリファクタリングします。

CommonJS構文の例は(flaviocopes.com/commonjs/から)です。

  • exports.uppercase = str => str.toUpperCase()
  • exports.a = 1

15
nodejsはいつimportネイティブサポートしますか?v10.0.0にはあると思いましたが、どうやらありません。
ショビー

4
@chovy実験的サポートはフラグ "--experimental-modules"で利用できます。ファイルの拡張子は.mjsにする必要があります
Giovanni P.

1
モジュールをネイティブサポートしているChrome 66を使用すると、このエラーが発生します。
トムラッセル

ところで、node10 / node12はフラグの背後にあるモジュールをサポートしていますが、REPLモードではサポートしていませんが、node12のevalモードではサポートされています
jakub.g

2
CommonJs構文についてはまだ明確ではありません。このリンクをチェックアウトしてください。少し役立つかもしれません。flaviocopes.com/commonjs
LT

142

このエラーが発生した場合は、JavaScriptファイルをHTMLページにどのように組み込んだかに関連している可能性があります。モジュールをロードするときは、それらのファイルをそのように明示的に宣言する必要があります。ここに例を示します:

//module.js:
function foo(){
   return "foo";
}

var bar = "bar";

export { foo, bar };

次のようなスクリプトを含めると、

<script src="module.js"></script>

エラーが発生します:

キャッチされないSyntaxError:予期しないトークンのエクスポート

type属性が "module"に設定されたファイルを含める必要があります。

<script type="module" src="module.js"></script>

そして、それは期待どおりに動作し、モジュールを別のモジュールにインポートする準備が整います。

import { foo, bar } from  "./module.js";

console.log( foo() );
console.log( bar );

37
「最も支持された」答えとは異なり、これは実際に問題を解決し、CommonJSメソッド、APMメソッドを利用すること、またはコードをトランスパイルすることのみが選択肢であることを示唆せずに、なぜそれが起こっているのかを説明します...これも例外ですtype有効なMIMEタイプ(別名:メディアタイプ)であることが期待されるw3c標準に準拠しているため、これは予期しない発見でした。ありがとう!
Shaun Wilson、

4
これによりエラーが修正されますが、インラインスクリプトであるスクリプト67を使用して、Chrome 67のインポートステートメントの行に「予期しないトークン{」が表示されます。例:<script> import ... </ script>
PandaWood

1
@PandaWood <script type="module">import ...</script>モジュールからインポートする場合は、を使用する必要があります。最近のバージョンのChromiumでテストしました。
Vladimir S.

これで私の問題が解決しました:)
user3651476 '21

純粋なJS(ES6)はインポートをサポートしており、これが私がこれに出会った理由を正確に説明しています
Eric

15

私の2セント

書き出す

ES6

myClass.js

export class MyClass1 {
}
export class MyClass2 {
}

other.js

import { MyClass1, MyClass2 } from './myClass';

CommonJSの代替

myClass.js

class MyClass1 {
}
class MyClass2 {
}
module.exports = { MyClass1, MyClass2 }
// or
// exports = { MyClass1, MyClass2 };

other.js

const { MyClass1, MyClass2 } = require('./myClass');

デフォルトをエクスポート

ES6

myClass.js

export default class MyClass {
}

other.js

import MyClass from './myClass';

CommonJSの代替

myClass.js

module.exports = class MyClass1 {
}

other.js

const MyClass = require('./myClass');

お役に立てれば


ES6のデフォルトのエクスポートの例では、「デフォルトのエクスポート」と記述しましたが、「エクスポートのデフォルト」である必要があります。
IAM_AL_X

@IAM_AL_Xキャッチありがとうございます:-)
Barnstokkr

10

ES6を使用するには babel-preset-env

そしてあなたの中で.babelrc

{
  "presets": ["@babel/preset-env"]
}

@ghanbariコメントのおかげで回答が更新され、Babel 7が適用されます。


8
彼の質問はバベルの説明についてではありません。では、なぜ他の人を混乱させる可能性のある必要のないものに答えるべきなのでしょうか?
Jalal

7
@monstoこの質問は作成babel者によってすでにタグ付けされています。Phil Rickettsの回答は問題を明確にしますが、それは良いことですが、この回答は著者の問題を直接解決するものです。
ボイシー

"@ babel /
preset

6

デフォルトのJavaScriptモジュールエクスポートをそのまま使用できるので、現時点ではBabelを使用する必要はありません(JSは非常に強力になりました)。完全なチュートリアルを確認する

Message.js

module.exports = 'Hello world';

app.js

var msg = require('./Messages.js');

console.log(msg); // Hello World

2
では、クラスをどのようにエクスポートしますか?
SherwinAblañaDapito 19

1
質問は実際にはES6に対するものであり、NodeJSが使用するCommonJSではなかったので、私の回答を削除しました。回答は上記をご確認ください。
Alvin Konda、

@SherwinAblañaDapitomodule.exports = class MyClass {}機能
MarianKlühspies

3

babelパッケージ@babel/coreをインストールする@babel/presetと、ノードjsはES6ターゲットを直接理解できないため、ES6をcommonjsターゲットに変換します

npm install --save-dev @babel/core @babel/preset-env

次に.babelrc、プロジェクトのルートディレクトリに名前を付けて1つの構成ファイルを作成し、そこにこのコードを追加する必要があります

{ "presets": ["@babel/preset-env"] }


@ babel / registerもインストールする必要がありました。そうしないと、「SyntaxError:モジュールの外部でimportステートメントを使用できません」というメッセージが表示されます
分子式

3

エントリーポイントファイルをこんな風にして修正しました。

// index.js
require = require('esm')(module)
module.exports = require('./app.js')

そして、私がインポートしたファイルapp.jsimports/exports 動作するようになりましたnode index.js

注:をapp.js使用する場合export default、これrequire('./app.js').defaultはエントリポイントファイルを使用する場合になります。


1
babel、webpack、parcelなどを必要としない単純なプロジェクトの最良の回答...プロジェクト用の単純な/ server expressを使用したmonorepoプロジェクトで使用しました。魅力のように働いた...
mattdlockyer

-3

ES6構文を使用してもノードでは機能しません。残念ながら、エクスポートやインポートなどの構文をコンパイラーに認識させるには、明らかにbabelが必要です。

npm install babel-cli --save

次に、.babelrcファイルを作成する必要があります。babelrcファイルで、ES5にコンパイルするときにプリセットとしてインストールしたes2015プリセットを使用するようにbabelを設定します。

アプリのルートで、.babelrcファイルを作成します。$ npm install babel-preset-es2015 --save

アプリのルートで、.babelrcファイルを作成します。

{  "presets": ["es2015"] }

それがうまくいくことを願っています... :)

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