语法错误:无法在模块外部使用导入语句。

639

我有一个 ApolloServer 项目出了些问题,所以我想更新它,并在使用最新的 Babel 时遇到了一些问题。我的 "index.js" 文件如下:

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

当我运行它时,我收到了错误信息:

SyntaxError: Cannot use import statement outside a module

首先,我尝试了一些方法来说服TPTB*这是一个模块(但没有成功)。所以我把"import"改成了"require",这样就可以了。

但现在我有大约两打其他文件中的"imports"也给我同样的错误。

*我确定我的问题的根源是我甚至不知道是什么在抱怨这个问题。我有点假设它是Babel 7(因为我从Babel 6过来,我必须改变预设),但我不是100%确定。

我找到的大部分解决方案似乎都不适用于纯Node。就像这个:

ES6 module Import giving "Uncaught SyntaxError: Unexpected identifier"

说通过添加"type=module"来解决,但这通常会放在HTML中,而我没有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",

3
你好,我现在遇到了同样的问题。你能否分享一下你的依赖关系?或者甚至提供一下你更新前后的差异。这样我就可以检查一下我的依赖关系,看是否存在可能引起问题的类似软件包。 - stewo
6
我刚刚将所有的“imports”替换为“requires”,现在一切都很好了。虽然有点傻,但目前没必要费力去弄明白它。不过我会更新原来的代码,并加入依赖项。如果你有任何线索,我会与我的原始代码进行核对。 - user3810626
4
CommonJS语法(require和module.exports)是Node的原始格式,Webpack也支持它,但ES6模块语法(export,import)是较新的方式,现在Node和Webpack都支持它。我看到Node现在也支持import,但许多教程仍旧展示require用于纯Node内容,因此在Node中最好使用那个语法。 - Ted Fitzpatrick
8
"type":"module"并不能解决我的问题,而且有超过一百个importsrequire的语法与imports不同,不是很容易替换。你能否给出一个将imports替换为requires的示例? - Jeb50
权力的巨头:这是一种(略微)滑稽的说法,意味着“我不知道这件事在哪里被决定”。 - user3810626
显示剩余6条评论
36个回答

1

1
为了使您的导入工作正常,并避免其他问题,例如模块在Node.js中无法工作,只需注意以下内容:
使用ES6模块时,您尚不能导入目录。您的导入应该像这样:
import fs from './../node_modules/file-system/file-system.js'

1

当我运行迁移时,出现了这个问题。

这是es5与es6的问题。

以下是我的解决方法:

我运行

npm install @babel/register

并添加

require("@babel/register")

在我的.sequelizerc文件顶部, 我继续运行我的sequelize迁移。 这适用于sequelize之外的其他事情。
Babel执行转译。

1

只需添加--presets '@babel/preset-env'

例如,

babel-node --trace-deprecation --presets '@babel/preset-env' ./yourscript.js

在`babel.config.js`中。
module.exports = {
  presets: ['@babel/preset-env'],
};

0
我在开始使用Babel时遇到了同样的问题...但后来,我找到了解决办法...到目前为止,我再也没有遇到这个问题了...当前使用的是Node.js v12.14.1,"@babel/node": "^7.8.4",我使用babel-node和nodemon来执行(Node.js也可以)。 package.json: "start": "nodemon --exec babel-node server.js "debug": "babel-node debug server.js"!! 注意:server.js是我的入口文件,你可以使用你自己的。 launch.json。当你调试时,你还需要配置你的launch.json文件 "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/babel-node"!! 注意:将runtimeExecutable添加到配置中。
当然,使用babel-node,你通常还需要编辑另一个文件,比如babel.config.js/.babelrc文件。

0

我最近遇到了这个问题。对我有用的解决方法是在插件部分的文件babel.config.json中添加以下内容:

["@babel/plugin-transform-modules-commonjs", {
    "allowTopLevelThis": true,
    "loose": true,
    "lazy": true
  }],

我有一个带有 // 的导入模块,并显示错误“无法在模块外使用导入”。


0

当我使用sequelize迁移时,通过npx sequelize db:migrate命令,我遇到了这个错误,我的解决方案是在.sequelizerc文件中添加以下代码行:require('@babel/register');,如下图所示:

Enter image description here

请注意,您必须安装Babel和Babel register


请查看 *为什么在提问时不上传代码/错误的图片?(例如,"图片应该只用于说明无法以其他方式清晰表达的问题,例如提供用户界面的截图。"*)并做正确的事情(它也涵盖了答案)。提前致谢。 - Peter Mortensen

0
如果您正在使用Node,您应该参考这个文档。只需在您的Node应用程序中设置Babel,它就可以工作,而且对我也有效。
npm install --save-dev @babel/cli @babel/core @babel/preset-env

这对我没有起作用。 - B2K

0
我的解决方案是在运行nodemon时包含babel-node路径,如下所示:

nodemon node_modules/.bin/babel-node index.js

你可以在你的 package.json 文件中添加以下脚本:
debug: nodemon node_modules/.bin/babel-node index.js

注意:我的入口文件是index.js。请用你的入口文件替换它(很多人使用app.js/server.js)。


0

JavaScript模块文件的MIME类型错误

问题的常见来源是服务器、客户端或处理/传递这些文件的ECMAScript引擎未将“模块”类型的JavaScript文件的MIME类型识别为“模块”类型。

问题在于,Module JavaScript文件的开发人员错误地将模块与新的“.mjs”(.js)扩展名相关联,但随后将其分配给了MIME类型服务器类型“text/javascript”。这意味着.js和.mjs类型是相同的。实际上,.js JavaScript文件的新类型也已更改为“application/javascript”,进一步混淆了问题。因此,在开发中的任何Node.js或Babel文件处理系统中,都无法识别Module JavaScript文件。

主要问题是大多数服务器或客户端(现代HTML5浏览器)尚未了解这种新的JavaScript“模块”子类型。换句话说,它们无法知道模块文件类型除了JavaScript类型之外的真正含义!

因此,您会得到您发布的响应,其中JavaScript引擎表示需要知道文件是否为JavaScript模块文件类型。

唯一的解决方法,无论是服务器还是客户端,都是更改您的服务器或浏览器以提供触发ES6支持的模块文件的新Mime类型,其具有.mjs扩展名。现在,唯一的方法是在服务器上创建一个HTTP内容类型为"module"的任何带有.mjs扩展名的文件,并将模块JavaScript文件的文件扩展名更改为".mjs",或者在您使用下载外部.js JavaScript模块文件的任何外部<script>元素中添加type="module"的HTML脚本标记。
一旦您欺骗浏览器或JavaScript引擎接受新的模块文件类型,它们将开始在您使用的JS引擎或Node.js系统中执行它们的脚本马戏团表演。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接