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 = 列表替换为默认导出 = 列表(或使用命名导出)
我正在尝试使用 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 = 列表替换为默认导出 = 列表(或使用命名导出)