不能在模块外部使用import语句

我有一个ApolloServer项目,给我的麻烦,所以我想我可能会更新它,并在使用最新的通天塔时遇到问题。我的“index.js"是:

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

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

SyntaxError: Cannot use import statement outside a module

首先,我试图说服TPTB*这是一个模块(没有成功)。所以我把&;__abc0 &;需要"这个方法奏效了。

但是现在我有大约两打“_;在其他文件中也出现了同样的错误。

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

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

ES6 module Import giving &;Uncaught SyntaxError: Unexpected identifier"

表示通过添加"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",
1185908 次浏览

根据官方文件:

import语句只允许在ES模块中使用。要了解CommonJS中的类似功能,请参见import()。

要使Node.js将你的文件作为ES模块处理,你需要(使能 . 使能):

  • 添加“type”:“module”;对package.json
  • 添加“——experimental-modules"标记到Node.js调用

我也有同样的问题,下面已经修复了它(使用Node.js 12.13.1):

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

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

验证您已经安装了Node.js的最新版本(或至少13.2.0+)。然后执行以下操作之一,如文档中有描述:

选项1

在最近的父文件package.json中,添加顶级的"type"字段,值为"module"。这将确保所有.js.mjs文件都被解释为ES模块。你可以通过使用.cjs扩展名将单个文件解释为CommonJS

// package.json
{
"type": "module"
}

选项2

显式地以.mjs扩展名命名文件。所有其他文件,如.js将被解释为CommonJS,如果package.json中没有定义type,则CommonJS是默认值。

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

    当我开始使用通天塔时,我也遇到了同样的问题……但后来,我 有个解决办法…到目前为止,我还没有遇到过这个问题。 目前,Node.js v12.14.1, "@babel/node": "^7.8.4",我使用babel-node和nodemon执行(Node.js也很好..)
  1. 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" ! !注:+
  2. . runtimeExecutable到配置
  3. 当然,使用babel-node,通常还需要编辑另一个文件,例如babel.config.js / .babelrc文件

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

我不完全明白为什么这个工作,但我从权威消息来源复制了它,所以我很高兴坚持下去。

我也遇到了同样的问题,而且情况更糟:我需要“import”和“import”;和“;require"

  1. 一些较新的ES6模块仅适用于进口
  2. 一些CommonJS需要一起工作。

以下是对我有效的方法:

  1. 将你的js文件转换成.mjs,就像在其他答案中建议的那样

  2. < p >“require"ES6模块没有定义它,所以你可以这样定义它:

    import { createRequire } from 'module'
    const require = createRequire(import.meta.url);
    

    现在'require'可以用在通常的情况下。

  3. ES6模块使用进口, CommonJS模块使用需要

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

对于那些和我一样在阅读答案时感到困惑的人,在你的包装中。Json文件,添加 "type": "module" 在上层如下所示:

{
"name": "my-app",
"version": "0.0.0",
"type": "module",
"scripts": { ...
},
...
}

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

例如,

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

babel.config.js

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

只需将其更改为:

const uuidv1 = require('uuid');

它会工作得很好。

如果有人遇到这个问题与打印稿,解决它的关键是为我改变

    "target": "esnext",
"module": "esnext",

    "target": "esnext",
"module": "commonjs",

在我的tsconfig.json。我的印象是“esnext"是“最好的”,但那只是一个错误。

步骤1

yarn add esm

npm i esm --save

步骤2

package.json

  "scripts": {
"start": "node -r esm src/index.js",
}

步骤3

nodemon --exec npm start

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

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

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

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

当您运行该命令时也会出现此错误

node filename.ts

而不是

node filename.js

简单地说,使用node命令,我们必须运行JavaScript文件(filename.js),而不是TypeScript文件,除非我们使用的是ts-node这样的包。

如果您正在为Node.js版本12运行nodemon,请使用此命令。

server.js是“主”;在package.json文件中,将其替换为package.json文件中的相关文件:

nodemon --experimental-modules server.js

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

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

我用//导入了一些模块,错误“不能在模块外部使用导入”。

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

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

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

我试了所有的方法,但都没用。

我从GitHub上得到了一个参考。

为了在Node.js中使用TypeScript导入,我安装了以下包。

1. npm i typescript --save-dev


2. npm i ts-node --save-dev

在package.json中不需要type: module

例如,

{
"name": "my-app",
"version": "0.0.1",
"description": "",
"scripts": {


},
"dependencies": {
"knex": "^0.16.3",
"pg": "^7.9.0",
"ts-node": "^8.1.0",
"typescript": "^3.3.4000"
}
}

对我来说。我认为问题出在标准的node可执行文件中。node target.ts

我用nodemon替换它,令人惊讶的是它竟然工作了!

使用标准可执行文件(runner)的方式:

node target.ts

使用nodemon可执行文件(runner)的方式:

