Skip to content
本页目录

NPM Package 分析工具

一、背景

NodeJS 包管理逻辑非常复杂, 直观感受是npm install 后常常会安装许多不明所以的包

下面例子中, 仅声明了glob依赖, 却带来了balanced-match等总计7个子包

bash
{
  "name": "tmp3",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "glob": "^10.1.0"
  }
}

glob

分析这些包的package.json可以发现它们之间形成如下依赖关系:

glob依赖关系

项目变大后, 依赖变多后, 这种依赖关系会变得非常复杂, 常常让我们看不清:

  • 为什么会安装某个特定的package
  • 为什么某些package会安装多个版本
  • package之间形成了怎样的父子依赖关系
  • 是否存在循环依赖
  • 等等 因此期望实现一个工具, 从package.json出发, 递归遍历所有node_modules中的package.json生成模块依赖关系图

二、需求

  • 需要封装为node命令行工具
  • 支持xx-cli analyze命令, 用于分析从当前目录package.json开始递归查找到的全量依赖关系(包名 & 版本号), 分析完成后自动打开网页, 并渲染依赖关系图;
    • 注意处理好循环依赖问题, 避免陷入死循环
    • 支持--depth=n参数, 限制向下递归分析的层次深度
    • 支持--json=[file-path]参数, 传入后不再打开网页, 只是将依赖关系以JSON形式存储到用户指定的文件
  • 在打开页面中, 除了渲染依赖关系图外, 期望对依赖关系做出初步分析, 例如:
    • 是否包含循环依赖
    • 同一个package是否包含多个版本实例

三、技术栈

  • 功能开发
    • 依赖关系图: antv/x6echartsD3均可
  • 工程化
    • 使用TypeScript开发
    • 使用vitest/jest实现单元测试
    • 接入eslintlint-staged工具

四、产出

  • 源码, 期望提交到github
  • 发布到npmCLI工具包
  • 项目说明文档