Nodejs 不用命令行也不调用命令行,如何知道已安装package列表?
Nodejs 不用命令行也不调用命令行,如何知道已安装package列表?
        
          6 回复
        
      
      
        Nodejs 不用命令行也不调用命令行,如何知道已安装 package 列表?
在 Node.js 中,我们通常使用命令行工具(如 npm list 或 yarn list)来查看已安装的包列表。然而,在某些情况下,我们可能需要在不使用命令行的情况下获取这些信息。本文将介绍一种方法,通过直接读取 package.json 和 node_modules 文件夹中的数据来实现这一点。
方法概述
- 读取 
package.json文件:首先,我们需要读取项目根目录下的package.json文件,从中获取已声明的依赖项。 - 遍历 
node_modules文件夹:然后,我们需要递归地遍历node_modules文件夹,查找实际安装的包及其版本信息。 
示例代码
const fs = require('fs');
const path = require('path');
function readPackageJson(filePath) {
    const data = fs.readFileSync(filePath, 'utf-8');
    return JSON.parse(data);
}
function getInstalledPackages(rootPath) {
    const packages = {};
    // 读取 package.json 文件
    const pkgJsonPath = path.join(rootPath, 'package.json');
    const pkgJson = readPackageJson(pkgJsonPath);
    // 添加 package.json 中声明的依赖
    if (pkgJson.dependencies) {
        Object.keys(pkgJson.dependencies).forEach(name => {
            packages[name] = { version: pkgJson.dependencies[name], from: 'package.json' };
        });
    }
    // 递归遍历 node_modules 文件夹
    function traverseModules(dir) {
        fs.readdirSync(dir).forEach(file => {
            const filePath = path.join(dir, file);
            const stat = fs.statSync(filePath);
            if (stat.isDirectory() && file !== '.bin') {
                const pkgJsonPath = path.join(filePath, 'package.json');
                if (fs.existsSync(pkgJsonPath)) {
                    const modulePkgJson = readPackageJson(pkgJsonPath);
                    packages[file] = { version: modulePkgJson.version, from: 'node_modules' };
                }
                traverseModules(filePath);
            }
        });
    }
    traverseModules(path.join(rootPath, 'node_modules'));
    return packages;
}
// 使用示例
const rootPath = process.cwd();
const installedPackages = getInstalledPackages(rootPath);
console.log(installedPackages);
解释
- 读取 
package.json文件:readPackageJson函数读取并解析指定路径的package.json文件。 - 遍历 
node_modules文件夹:getInstalledPackages函数首先读取package.json文件,提取其中声明的依赖项。然后,它递归遍历node_modules文件夹,查找每个模块的package.json文件,并提取其版本信息。 - 返回结果:最终返回一个对象,其中键为包名,值为包含版本号和来源(
package.json或node_modules)的对象。 
这种方法可以让你在不使用命令行的情况下获取已安装的包列表,适用于需要在 Node.js 应用程序内部动态检查依赖关系的场景。
可以看看node-modules里面的文件夹。注意全局和工程级别。
有个比较奇葩的方法是用 madge 去分析代码找到引用的模块 https://github.com/pahen/madge
项目内的可以搜索node_modules,但全局的无法搜索
        
      
                    
                  
                    

