npm link的用法
# 0.前言
一直搞不懂npm link的用作,这里做一个说明。
提前注:
package.json中定义的packageName应小写,不要采用驼峰命名。
# 1.自定义 module 的使用
如果我们想自己开发一个依赖包,可以在多个项目中使用,标准的做法是:
- 将开发好的
module直接发布到npm仓库上。 - 当其他项目中需要使用这个
module时,直接在本地项目中执行npm install moduleNmae。
但是这样做存在一个问题,在每次修改 module 源码后,需要重新发布到npm镜像仓库。
使用npm link命令可以简化 module 修改后繁琐的npm publish和npm update module操作。
# 2.示例项目
示例代码地址:https://github.com/wangjs-jacky/npm_link.git (opens new window)
项目结构如下:
.
├── main # 在项目中需要导入`module_name1`文件
│ └── demo.js
└── module_name1 # 自定义的module文件
├── index.js
└── package.json
2
3
4
5
6
如果直接运行node main/demo.js,会报错误信息“MODULE_NOT_FOUND”。
在不使用将module推送到npm官方制品库的条件下,可以使用npm link解决上面的问题。
测试步骤如下:
在
module_name1文件夹下,执行sudo npm link # mac需要开权限1执行后,会在全局的
node_modules环境下会生成一个符号链接文件,在windows下就是创建一个快捷方式文件。这个操作就是替换:
npm install -g 包名在
main文件夹下,执行npm link 包名(module_name1)1执行后,将全局
node_modules下刚创建的module安装到本地项目这个操作就是替换:
npm install --save 包名
执行后,原先项目的结构会发生变化,目录结构如下:
.
├── main
│ ├── demo.js
│ └── + node_modules
│ └── + module_name1 -> ../../../../../../../usr/local/lib/node_modules/module_name1
└── module_name1
├── index.js
├── + package-lock.json
└── package.json
2
3
4
5
6
7
8
9
从上面可以发现,共增加了三个文件。
此时,再执行node main/demo.js,就可以正常打印出期望值,不会报错了。
# 3.卸载操作
在卸载阶段,module_name1和main执行的指令都是相同的:
sudo npm unlink 包名(module_name1)
# 4.npm install -g 和-s的区别
这个DEMO项目演示结束后,会突然冒出一个疑问,既然全局已经安装了module了,为什么在main文件夹下,仍然需要使用npm link再安装一遍呢?
这是因为:
npm install -g moduleName是将模块装到全局目录下,但是全局方式的安装是供命令行(command line)使用的,但是这种通过全局安装的模块module是无法在代码中使用require调用导入的,默认还是从本地的node_modules中寻找依赖。