我有一个ApolloServer项目,它给我带来了麻烦,所以我想我可能会更新它,但在使用最新的Babel时遇到了问题。我的index.js是:

require('dotenv').config()
import {startServer} from './server'
startServer()

当我运行它时,我得到了错误

SyntaxError: Cannot use import statement outside a module

首先,我试图说服TPTB*这是一个模块(没有成功)。所以我把“import”改成了“require”,这就成功了。

但现在我在其他文件中有大约24个“导入”给我同样的错误。

*我敢肯定我问题的根源是我甚至不知道抱怨的是什么。我有点假设它是巴别塔7(因为我来自巴别塔6,我不得不改变预设),但我不是100%确定。

我发现的大多数解决方案似乎并不适用于直节点。比如这个:

ES6模块导入给出“未捕获SyntaxError:意外标识符”

说它是通过添加“type=module”来解决的,但这通常会在HTML中,其中我没有。我也尝试使用我的项目的旧预设:

"presets": ["es2015", "stage-2"],
"plugins": []

但这又给了我另一个错误:“错误:插件/预设文件不允许导出对象,只能导出函数。”

以下是我开始时的依赖关系:

"dependencies": {
"@babel/polyfill": "^7.6.0",
"apollo-link-error": "^1.1.12",
"apollo-link-http": "^1.5.16",
"apollo-server": "^2.9.6",
"babel-preset-es2015": "^6.24.1",

当前回答

验证您已经安装了Node.js的最新版本(或至少13.2.0+)。然后按照文档中的描述,执行以下操作之一:

选项1

在最近的父包中。Json文件,添加顶级的“type”字段,值为“module”。这将确保所有.js和.mjs文件都被解释为ES模块。您可以使用.cjs扩展名将单个文件解释为CommonJS。

// package.json
{
  "type": "module"
}

选项2

显式地以.mjs扩展名命名文件。所有其他文件,如.js将被解释为CommonJS,如果package.json中没有定义type,则CommonJS是默认值。

其他回答

首先,我们将安装 @babel/cli、@babel/core 和 @babel/preset-env:

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

然后我们将创建一个.babelrc文件来配置Babel:

touch .babelrc

这将承载我们可能想要配置Babel的任何选项:

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

随着Babel最近的变化,你需要在Node.js运行ES6之前编译它。

我们将在package.json文件中添加第一个脚本build。

"scripts": {
  "build": "babel index.js -d dist"
}

然后我们将在package.json文件中添加开始脚本。

"scripts": {
  "build": "babel index.js -d dist", // replace index.js with your filename
  "start": "npm run build && node dist/index.js"
}

现在让我们启动服务器。

npm start

步骤1

yarn add esm

or

npm i esm --save

步骤2

package.json

  "scripts": {
    "start": "node -r esm src/index.js",
  }

步骤3

nodemon --exec npm start

节点v14.16.0 对于那些尝试过。mjs的人来说:

Aviator@AW:/mnt/c/Users/Adrian/Desktop/Programming/nodejs_ex$ node just_js.mjs
file:///mnt/c/Users/Adrian/Desktop/Programming/nodejs_ex/just_js.mjs:3
import fetch from "node-fetch";
       ^^^^^

SyntaxError: Unexpected identifier

谁试过从"node-fetch"导入取回; 谁试过const fetch = require('node-fetch');

Aviator@AW:/mnt/c/Users/Adrian/Desktop/Programming/nodejs_ex$ node just_js.js
(node:4899) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/mnt/c/Users/Adrian/Desktop/Programming/nodejs_ex/just_js.js:3
import fetch from "node-fetch";
^^^^^^

SyntaxError: Cannot use import statement outside a module  

那些尝试过"type": "module"来打包的人。Json,但继续看到错误,

{
  "name": "test",
  "version": "1.0.0",
  "description": "to get fetch working",
  "main": "just_js.js",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "MIT"
}

我可以毫无问题地切换到axios。

从'axios'导入axios;<——置于文件顶部。 例子:

axios.get('https://www.w3schools.com/xml/note.xml').then(resp => {

    console.log(resp.data);
});

我也有同样的问题,下面已经修复了它(使用Node.js 12.13.1):

将.js文件扩展名更改为.mjs 在运行应用程序时添加——experimental-modules标志。 可选:在package.json中添加"type": "module"

更多信息:https://nodejs.org/api/esm.html

验证您已经安装了Node.js的最新版本(或至少13.2.0+)。然后按照文档中的描述,执行以下操作之一:

选项1

在最近的父包中。Json文件,添加顶级的“type”字段,值为“module”。这将确保所有.js和.mjs文件都被解释为ES模块。您可以使用.cjs扩展名将单个文件解释为CommonJS。

// package.json
{
  "type": "module"
}

选项2

显式地以.mjs扩展名命名文件。所有其他文件,如.js将被解释为CommonJS,如果package.json中没有定义type,则CommonJS是默认值。