npm --version -> 8.2.0
which npm -> /usr/local/bin/npm
lf /usr/local/bin/npm -> 0 lrwxr-xr-x 1 kelwen admin 38 Dec 8 16:07 /usr/local/bin/npm -> ../lib/node_modules/npm/bin/npm-cli.js
当前版本
8.2.0,8.x与7.x已经完全重构,主要体现在命令目录更清晰
目录结构
npm
-
bin - 可执行入口文件
-
docs - 所有命令文档
-
lib
-
auth,鉴权操作
-
commands - 命令目录,每个文件对应一个npm命令
-
...
-
man - 命令man文档文件
index.js - packag main文件,^8.0.0开始不支持按main文件方式引入
main函数
/bin/npm-cli.js
#!/usr/bin/env node
require('../lib/cli.js')(process)
逻辑入口
/lib/cli.js
执行流程
-
绑定uncaughtException及unhandledRejection
-
创建npm实例
-
版本更新提示,updateNotifier
-
具体命令执行,根据process.argv来映射
Npm构造器
/lib/npm.js
核心逻辑
-
加载config,承载npm lifecycle中所有的配置参数,npm config get/set可以进行操作
-
npm.exec(cmd, npm.argv),经过abbrevs及aliases查找最终cmd名称,开始执行命令
async cmd (cmd) { await this.load() const command = this.deref(cmd) if (!command) { throw Object.assign(new Error(
Unknown command ${cmd}), { code: 'EUNKNOWNCOMMAND', }) } const Impl = require(./commands/${command}.js) const impl = new Impl(this) return impl }