"type": "module" in package.json throw new ERR_REQUIRE_ESM(filename, parentPath, packageJsonPath)

"type": "module" in package.json throw new ERR_REQUIRE_ESM(filename, parentPath, packageJsonPath)

我想在我的 nodejs 项目中使用导入而不是使用 require。 所以,我补充说,

"type": "module"

在我的package.json.

import index from './index.js';

server.js

当我运行

node server.js

错误说,

internal/modules/cjs/loader.js:1174
      throw new ERR_REQUIRE_ESM(filename, parentPath, packageJsonPath);
      ^

      throw new ERR_REQUIRE_ESM(filename, parentPath, packageJsonPath);
      ^

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: ....

server.conf.js粘贴在下面。

import express from 'express';

import http from 'http';
let app = express();
let server = http.createServer(app);

import morgan from 'morgan';
import methodOverride from 'method-override';;
import path from 'path';

let port = process.env.PORT || 4000;
app.use(morgan('dev'));
app.use(methodOverride('X-HTTP-Method-Override'));
let router = express.Router();
import routes from '../app/routes';
routes(app, router, client);
server.listen(port);
console.log(`Wizardry is afoot on port ${port}`);
export {
    app,
    client
};

根据编辑前的堆栈跟踪 (https://whosebug.com/revisions/61558835/1):

internal/modules/cjs/loader.js:1174
      throw new ERR_REQUIRE_ESM(filename, parentPath, packageJsonPath);
      ^

      throw new ERR_REQUIRE_ESM(filename, parentPath, packageJsonPath);
      ^

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: H:\WORKSPACE\CMDs\node-basic\server.conf.js
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1174:13)
    at Module.load (internal/modules/cjs/loader.js:1002:32)
    at Function.Module._load (internal/modules/cjs/loader.js:901:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
    at internal/main/run_main_module.js:18:47 {
  code: 'ERR_REQUIRE_ESM'
}

我试图找到抛出此错误的节点源:

https://github.com/nodejs/node/blob/c24b74a7abec0848484671771d250cfd961f128e/lib/internal/modules/cjs/loader.js#L1234

// Native extension for .js
Module._extensions['.js'] = function(module, filename) {
  if (filename.endsWith('.js')) {
    const pkg = readPackageScope(filename);
    // Function require shouldn't be used in ES modules.
    if (pkg && pkg.data && pkg.data.type === 'module') {
      // ...
      throw new ERR_REQUIRE_ESM(filename, parentPath, packageJsonPath);
    }
  }
  // ...
};

注释Function require shouldn't be used in ES modules告诉要加载的js文件是一个ES模块,但调用者试图使用require()函数加载它。

此外,仔细检查 Node src https://github.com/nodejs/node/blob/6cc94b2d7f69f1f541f7c5de3cb86e569fbd4aa3/lib/internal/errors.js#L1319 证明 H:\WORKSPACE\CMDs\node-basic\server.conf.js 是要加载的 ES 模块。

所以我想猜测是谁在尝试在您的应用中加载 server.conf.js 但没有成功。您的 index.js 或其他地方很可能有一个 require('./server.conf.js')。如果您发现它,只需将其更改为 import 即可修复。

有同样的问题。我安装了最新的节点版本,然后它就可以工作了。尝试相同。此外,如果您使用的是 windows,请确保它是正确的版本,即 64 位、32 位。

检查您的 NodeJS 版本的模块兼容性(“类型”:“模块”),某些版本存在已知问题。

很可能在您的 index.js/server.js 或您正在导入的依赖包或其他地方有一个 require('./server.conf.js') 。如果您发现它,只需将其更改为导入即可修复。

1- 检查你是否都需要语句

2- 分析该代码中 require 语句的依赖包

  • 尝试构建...
  • 尝试部署到 GC、DO、AWS 或 HKU 上的 NodeJS 容器

在我的例子中,我有一个数据文件 (data.js),其中的产品列为数组中的对象。看起来像这样:

const data={
  products:[
    {
      brand:'nike',
      price:1200
    },
    {
      brand:'adidas',
      price:1400
    }
  ]
}

export default data

错误是因为我愚蠢地导出它就像它是一个函数或class 并写道:

export default data={
etc...
}

我怀疑这是你的错误的一个例子,但它仍然显示了这个错误是多么的麻烦和经常出现。如果它有任何清晰度,我想说的是,我基本上是说这通常是由于文件本身无法从导入中读取而出现的。如果你输入 "type": "module" 那么它就是 def 节点的一个版本,或者是你试图导入的东西的基本级别的问题。尝试一开始一个一个地删除每个导入,看看哪个可能是原因。然后从那里开始工作

不需要花哨的东西。只需更新 Node.js 版本。

对于我的情况,我降级: 节点获取 ^3.0.0 → ^2.6.1

问题已解决。

我也遇到了类似的问题。 所以我将 chalk 模块版本从 5.0.1 降级到 4.1.0。 它对我有用。