何が悪いのかわかりません。ノード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
更新: 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を使用してそれをコンパイルできます。 これはサーバーの例です 。
残念ながら、Node.jsはES6のimport
をまだサポートしていません。
あなたがやろうとしていること(Expressモジュールをインポートすること)を達成するためには、このコードで十分なはずです。
var express = require("express");
また、次のコマンドを実行してExpressがインストールされていることを確認してください。
$ npm install express
Node.jsの学習の詳細については、 Node.js Docs を参照してください。
エラー: 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;
に変更してください。
他の回答で述べたように、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"
}
'babel'を使用できる場合は、以下のようにpackage.json( - presets = es2015)にビルドスクリプトを追加してください。インポートコードをes2015にプリコンパイルします
"build": "babel server --out-dir build --presets=es2015 && webpack"
それでも「import」を使用できない場合は、次のように処理します。単にノードフレンドリーなrequireに変換します。例:
import { parse } from 'node-html-parser';
と同じです:
const parse = require('node-html-parser').parse;
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
または--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
または--input-type=commonjs
を使用して、node
を介してSTDIN
にパイプされます。
私の場合、それは.babelrc
ファイルの面倒を見ていました、そしてそれはこのような何かを含むべきです:
{
"presets": ["es2015-node5", "stage-3"],
"plugins": []
}
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")