如何获取所有可用Node.js模块的列表?

时间:2016-03-01 14:48:01

标签: javascript node.js npm

我正在尝试将一些NPM功能纳入我的Node.js程序。特别是,我希望能够分析我系统上的可用节点模块。 “模块”在这里表示“模块标识符”,因此是“fd”之类的标识符或文件路径;换句话说,任何可以放入require()调用并加载模块的东西。 这个问题分为三个子问题: 1)获取所有核心模块的列表 2)获取所有已加载模块的列表 3)获取所有已安装和可用模块的列表。

问题1由zeke的node-core-module-names列表回答。加载另一个模块以查找核心模块列表并不优雅,它可能已经过时,但它是一个选项并且确实有效。因此,(有序)列表为['assert', 'buffer', 'child_process', ..., 'zlib']

2.问题可以通过调用Object.keys(require.cache)来回答,它会返回文件路径列表。

我现在不能优雅解决的问题是3.问题。有一个shell命令npm ls,它返回一个树形图。但有什么可用的和更好的吗?

感谢您的聆听! 汤姆

2 个答案:

答案 0 :(得分:1)

这是我发现修补的东西,我认为这应该是有效的。

V8代码有一组标准的绑定,您可以在Node中看到它们。它们包括但不限于:

  • FS
  • 路径
  • HTTP

此外,还有一个名为process的全局变量。这会公开进程级别的信息和功能,但可让您通过名为process的{​​{1}}变量中的函数来获取某些V8代码。

bindings函数允许您连接到Node创建的公开C ++库,或者您可以按照V8开发人员指南创建自己的NodeJS模块(超出了本答案的范围,请在此处阅读更多内容)。

我在bindings(...)文件中看到的funny little line包含一个静态检查,用于检查关键字Node.cc的绑定。这似乎是一个您正在寻找的系统级模块列表,然后是一些。

所以说,我进入了Node REPL并插入了两行(我相信它可以以更优雅,更富有表现力的方式缩短)。另请注意,我正在修剪以下划线(_)开头的任何内容,以便保留私有函数或绑定:

natives

答案 1 :(得分:1)

npm listvarious output options/flags,包括jsonparseable(输出路径列表)

试试这个:

var exec = require('child_process').exec;
var cmd = 'npm ls --json';

exec(cmd, function(error, stdout, stderr) {
  var treeObject = JSON.parse(stdout);
});

以上内容不需要外部软件包,但可能需要更多代码来解决缓冲区限制:https://github.com/nodejs/node/issues/4236

也可以npm使用var npm = require('global-npm'); npm.load({}, function (err) { npm.commands.list(null, function(err, treeObject) { var firstLevelDependenciesArray = Object.keys(treeObject.dependencies); }); }); ,也许通过programmatically

print("\n".join(" -> ".join(str(num) for num in sub) for sub in L))