语法错误:无法在模块外部使用 import 语句

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

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

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

SyntaxError: Cannot use import statement outside a module

首先,我尝试做一些事情来说服TPTB*这是一个模块(没有成功)。所以我把“导入”改成了“要求”,这很有效。

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

*我确定我问题的根源是我甚至不确定是什么在抱怨这个问题。我以为是巴别7(因为我来自巴别6,我不得不改变预设),但我不是100%确定。

我发现的大多数解决方案似乎都不适用于直Node。就像这里这样:

ES6 模块导入给出“未捕获的语法错误:意外标识符”

说它是通过添加“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",

答案 1

验证您是否安装了最新版本的 Node.js(或至少安装了 13.2.0+)。然后执行下列操作之一,如文档中所述

备选案文1

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

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

备选案文2

使用扩展名显式命名文件。所有其他文件,例如将被解释为 CommonJS,如果未在 中定义,则为默认值。.mjs.jstypepackage.json


答案 2

如果有人在使用TypeScript时遇到这个问题,那么对我来说解决这个问题的关键是改变

    "target": "esnext",
    "module": "esnext",

    "target": "esnext",
    "module": "commonjs",

在我的.我的印象是“”是“最好的”,但这只是一个错误。tsconfig.jsonesnext