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

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

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

SyntaxError: Cannot use import statement outside a module

首先,我试图说服TPTB*这是一个模块(没有成功)。所以我把“import”改成了“require”,这就成功了。

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

*我敢肯定我问题的根源是我甚至不知道抱怨的是什么。我有点假设它是巴别塔7(因为我来自巴别塔6,我不得不改变预设),但我不是100%确定。

我发现的大多数解决方案似乎并不适用于直节点。比如这个:

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

当前回答

我是Node.js的新手,我在修复AWS Lambda函数(使用Node.js)时遇到了同样的问题。

我发现了CommonJS和ES6 JavaScript之间的一些差异:

ES6:

在包中添加"type":"module"。json文件 使用“import”从库中使用。 例如:从jwt-decode导入jwt_decode Lambda处理程序方法代码应该这样定义 “出口。Handler = async (event) => {}"

CommonJS:

不要在包中添加"type":"module"。json文件 使用“require”从lib中使用。 示例:const jwt_decode = require("jwt-decode"); lambda处理程序方法代码应该像这样定义: "export const handler = async (event) => {}"

其他回答

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

请注意,您必须安装通天塔和通天塔寄存器。

首先,我们将安装 @babel/cli、@babel/core 和 @babel/preset-env:

npm install --save-dev @babel/cli @babel/core @babel/preset-env

然后我们将创建一个.babelrc文件来配置Babel:

touch .babelrc

这将承载我们可能想要配置Babel的任何选项:

{
  "presets": ["@babel/preset-env"]
}

随着Babel最近的变化,你需要在Node.js运行ES6之前编译它。

我们将在package.json文件中添加第一个脚本build。

"scripts": {
  "build": "babel index.js -d dist"
}

然后我们将在package.json文件中添加开始脚本。

"scripts": {
  "build": "babel index.js -d dist", // replace index.js with your filename
  "start": "npm run build && node dist/index.js"
}

现在让我们启动服务器。

npm start

我在一个刚刚起步的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'],
};

我不完全明白为什么这是可行的,但我是从权威来源复制的,所以我很高兴坚持下去。

为了让你的导入工作并避免其他问题,比如模块不能在Node.js中工作,请注意:

在ES6模块中,你还不能导入目录。你的导入应该是这样的:

import fs from './../node_modules/file-system/file-system.js'

我最近遇到了这个问题。对我有效的修复是将此添加到插件部分的babel.config.json文件中:

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

我有一些导入模块与//和错误“不能使用导入模块外”。