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
ソリューション

Update 3: Node 13以降、拡張子を.mjsにするか、package.jsonで "type": "module" を設定することができます。また、 don't --experimental-modules フラグを使う必要はありません。

Update 2: Node 12からは、.mjsエクステンションを使うか、package.jsonに "type": "module"を設定することができるようになりました。また、nodeを実行する際には、--experimental-modulesというフラグを立てる必要があります。

Update: Node 9では、フラグの後ろで有効になっており、.mjsエクステンションを使用しています。

node --experimental-modules my-app.mjs

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

MDNのブラウザ対応表]2このNode問題を参照してください。

James M Snell'氏のUpdate on ES6 Modules in Node.js(2017年2月)より。

作業は進んでいますが、時間がかかりそうです - 現在、少なくとも1年程度はかかると考えています。

サポートがネイティブに登場するまでは、従来の require 文を使い続けなければなりません。

const express = require("express");

NodeJSの新しいES6/7の機能を本当に使いたいのであれば、Babelを使ってコンパイルすることができます。Here's an example serverを参照してください。

解説 (11)

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

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

var express = require("express");

また、Expressがインストールされていることを確認するために、以下を実行してください。

$ npm install express

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

解説 (5)

Error: 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; に変更します。

解説 (2)