nodemon target.ts

不要忘记使用npm install nodemon;P

请注意:这对开发来说是惊人的。但是,对于运行时,你可以用编译后的js文件执行node !

我在运行迁移时遇到了这个问题

这是es5 vs es6的问题

下面是我的解决方法

我跑

npm install @babel/register

并添加

require("@babel/register")

在我的.sequelizerc文件的顶部

然后继续运行我的sequelize migrate。 这适用于除了sequelize

之外的其他事情

巴别塔负责翻译

在包中。json写 { “type":“module" } < / p >

它解决了我的问题,我也有同样的问题

如果你正在使用node,你应该引用这个文档。只要在你的节点应用程序中设置babel,它就会工作,它为我工作。

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

节点v14.16.0
对于那些尝试过。mjs并得到:

Aviator@AW:/mnt/c/Users/Adrian/Desktop/Programming/nodejs_ex$ node just_js.mjs
file:///mnt/c/Users/Adrian/Desktop/Programming/nodejs_ex/just_js.mjs:3
import fetch from "node-fetch";
^^^^^


SyntaxError: Unexpected identifier

和谁已经尝试import fetch from "node-fetch";
以及谁已经尝试过const fetch = require('node-fetch');

Aviator@AW:/mnt/c/Users/Adrian/Desktop/Programming/nodejs_ex$ node just_js.js
(node:4899) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/mnt/c/Users/Adrian/Desktop/Programming/nodejs_ex/just_js.js:3
import fetch from "node-fetch";
^^^^^^


SyntaxError: Cannot use import statement outside a module

以及谁已经尝试"type": "module"包装。Json,但继续看到错误,

{
"name": "test",
"version": "1.0.0",
"description": "to get fetch working",
"main": "just_js.js",
"type": "module",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "MIT"
}

我可以毫无问题地切换到axios。

import axios from 'axios'; <——放在文件顶部。
例子:< / p >

axios.get('https://www.w3schools.com/xml/note.xml').then(resp => {


console.log(resp.data);
});

我有同样的问题,在我的Nodejs应用程序我复制了导入语句。我通过使用require而不是import来修复它。

在手动升级后,我的NX的工作区中出现了这个错误。以下变化在每个jest.config.js修复它:

transform: {
'^.+\\.(ts|js|html)$': 'jest-preset-angular',
},

transform: {
'^.+\\.(ts|mjs|js|html)$': 'jest-preset-angular',
},

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

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

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

第一个,安装(不要安装不必要的东西,只会浪费你的项目!)

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

只有2个WAO

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

example for express server node js and babel

文件名称:

babel.config.json

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


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

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

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

example babel without file .

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

对于由于Netlify函数中的此错误而进入此线程的人,即使在包中添加了"type": "module"。. json文件,更新你的netlify.toml使用'esbuild'。因为esbuild支持ES6,所以它可以工作。

[functions]
node_bundler = "esbuild"
< p >参考: https://docs.netlify.com/functions/build-with-javascript/#automated-dependency-bundling < / p >

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

  1. . js文件重命名为.mjs
  2. package.json文件中,添加{类型:模块}

取出"module": "esnext"并确保"moduleResolution": "node"在其中,这个特定的组合为我做了这件事

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

Enter image description here

注意你必须安装巴别塔和Babel 注册

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

  1. 安装cross-env
  2. package.json中将"test": "jest"更改为"test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest"
  3. package.json中添加更多:
    ...,
"jest": {
"transform": {}
},
"type": "module"

解释:

cross-env允许在不改变npm命令的情况下改变环境变量。接下来,在文件package.json中更改npm命令以启用实验性ES6对开玩笑的支持,并配置Jest来实现它。

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

我发现了CommonJSES6 JavaScript之间的一些差异:

< >强ES6: < / >强

  • < p >添加“type":“module"在package.json文件中

  • < p >使用“import"从lib中使用。

    例子: import jwt_decode from jwt-decode

  • Lambda处理程序方法代码应该像这样定义

    “出口。Handler = async (event) =>{},

< >强CommonJS: < / >强

  • 不要添加“;type”:“;module”;在package.json文件中

  • < p >使用“require"从lib中使用。

    例子: const jwt_decode = require("jwt-decode");

  • lambda处理程序方法代码应该像这样定义:

    export const handler = async (event) =>{},

文档很混乱。我使用Node.js在我的计算机上执行一些本地任务。

让我们假设我的旧脚本是. js在它的内部,如果我想使用

import something from "./mylocalECMAmodule";

它会抛出一个这样的错误:

(node:16012) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
SyntaxError: Cannot use import statement outside a module
...

这是,一个模块错误,但一个Node.js错误。禁止加载“模块”之外的任何东西。

要解决这个问题,只需将旧脚本. js重命名为test.mjs

这是所有。