todo 应用程序的 CLI - 使用 Commander 帮助调试当前解决方案或更改 Readline 和 Event Emitter 的方法?

CLI for todo App - help debugging current solution using Commander or change approach to Readline and Event Emitter?

我正在尝试使用 node js 中的 commander 和 conf 模块为 node js only todo 应用程序构建 CLI,并使用粉笔为输出着色。我不确定如何解决返回的错误:

ReferenceError: require 未在 ES 模块范围内定义,您可以改用 import 此文件被视为 ES 模块,因为它具有“.js”文件扩展名 包含“类型”:“模块”。要将其视为 CommonJS 脚本,请将其重命名为使用“.cjs”文件扩展名。

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

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

以下是经过编辑的代码版本:

list.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();

package.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"
  }
}

在你的 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

经过更多研究后,我发现我 'muddying the waters' 在 CJS 或 ESM 模块之间。 CJS 模块使用 require,这是 ES6 模块之前的旧方法 ESM 模块使用 import

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

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

  • 将 index.js 重命名为 index.mjs
  • 相应更新package.json
  • 用 import 语句替换所有 require 调用
  • 将 module.exports = 列表替换为默认导出 = 列表(或使用命名导出)