npm link 简介
npm link 是 npm 提供的一种本地包开发和调试工具,它的核心原理是通过创建符号链接(symbolic link)将本地开发的包与全局 npm 环境或其他项目关联起来,实现本地包的实时调试和测试。
npm link 的工作流程
- 切换到当前开发目录下
% pwd
/Users/xxx/Desktop/study/web-frontend-cli
- 执行
npm link,这会把当前项目链接到全局 npm 模块:
npm link
- 原理: 本地调试脚手架时需要两次符号链接,是由 npm 的包管理机制和脚手架工具的特性共同决定的,这两次链接分别服务于不同的功能目的:
- 第一次链接 :自动创建
全局包目录 → 本地项目~/.npm-global/lib/node_modules/web-frontend-cli→/Users/XXX/Desktop/cli/web-frontend-cli/
npm 体系中,包的识别和依赖管理是基于全局/项目的 node_modules 目录结构,如果其他项目通过 require('web-frontend-cli') 或 import 导入你的包,Node.js 会从全局 node_modules 查找,通过这个符号链接找到本地代码。 - 第二次链接 :只有当 package.json 中定义了 bin 字段时才会创建
全局 bin 目录 → 本地可执行文件:/usr/local/bin/web-starter→/Users/XXX/Desktop/cli/web-frontend-cli/bin/index.js - 为什么需要两次链接而不是一次
这是因为 npm 包的双重身份 决定的: 作为 Node.js 模块 :需要在 node_modules 目录结构中被识别和加载,支持require()/import。
作为命令行工具 :需要在系统 PATH 中可访问,支持直接命令调用。
分包脚手架调试
假设你有两个包:
/path/to/frame-start-core/path/to/frame-start-cli(依赖 core)
- 先在核心包目录执行:
cd /path/to/frame-start-core
npm link
- 然后在 CLI 包目录执行:
cd /path/to/frame-start-cli
npm link frame-start-core
会把 CLI 包中的 frame-start-core 依赖指向你本地的核心包代码,实现本地联调。
3. 在 CLI 包目录执行:
npm link
将 CLI 包链接到全局,方便执行命令调试。
解除链接
若后续需恢复依赖为 npm 仓库包,可执行:
在 CLI 包目录执行 `npm unlink frame-start-core`(解除与本地核心包的关联);
在核心包目录执行 `npm unlink`(从本地全局移除核心包链接)。