SyntaxError: 不能在模块外使用 import 语句

新手上路,请多包涵

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

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

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

SyntaxError: Cannot use import statement outside a module

首先,我试图说服 TPTB* 这是一个模块(没有成功)。所以我将“ import ”更改为“ require ”,这很有效。

但是现在我在其他文件中有大约两打“ 导入”,给了我同样的错误。

*我确定我的问题的根源是我什至不确定是什么在抱怨这个问题。我有点假设它是 Babel 7(因为我来自 Babel 6,我不得不更改预设)但我不是 100% 确定。

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

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",

原文由 user3810626 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.7k
2 个回答

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

选项1

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

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

选项 2

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

原文由 jabacchetta 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

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

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

原文由 Dr-Bracket 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题