gpt4 book ai didi

node.js - 如何编写一个可以从命令行调用以及从其他文件调用 'require()' d 的 Node.js 文件?

转载 作者:搜寻专家 更新时间:2023-11-01 00:36:02 25 4
gpt4 key购买 nike

我想编写一个 Node.js 源文件 (myCode.js),其中有一个函数 say foo(arg1, arg2,..),例如我可以..

$ node ./myCode.js arg1 arg2

还有

// myOtherCode.js
var foo = require('./mycode')

这可能吗?目前我有一小部分这样的文件,它们都被编码为

return (
function foo() {
//...
}
)()

我从 Node 命令行调用,如

$ node ./myCode.js arg1 agr2

但现在我想将它们串在一个 javascript 中,该 javascript 将使用“Node ”或“npm 脚本”从命令行调用(因此来自不同文件的所有功能都需要是“require()d”)。但我也想保留在需要时单独运行它们的能力。

我知道当从 shell 提示符调用时,arg1、arg2 将变成 argv[2]、argv[3] 等等,当“require()”时,它们将是函数参数。

这可能也意味着我需要将参数传递给“require()”?我怎样才能做到这一点?

[使用 Node.js 8.x [LTS] 版本,因此不能使用导出/导入语法]

最佳答案

对于命令行和程序包的使用,通常有不同的入口点。在 Node.js 中解析 CLI 参数的常用方法是 process.argv.slice(2),因为 node 和脚本名称是前 2 个参数。

对于包级可执行脚本,foo 函数从 index.js 入口点导出:

module.exports = function foo(arg1, arg2) { /* ... */ };

考虑到 foo 需要字符串参数,bin/index.js CLI 可执行脚本可以像这样简洁:

require('..')(...process.argv.slice(2));

两者都可以在 package.json 中指定:

"main": "index.js",
"bin": { "foo": "bin/index.js" }

This probably also means that I need to pass arguments to 'require()'? How can I accomplish this?

无法将它们传递给require。如果脚本需要以编程方式接受参数,这意味着它应该用接受参数的工厂函数包装。

一个快速而简单的修复方法是通过 process.argv 将参数传递给 CLI 可执行脚本。例如,一个允许使用动态参数调用可执行脚本的辅助函数:

const decache = require('decache');

function loadCliModule(name, ...args) {
decache(name);
const originalArgv = process.argv;
process.argv = [...process.argv.slice(2), ...args];
const binModule = require(name);
process.argv = originalArgv;
return binModule;
}

可以这样使用:

const foo = invokeCliModule(require.resolve('./foo'), 'bar'); // foo expects process.argv[2]

请注意,由于 decache 的工作方式,它只会解缓存已加载的模块。如果子模块使用 process.argv,则应相应处理。

这不应该在生产中完成,因为这种方法很老套,但它非常适合测试。

自然限制是从 CLI 传递的参数是字符串,因此函数应包含样板代码以将它们转换为预期的数据类型(数字、 bool 值等)。因此,最好将编程和 CLI 入口点分开。

如果需要调用大量这样的脚本,这可能是实际问题,解决方案是创建单个 CLI 可执行脚本,使用 yargs 等库处理参数并调用函数来自基于此的其他文件。

关于node.js - 如何编写一个可以从命令行调用以及从其他文件调用 'require()' d 的 Node.js 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51711167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com