npm link详解

npm install 可以把发布在npmjs平台上的模块包下载到本地,npm istall -g 可以把包下下来的同时,还帮我们配置好全局变量,让我们可以直接使用命令而不是通过node来执行或者配置package.json 的script脚本来run。但这仅限于已经发布的包,那对于未发布的包,要怎么测试使用呢?总不能把一个未经测试的包发布出去然后install下来这样测试吧,这样npm上面的包谁还敢用。所以npm上的包一定只能放经过测试考验的比较完善的包。而包的本地测试,就需要通过npm的一个命令了:npm link

原理

npm link 可以帮助我们模拟包安装后的状态,它会在系统中做一个快捷方式映射,让本地的包就好像install过一样这么使用。

在mac中,我们在终端可以直接敲的命令,其实是在执行/usr/local/bin目录下的脚本,这个目录可以认为是我们的全局命令所在的地方。

而当我们在npm install -g的时候,其实是将相关文件安装在/usr/local/lib/node_modules目录下,而同时在全局命令/usr/local/bin目录下会有一个映射脚本,将其指向lib下的真实文件。这么做的好处是,可以在保证只有一份可执行文件的前提下,给命令取别名。

同样的,npm link 做的事情也是一样,唯一的区别是,它在lib下的 node_modules 里不是存的真实的文件,而是存了一个快捷方式,指向你当前执行 npm link 的目录。如果开发的的是node包,则执行的命令名和真实执行的文件入口,则是根据项目的 package.jsonbin 的配置来获取。

使用

1
2
cd projectdir
npm link

然后会看到输出类似如下的链接信息,说明成功。

1
2
/usr/local/bin/yourpakagename -> /usr/local/lib/node_modules/yourpackagename/xxx
/usr/local/lib/node_modules/yourpackagename/xxx -> /Users/username/Documents/xxx(your real project path)

一般是开发node包,可以直接在终端运行的,做npm link之前,需要在 package.json 里配置 bin 字段。

1
2
3
4
# package.json
"bin" : {
"yourcommandname": "./bin/yourcommandname"
}

然后再在当前目录下运行

1
npm link

成功后,就可以直接在终端执行 yourcommandname 了。

如果是前端包,不需要直接在终端运行,比如UI组件库,那需要做两次link。
先进入待测试组件库目录,将开发的包link到全局:

1
npm link

之后,再进入要使用该组件库的工程,然后在工程中link这个组件库:

1
npm link youruilib

现在你就可以在你的工程中使用这个ui组件库,就好像这个ui库被install到工程中一样。

GoodLuck!