Node.js - SyntaxError: Unexpected token import
我不明白出了什么问题。
节点v5.6.0
NPM v3.10.6
代码:
1 2 3 | function (exports, require, module, __filename, __dirname) { import express from 'express' }; |
错误:
1 2 3 4 5 6 7 8 9 | 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 |
更新:在节点9中,它在标志后面启用,并使用
1 | node --experimental-modules my-app.mjs |
虽然
请参阅MDN上的浏览器compat表和此Node问题。
来自James M Snell对Node.js中ES6模块的更新(2017年2月):
Work is in progress but it is going to take some time?—?We’re currently looking at around a year at least.
在支持本地显示之前,您必须继续使用经典的
1 | const express = require("express"); |
如果您真的想在NodeJS中使用新的ES6 / 7功能,可以使用Babel进行编译。这是一个示例服务器。
不幸的是,Node.js还不支持ES6的
要完成您要执行的操作(导入Express模块??),此代码应该足够了
1 | var express = require("express"); |
另外,请确保通过运行安装了Express
1 | $ npm install express |
有关学习Node.js的更多信息,请参阅Node.js文档。
错误:SyntaxError:意外的令牌导入或SyntaxError:意外的令牌导出
解决方案:将所有导入更改为示例
1 2 3 4 5 | const express = require('express'); const webpack = require('webpack'); const path = require('path'); const config = require('../webpack.config.dev'); const open = require('open'); |
并将
正如其他答案中所提到的,Node JS目前不支持ES6导入
(截至目前,阅读编辑2)
在节点js中启用ES6导入可提供此问题的解决方案。我已经厌倦了,这对我有用。
运行命令:
1 | npm install babel-register babel-preset-env --save-dev |
现在您需要创建一个新文件(config.js)并将以下代码添加到其中。
1 2 3 4 5 | require('babel-register')({ presets: [ 'env' ] }) // Import the rest of our application. module.exports = require('./your_server_file.js') |
现在您可以编写import语句而不会出现任何错误。
希望这可以帮助。
编辑:
您需要运行使用上面的代码创建的新文件。就我而言,它是
1 | node config.js |
编辑2:
在进行实验时,我发现了一个简单的解决方案。
在项目的根目录中创建
添加以下(以及您需要的任何其他babel预设,可以添加到此文件中):
1 2 3 | { "presets": ["env"] } |
使用命令
现在,转到存在服务器或索引文件的文件夹并使用以下命令运行:
babel-node fileName.js
或者,您可以通过将以下代码添加到
1 2 3 | "scripts": { "start":"babel-node src/index.js" } |
如果您仍然无法使用"导入",我的处理方式如下:
只需将其转换为节点友好的要求。例:
1 | import { parse } from 'node-html-parser'; |
是相同的:
1 | const parse = require('node-html-parser').parse; |
如果您可以使用'babel',请尝试在package.json( - presets = es2015)中添加构建脚本,如下所示。它使预编译导入代码到es2015
1 | "build":"babel server --out-dir build --presets=es2015 && webpack" |
巴贝尔7提案
你可以添加开发依赖项吗?
1 | npm i -D @babel/core @babel/preset-env @babel/register |
并在根目录中添加.babelrc
1 2 3 4 5 6 7 8 9 10 11 12 | { "presets": [ [ "@babel/preset-env", { "targets": { "node":"current" } } ] ] } |
并添加到.js文件
1 | require("@babel/register") |
或者如果你在cli中运行它,你可以使用require钩子作为-r @ babel / register,ex。
1 | $node -r @babel/register executeMyFileWithESModules.js |
在我的情况下,它正在寻找
1 2 3 4 | { "presets": ["es2015-node5","stage-3"], "plugins": [] } |
从Node.js v12开始(这可能现在相当稳定,但仍然标记为"实验性"),在Node.js中有几个使用ESM(ECMAScript模块)的选项(对于文件,还有第三种评估方式)字符串),这是文档说的内容:
The
--experimental-modules flag can be used to enable support for
ECMAScript modules (ES modules).Once enabled, Node.js will treat the following as ES modules when passed to
node as the initial input, or when referenced byimport statements within
ES module code:
Files ending in
.mjs .Files ending in
.js , or extensionless files, when the nearest parent
package.json file contains a top-level field"type" with a value of
"module" .Strings passed in as an argument to
--eval or
node viaSTDIN , with the flag--input-type=module .Node.js will treat as CommonJS all other forms of input, such as
.js files
where the nearest parentpackage.json file contains no top-level"type"
field, or string input without the flag--input-type . This behavior is to
preserve backward compatibility. However, now that Node.js supports both
CommonJS and ES modules, it is best to be explicit whenever possible. Node.js
will treat the following as CommonJS when passed tonode as the initial input,
or when referenced byimport statements within ES module code:
Files ending in
.cjs .Files ending in
.js , or extensionless files, when the nearest parent
package.json file contains a top-level field"type" with a value of
"commonjs" .Strings passed in as an argument to
--eval or
node viaSTDIN , with the flag--input-type=commonjs .