繁体   English   中英

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

[英]How to obtain a list of all available Node.js modules?

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

zeke的node-core-module-names列表回答了问题1。 加载另一个模块以查找核心模块列表并不是一件很优雅的事情,它可能已经过时了,但是这是一个选择并且可以正常工作。 因此,(排序的)列表是['assert', 'buffer', 'child_process', ..., 'zlib']

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

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

谢谢收听! 汤姆

这是我发现的一些小问题,我认为这应该是正确的。

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

  • fs
  • 路径
  • http
  • 等等

另外,有一个名为process的全局变量。 这不仅提供了流程级别的信息和功能,而且使您可以通过process变量内部的一个称为bindings的函数来使用某些V8代码。

bindings(...)函数使您可以连接到由Node创建的公开C ++库,或者可以按照V8开发人员指南(超出此答案的范围,在此处了解更多)来创建自己的NodeJS模块。

我在Node.cc文件中看到的一条有趣的小代码行包含一个静态检查,用于检查关键字natives绑定。 看来,这会返回您正在寻找的系统级模块的列表,然后再列出一些。

如此说来,我进入Node REPL并插入了两行(我相信可以用一种更优雅,更富有表现力的方式来缩短它)。 还请注意,我正在修剪以下划线(_)开头的所有内容,以保留私有功能或绑定:

var natives = process.binding('natives'); for (var key in natives) {if (key.indexOf('_') !== 0) {console.log(key);}}

npm list具有各种输出选项/标志 ,包括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也可以通过编程方式使用,也许通过global-npm

var npm = require('global-npm');
npm.load({}, function (err) {
  npm.commands.list(null, function(err, treeObject) {
    var firstLevelDependenciesArray = Object.keys(treeObject.dependencies);
  });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM