web-dev-qa-db-ja.com

Node.js - SyntaxError:予期しないトークンのインポート

何が悪いのかわかりません。ノードv5.6.0 NPM v3.10.6

コード:

function (exports, require, module, __filename, __dirname) {
    import express from 'express'
};

エラー:

SyntaxError: Unexpected token import
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:387:25)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Function.Module.runMain (module.js:447:10)
    at startup (node.js:140:18)
    at node.js:1001:3
313
SofDroid

更新: In ノード9 、フラグの後ろで有効になっており、.mjs拡張子を使用します。

node --experimental-modules my-app.mjs

importは確かにES6の一部ですが、残念ながらNodeJSではデフォルトでまだサポートされておらず、ごく最近になってブラウザでサポートされるようになりました。

MDNのブラウザ互換表 および このノードの問題 を参照してください。

James M Snellの Node.jsのES6モジュールの更新から (February 2017):

作業は進行中ですが、しばらく時間がかかります - 現在少なくとも1年前後を見ています。

サポートがネイティブに現れるまで、あなたは伝統的なrequireステートメントを使い続ける必要があります:

const express = require("express");

NodeJSで新しいES6/7機能を本当に使用したい場合は、Babelを使用してそれをコンパイルできます。 これはサーバーの例です

357
Scimonster

残念ながら、Node.jsはES6のimportをまだサポートしていません。

あなたがやろうとしていること(Expressモジュールをインポートすること)を達成するためには、このコードで十分なはずです。

var express = require("express");

また、次のコマンドを実行してExpressがインストールされていることを確認してください。

$ npm install express

Node.jsの学習の詳細については、 Node.js Docs を参照してください。

48
baranskistad

エラー: SyntaxError:予期しないトークン import またはSyntaxError:予期しないトークン export


解決策: 例としてすべてのインポートを変更する

const express                               = require('express');
const webpack                           = require('webpack');
const path                              = require('path');
const config                            = require('../webpack.config.dev');
const open                              = require('open');

また、export default = foo;module.exports = foo;に変更してください。

29
supritshah1289

他の回答で述べたように、Node JSは現在ES6インポートをサポートしていません

(今のところ、EDIT 2を読んでください)

ノードjsでES6のインポートを有効にする この問題の解決策を提供します。私はこれに疲れました、そしてそれは私のために働きました。

コマンドを実行します。

    npm install babel-register babel-preset-env --save-dev

今度は新しいファイル(config.js)を作成し、それに以下のコードを追加する必要があります。

    require('babel-register')({
        presets: [ 'env' ]
    })
    // Import the rest of our application.
    module.exports = require('./your_server_file.js')

これで、エラーを発生させることなくimport文を書くことができます。

お役に立てれば。

編集:

上記のコードで作成した新しいファイルを実行する必要があります。私の場合はconfig.jsでした。だから私は実行する必要があります。

    node config.js

編集2:

実験中に、この問題に対する簡単な解決策が1つ見つかりました。

プロジェクトのルートに.babelrcファイルを作成します。

以下を追加してください(そして、あなたが必要とする他のどんなbabelプリセットもこのファイルに追加することができます):

    {
        "presets": ["env"]
    }

コマンドbabel-preset-envを使用してnpm install babel-preset-env --saveをインストールしてから、コマンドbabel-cliを使用してnpm install babel-cli -g --saveをインストールします。

それでは、サーバーまたはインデックスファイルが存在するフォルダに行き、次を使って実行してください。babel-node fileName.js

npm startファイルに次のコードを追加して、package.jsonを使用して実行することもできます。

    "scripts": {
        "start": "babel-node src/index.js"
    }
16
Nirali Acharya

'babel'を使用できる場合は、以下のようにpackage.json( - presets = es2015)にビルドスクリプトを追加してください。インポートコードをes2015にプリコンパイルします

"build": "babel server --out-dir build --presets=es2015 && webpack"
8
ASTOMUSIC

それでも「import」を使用できない場合は、次のように処理します。単にノードフレンドリーなrequireに変換します。例:

import { parse } from 'node-html-parser';

と同じです:

const parse = require('node-html-parser').parse;
5
Alberto

Node.js v12の時点で(これはおそらくかなり安定していますが、まだ「実験的」とマークされています)、ESMを使用するためのオプションがいくつかあります(ECMAScriptModules) Node.jsで(ファイルの場合、文字列を評価する3番目の方法があります)、ここに ドキュメント があります:

--experimental-modulesフラグを使用して、ECMAScriptモジュール(ESモジュール)のサポートを有効にすることができます。

有効にすると、Node.jsは、初期入力としてnodeに渡されたとき、またはESモジュールコード内のimportステートメントによって参照されたときに、以下をESモジュールとして扱います。

  • .mjsで終わるファイル。

  • .jsで終わるファイル、または拡張子のないファイル。最も近い親package.jsonファイルに、値が"type"のトップレベルフィールド"module"が含まれる場合。

  • --evalまたは--printの引数として渡される文字列、またはフラグ--input-type=moduleを使用して、nodeを介してSTDINにパイプされます。

Node.jsは、最も近い親.jsファイルにトップレベルのpackage.jsonフィールドが含まれていない"type"ファイルや、フラグ--input-typeのない文字列入力など、他のすべての形式の入力をCommonJSとして扱います。この動作は、下位互換性を維持するためです。ただし、Node.jsはCommonJSとESモジュールの両方をサポートするようになったため、可能な限り明示的にするのが最善です。 Node.jsは、初期入力としてnodeに渡された場合、またはESモジュールコード内のimportステートメントによって参照された場合、CommonJSとして以下を処理します。

  • .cjsで終わるファイル。

  • .jsで終わるファイル、または拡張子のないファイル。最も近い親package.jsonファイルに、値が"type"のトップレベルフィールド"commonjs"が含まれる場合。

  • --evalまたは--printの引数として渡される文字列、またはフラグ--input-type=commonjsを使用して、nodeを介してSTDINにパイプされます。

2
T.J. Crowder

私の場合、それは.babelrcファイルの面倒を見ていました、そしてそれはこのような何かを含むべきです:

{
  "presets": ["es2015-node5", "stage-3"],
  "plugins": []
}
1
Ghita Tomoiaga

babel 7の提案 devの依存関係を追加できますか

npm i -D @babel/core @babel/preset-env @babel-register

そしてルートに.babelrcを追加します。

{
"presets": [
  [
    "@babel/preset-env",
    {
      "targets": {
        "node": "current"
     }
    }
  ]
 ]
}

そして.jsファイルに追加します。

require("@babel/register")
0
Jason Ashley