todo App 的 CLI - 帮助使用 Commander 调试当前解决方案还是更改 Readline 和 Event Emitter 的方法?
我正在尝试使用 node js 中的 commander 和 conf 模块为仅用于 node js 的 todo 应用程序构建 CLI,并使用粉笔为输出着色。我不确定如何解决返回的错误:
ReferenceError:require 未在 ES 模块范围内定义,您可以改用 import 此文件被视为 ES 模块,因为它具有“.js”文件扩展名 包含“type”:“module”。要将其视为 CommonJS 脚本,请将其重命名为使用 '.cjs' 文件扩展名。
我在 conf 和 commander 中都遇到了上述错误
关于如何调试此问题的任何建议,或者更改为使用 readline 和 events/EventEmitter 的方法会更好,将不胜感激,谢谢
以下是代码的 REDACTED 版本:
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
经过进一步研究,我发现我在 CJS 或 ESM 模块之间“混淆了”。 CJS 模块使用 require,这是 ES6 模块之前的旧做法 ESM 模块使用 import
我的 package.json 说 type: module 告诉 NodeJS 我正在使用 ESM。但代码说的是 CJS。
这些是我为解决这个问题所采取的步骤:
- 将 index.js 重命名为 index.mjs
- 相应地更新 package.json
- 用 import 语句替换所有 require 调用
- 用 default export = list 替换 module.exports = list(或使用命名导出)