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

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个回答

0
如果您正在运行Node.js版本12的nodemon,请使用以下命令。 server.jspackage.json文件中的“主要”文件,请将其替换为package.json文件中相应的文件。
nodemon --experimental-modules server.js

这个标志似乎已经从最新版本中删除了。 - joe

0
在我的情况下,我使用了swc命令进行转译,问题是缺少了.wscrc文件。由于缺少这个文件,它没有被转译,所以出现了错误。
我的解决方案:
- 在package.json中添加转译命令: ``` "dist": "swc src -d dist --source-maps --copy-files", ```
- 添加.wscrc配置文件。
{
   "jsc": {
     "parser": {
       "syntax": "typescript",
       "tsx": false,
       "dynamicImport": true,
       "decorators": true
     },
     "transform": {
       "legacyDecorator": true,
       "decoratorMetadata": true
     },
     "target": "es2020",
     "externalHelpers": false,
     "keepClassNames": true,
     "loose": false,
     "minify": {
       "compress": false,
       "mangle": false
     },
     "baseUrl": "src",
     "paths": {
       "@/*": ["*"]
     }
   },
   "module": {
     "type": "commonjs"
   }
 }

希望对你有所帮助!

-1
"module": "esnext" 删除,并确保其中包含 "moduleResolution": "node",这个特定的组合对我有用。

-1

我在一个初创的Express API项目中遇到了这个问题。

有问题的服务器代码位于src/server/server.js文件中:

import express from 'express';
import {initialDonationItems, initialExpenditureItems} from "./DemoData";

const server = express();

server.get('/api/expenditures', (req, res) => {
  res.type('json');
  res.send(initialExpenditureItems);
});

server.get('/api/donations', (req, res) => {
  res.type('json');
  res.send(initialDonationItems);
});

server.listen(4242, () => console.log('Server is running...'));

这是我的依赖项:

{
  "name": "contributor-api",
  "version": "0.0.1",
  "description": "A Node backend to provide storage services",
  "scripts": {
    "dev-server": "nodemon --exec babel-node src/server/server.js --ignore dist/",
    "test": "jest tests"
  },
  "license": "ISC",
  "dependencies": {
    "@babel/core": "^7.9.6",
    "@babel/node": "^7.8.7",
    "babel-loader": "^8.1.0",
    "express": "^4.17.1",
    "mysql2": "^2.1.0",
    "sequelize": "^5.21.7",
    "sequelize-cli": "^5.5.1"
  },
  "devDependencies": {
    "jest": "^25.5.4",
    "nodemon": "^2.0.3"
  }
}

这里是抛出错误的运行程序:

nodemon --exec babel-node src/server/server.js --ignore dist

这很令人沮丧,因为我有一个类似的Express项目,它运行良好。
解决方案首先是添加此依赖项:
npm install @babel/preset-env

然后在项目根目录中使用 babel.config.js 进行连接:

module.exports = {
  presets: ['@babel/preset-env'],
};

我并不完全明白这为什么能起作用,但我从权威来源复制了它,所以我很乐意坚持使用它。


是的,我的问题在于代码有很多预设,我总是无法平衡我想要的和我不想要/会破坏东西的事物。 - user3810626
我一整天都在处理令人困惑的JS崩溃@user3810626 - 我怀疑我的问题是因为我对这种语言和生态系统还很陌生,我需要暂时放下一些学习来让事情正常运转。正在努力中... :-) - halfer
2
祝你好运!外面是个丛林!(我的意思是,字面上,JS生态系统就像一个丛林...) - user3810626
2
@user3810626 Node.js开发者不再知道事情是如何工作的了。他们只是不断尝试解决方案,直到有些东西能够奏效。 - hjpotter92
这在某些社区似乎比其他社区更为真实。 - user3810626

-5

我遇到了相同的问题,我在我的Nodejs应用程序中复制了导入语句。我通过使用require而不是import来解决了这个问题。


-9

只需将其更改为:

const uuidv1 = require('uuid');

它会正常工作。


请提供需要翻译的具体内容,以便我能够为您提供准确的翻译。 - Willian

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