不能在模块外使用 import 语句

Posted

技术标签:

【中文标题】不能在模块外使用 import 语句【英文标题】:Cannot use import statement outside modules 【发布时间】:2020-06-09 02:07:28 【问题描述】:

我正在将 NextJS 与 typescript、mongo Atlas、mongoose、node 和 express 一起使用。

运行节点页面/服务器时出现以下错误: 我已经上传了我的 package.json 文件并添加了 babel

从“快递”进口快递; ^^^^^^

SyntaxError: 在 wrapSafe (internal/modules/cjs/loader.js:1072:16) 在 Module._compile (internal/modules/cjs/loader.js:1122:27) 在 Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10) 在 Module.load (internal/modules/cjs/loader.js:1002:32) 在 Function.Module._load (internal/modules/cjs/loader.js:901:14) 在 Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12) 在 internal/main/run_main_module.js:18:47

这是我的 server.js 代码:

import express from 'express';
import  connect, connection  from 'mongoose';
import morgan from 'morgan';
import path from 'path';
const app = express();
const PORT = process.env.PORT || 8080;
//Success
   import routes from './routes/api.tsx';

const MONGODB_URI = 'xxx';

// const routes=require('./routes/api')
connect(MONGODB_URI ||'mongodb://localhost/success', 
    useNewUrlParser: true,
    useUnifiedTopology: true
);

connection.on('connected', () => 
    console.log('Mongoose is connected');
);

const newBlogPost = new BlogPost(data); //instance of the model

app.use(morgan('tiny'));
app.use('/',routes)

app.listen(PORT, console.log(`Server is starting at $PORT`));

package.json 文件


  "name": "la-sheild",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": 
    "dev": "next",
    "build": "next build",
    "start": "babel-node server.js"
  ,
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": 
    "@types/express": "^4.17.2",
    "@types/mongoose": "^5.7.1",
    "axios": "^0.19.2",
    "concurrently": "^5.1.0",
    "express": "^4.17.1",
    "mongoose": "^5.9.1",
    "morgan": "^1.9.1",
    "next": "^9.2.2",
    "node": "^13.8.0",
    "react": "^16.12.0",
    "react-dom": "^16.12.0"
  ,
  "devDependencies": 
    "@babel/core": "^7.8.4",
    "@babel/preset-env": "^7.8.4",
    "@babel/register": "^7.8.3",
    "@types/node": "^13.7.4",
    "@types/react": "^16.9.21",
    "babel-cli": "^6.26.0",
    "typescript": "^3.7.5"
  ,
  "proxy": "http://localhost:8080"

【问题讨论】:

你安装了express吗?即 package.json 文件中是否存在 express? 是的,确实如此:"dependencies": "@types/express": "^4.17.2", "@types/mongoose": "^5.7.1", "axios": “^0.19.2”、“同时”:“^5.1.0”、“快递”:“^4.17.1”、@DeepKakkar 你启用 ES6 导入了吗? timonweb.com/posts/how-to-enable-es6-imports-in-nodejs 你能分享你的 package.json 文件吗? 【参考方案1】:

我的 index.ts 从我的 schema.js 文件中导入了一个导出的 var。 我正在这个 schema.js 文件中进行导入 正是第二次导入导致“无法在模块外使用导入语句”。 最后将文件从 schema.js 重命名为 schema.ts 解决了这个问题。\

【讨论】:

【参考方案2】:

我遇到了同样的错误“SyntaxError: Cannot use import statement outside a module”首先我添加了 tye : module 但仍然面临另一个错误。最后它对我的工作问题是我正在运行我的 Driver.js 文件,这就是我遇到这个问题的原因。我运行我的 Driver.ts 文件,它对我来说工作正常。 enter image description here

但是在运行我的扩展名 .ts 文件后它的工作。 enter image description here

【讨论】:

【参考方案3】:

这里是基于ts-next-express的解决方案。

 npm i --save ts-node

为 express 创建另一个配置文件,因为 node 正在使用 common.js 模块,但是如果您检查tsconfig.json,您将看到:"module": "esnext"

tsconfig.server.json


  "extends": "./tsconfig.json",
  "compilerOptions": 
    "module": "commonjs",
    "outDir": "dist",
    "noEmit": false
  ,
  "include": ["server"]

设置脚本如下:

 "start": "ts-node --project tsconfig.server.json server.ts"

【讨论】:

【参考方案4】:

以下解决方案对我有用;

安装需要的包

npm install nodemon @babel/core @babel/node @babel/preset-env -D

在工作目录中创建一个.babelrc文件,并在其中粘贴以下内容


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


最后,将下面的代码添加到 package.json

中的"scripts"

"dev": "nodemon —exec babel-node server.js" 在这种情况下,server.js 是您的文件。

希望这可行:)

【讨论】:

【参考方案5】:

从 Node v12 开始,您可以使用 .mjs 扩展名或在您的 package.json 中设置 "type": "module"

并且您需要使用 --experimental-modules 标志运行节点。

node --experimental-modules server.mjs

您可以查看SO link

或者您可以在项目的根目录中创建.babelrc 文件。 添加以下内容(以及您需要的任何其他 babel 预设,可以在此文件中添加):


    "presets": ["env"]

使用安装babel-preset-env

npm install babel-preset-env
npm install babel-cli -g

# OR

yarn add babel-preset-env
yarn global add babel-cli

现在,转到您的server.js 文件所在的文件夹,然后

运行使用:

babel-node fileName.js

或者您可以通过将以下代码添加到您的 package.json 文件中来使用 npm start 运行:

"scripts": 
    "start": "babel-node server.js"

有一个教程 link 用于设置 Next.js 与自定义 Express 服务器 + Typescript 在媒体上对您非常有帮助。

【讨论】:

我没有 webpack.config.js 文件 @Rebel 有教程给你levelup.gitconnected.com/… 感谢您对 babel 的说明。其他所有事情都在谈论将“type”:“module”添加到你的 package.json 这不是解决方案【参考方案6】:

“脚本”: “开始”:“babel-node server.js”

上面的添加对我有用

【讨论】:

以上是关于不能在模块外使用 import 语句的主要内容,如果未能解决你的问题,请参考以下文章

Storybook main.ts:不能在模块外使用 import 语句

Mocha 测试:不能在模块外使用 import 语句

笑话 - 语法错误:不能在模块外使用 import 语句

JS npm 包,不能在模块外使用 import 语句

Typescript、React、Electron:不能在模块外使用 import 语句

Typescript & TypeORM:不能在模块外使用 import 语句