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


52

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

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

当我运行它时,出现错误“ SyntaxError:无法在模块外部使用import语句”。首先,我尝试做一些事情以说服TPTB *,这是一个模块(没有成功)。因此,我将“导入”更改为“需要”,并且此方法可行。

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

*我确定问题的根源在于,我甚至不确定该问题的根源。我以为是Babel 7(因为我来自Babel 6,所以我不得不更改预设),但我不确定100%。

我为解决方案找到的大多数内容似乎不适用于纯Node。像这里这样:

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

1
嗨,现在有同样的问题。您还可以分享您的依赖吗?甚至在更新前后都可能有所不同。我可以检查一下我是否可以找到可能引起麻烦的类似软件包。
lynx

我只是用“ requires”替换了所有“ imports”,现在一切都很好。傻瓜,但现在不值得花点时间解决。不过,我将使用依赖项更新原始文件。如果您有任何潜在客户,我都会根据我的原始代码进行检查。
user3810626

1
CommonJS语法(require和module.exports)是节点的原始格式,而webpack也支持它,但是ES6模块语法(导出,导入)是较新的方法,现在节点和webpack支持它。我读到该节点现在支持导入,但是许多教程显示对纯节点的需求,因此最好对该节点使用该语法。
泰德·菲茨帕特里克

1
最后,对我来说,解决方法似乎是这样:github.com/vuejs/vue-jest/issues/134#issuecomment-461755061 将预设设置jest.config.js'ts-jest/presets/js-with-ts'-仍然有其他问题,但这解决了大问题。.....恩,我的问题是与测试相关的...正常的构建还不错
lynx

x,有趣。我自己不使用Jest。泰德,有趣。好吧,我不会流汗。
user3810626

Answers:


50

2020更新(节点13.2.0+)

验证您是否安装了最新版本的Node。该--experimental-modules标志不再是必需的。只需执行以下操作之一

  • 添加"type": "module"到最近的父级package.json。这样,所有.js.mjs文件都被解释为ES模块。您可以使用.cjs扩展名将单个文件解释为CommonJS 。

要么

  • .mjs扩展名明确命名文件。所有其他文件,例如.js将被解释为CommonJS,如果type未在中定义,则为默认文件package.json

如果使用此方法,则更改路径以在所需文件中包含“ js”,然后更改所需文件中的export语句的格式,然后将我从“ import”更改为的所有“ require”语句-因为现在“ require”是未知的-这将起作用,所以我将接受此答案。
user3810626

2
如果问题出在node_modules /下,这不是真正的选择吗?有什么想法在这种情况下如何解决?
特伦特·必应


6

我遇到了同样的问题,以下已解决(使用节点12.13.1):

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

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


0

我在刚刚起步的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项目根目录中的a 将其连接:

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

我不完全理解为什么这样做,但是我从权威来源复制了它,因此我很乐意坚持。


-2
  1. 当我开始使用babel时,我遇到了同样的问题。但是后来,我有了一个解决方案……到目前为止,我再也没有这个问题了……目前,Node v12.14.1,“ @ babel / node” :“ ^ 7.8.4”,我使用babel-node和nodemon来执行(node也很好。)
  2. package.json: “开始”:“ nodemon --exec babel-node server.js”“调试”:“ babel-node调试server.js” !!注:server.js是我的输入文件,您可以使用它。
  3. launch.json调试时,还需要配置launch.json文件“ runtimeExecutable”:“ $ {workspaceRoot} /node_modules/.bin/babel-node” !!注意:在配置中加上runtimeExecutable。
  4. 当然,对于babel-node,通常还需要并编辑另一个文件,例如babel.config.js / .babelrc文件。

-2

我的解决方案是在运行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)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.