0

我正在尝试使用节点 js 中的指挥官和 conf 模块为仅节点 js 的待办事项应用程序构建 CLI,并使用粉笔为输出着色。我不确定如何解决返回的错误:

ReferenceError: require is not defined in ES module scope, you can use import instead 此文件被视为 ES 模块,因为它有一个 '.js' 文件扩展名包含“type”:“module”。要将其视为 CommonJS 脚本,请将其重命名为使用“.cjs”文件扩展名。

我在conf和commander中都遇到了上述错误

任何关于我如何进行调试的建议,或者改变使用 readline 和 events/EventEmitter 的方法会更好,将不胜感激,谢谢

以下是已编辑的代码版本:

列表.js

const conf = new (require('conf'))();
const chalk = require('chalk');

function list() {
  const todoList = conf.get('todo-list');
  if (todoList && todoList.length) {
    console.log(
      chalk.blue.bold(
        'Tasks in green are done. Tasks in yellow are still not done.'
      )  
     }
    }

module.exports = list;

index.js 文件

const { program } = require('commander');
const list = require('./list');
program.command('list').description('List all the TODO tasks').action(list);
program.command('add <task>').description('Add a new TODO task').action(add);
program.parse();

包.json 文件

{
  "main": "index.js",
  "type": "module",
  "keywords": [],
  "dependencies": {
    "chalk": "^5.0.0",
    "chalk-cli": "^5.0.0",
    "commander": "^8.3.0",
    "conf": "^10.1.1"
  },
  "bin": {
    "todos": "index.js"
  }
}
4

2 回答 2

1

在你的package.json你有:

"type": "module",

这意味着带有.js后缀的文件被假定为 ECMAScript 而不是 CommonJS。如果您想使用 CommonJS,您可以更改文件后缀或更改"type"属性。

或者您可以使用新语法。在 ECMAScript 中你使用import,在 CommonJS 中你使用require.

要阅读有关“类型”的更多信息,请参阅:https ://nodejs.org/dist/latest-v16.x/docs/api/packages.html#determining-module-system

于 2022-01-03T04:56:34.410 回答
0

经过更多研究后,我发现我在 CJS 或 ESM 模块之间“搅浑水”。CJS 模块使用 require,这是 ES6 模块之前的旧方式 ESM 模块使用 import

我的 package.json 说 type: module 告诉 NodeJS 我正在使用 ESM。但是代码说的是CJS。

这些是我为解决此问题而采取的步骤:

  • 将 index.js 重命名为 index.mjs
  • 相应地更新 package.json
  • 用 import 语句替换所有 require 调用
  • 将 module.exports = list 替换为默认 export = list (或使用命名导出)
于 2022-01-03T06:45:39.593 回答