npm包调试技巧

242 阅读1分钟

1. 背景

node 应用开发中,我们不可避免的需要使用或拆分为 npm 模块,经常遇到的一个问题是:

新开发或修改的 npm 模块,如何在项目中试验?

新同学一般会有以下几种方式:

为了方便示范,我们假设需要引入包的项目是 my-project, 该项目需要用到一个独立的 my-utils 模块

1.1 发布一个 beta 版本

  • 优点:你高兴就好。
  • 缺点: 无趣+无趣+无趣,麻烦+麻烦+麻烦。

1.2 直接用相对路径安装

$ cd path/to/my-project

$ npm install path/to/my-utils

  • 优点:简单明了
  • 缺点: 调试过程中往往需要微调,此时需要切换到 my-utils 目录修改,修改后需重新构建,虽然不需要我们在my-project项目中反复安装(my-project的引用会自动更新),但重新构建my-utils模块也很麻烦

1.3 使用软链(my-utils 代码修改后,需重新构建)

$ cd path/to/my-project/node_modules

# my-utils为你代码中使用到的包名,非目录名
$ ln -s path/to/my-utils my-utils

删除软链:unlink my-utils

  • 优点:软链后,两边修改直接同步
  • 缺点: 指令操作麻烦,不同操作系统语法不一样

2. 正解 - npm link(my-utils 代码修改后,需重新构建)

但其实 npm 本身已经对此类情况提供了专门的 npm link 指令。

相关文档: docs.npmjs.com/cli/link

下面我们简单介绍下用法:

$ cd path/to/my-utils # go into the package directory
$ npm link   # creates global link
$ 
$ cd path/to/my-project # go into some other package directory.
$ npm link my-utils  # link-install the package,my-utils为package.json文件中定义的包名

上述方法的简写方式为:

$ cd path/to/my-project

$ npm link path/to/my-utils # link the dir of your dependency

my-utils模块代码修改后,需重新打包

该指令还可以用来调试 node cli 模块,譬如需要本地调试我们的 egg-init,可以这样:

$ cd path/to/egg-init
$ npm link
$ # 此时全局的 egg-init 指令就已经指向你的本地开发目录了
$ egg-init # 即可

想去掉 link 也很简单: $ npm unlink my-utils,如果想确认一下当前的link包有没有被删除掉,可使用如下命令看:npm ls my-utils(包名),如果删除成功,会显示empty

参考文档:github.com/atian25/blo…