我有一个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",

当前回答

如果你正在使用ES6 JavaScript导入:

安装cross-env 在包中。将“test”:“jest”改为“test”:“cross-env NODE_OPTIONS=——experimental-vm-modules jest” 更多的包装。Json,添加这些:

    ...,
    "jest": {
        "transform": {}
    },
    "type": "module"

解释:

Cross-env允许在不更改NPM命令的情况下更改环境变量。接下来,在文件包中。你改变你的npm命令来启用实验性的ES6对Jest的支持,并配置Jest来做到这一点。

其他回答

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

例如,

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

Or

在babel.config.js

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

如果你想使用BABEL,我有一个简单的解决方案!

记住这是nodejs的例子:像一个expressJS服务器!

如果您打算使用react或其他框架,请查看babel文档!

首先,安装(不要安装不必要的东西,这只会破坏你的项目!)

npm install --save-dev @babel/core @babel/node

只有2个WAO

然后配置你的巴别塔文件在你的回购!

文件名称:

babel.config.json

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


如果你不想使用通天塔文件,使用:

在你的控制台运行,script.js是你的入口点!

npx babel-node --presets @babel/preset-env -- script.js

完整的信息在这里;https://babeljs.io/docs/en/babel-node

我是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) => {}"

要使用导入,请执行以下操作之一。

将.js文件重命名为.mjs 在包中。Json文件,添加{type:module}

我遇到了同样的问题,而且更糟糕:我同时需要“import”和“require”

一些较新的ES6模块只能使用导入。 一些CommonJS使用require。

以下是对我有效的方法:

把你的js文件转换成.mjs,就像其他答案中建议的那样 "require"在ES6模块中没有定义,所以你可以这样定义它: 从模块导入{createRequire} const require = createRequire(import.meta.url); 现在'require'可以用在通常的情况下。 对于ES6模块使用import,对于CommonJS使用require。

一些有用的链接:Node.js自己的文档。import和require的区别。Mozilla有一些关于导入的很好的文档