在使用 nodejs 开发中咱们都免不了要去安装一些第三方模块。java
那么你或多或少的遇到过如下一些问题node
再继续阅读以前,咱们先来弄清楚一个概念。git
npm install --global xxx
属于全局安装
npm install xxx
属于本地安装
github
你写一个项目 A 须要安装一个 express 模块,又开发一个项目 B 又须要安装一个 express 模块算法
因为 安装的依赖包过多(并且依赖包嵌套依赖包)
,若是一个项目依赖多的话,(好比依赖 gulp
系列 或 grunt
系列的项目构模块)那么一个项目能够说轻轻松松上百兆
。若是想给想项目更换一个目录,都发现是痴心妄想了。(基本都是1-10KB的小文本文件组成了一个100多MB的项目,那得有多少个文件啊!想一想若是像java那样,模块都是以jar包存在的压缩归档文件可能也好一点)
。更别提部署了。express
其实这里面的代码也就是 几十KB到1兆
是咱们本身写的代码。这些文件想实现 复制,移动,部署是很方面的。npm
若是你部署过 node 项目到远程服务器,node_modules 目录的上传将是一件恐怖的事情json
NODE_PATH
是干什么的呢?
操做系统中都会有一个PATH
环境变量,想必你们都知道,当系统调用一个命令的时候,就会在PATH变量中注册的路径中寻找,若是注册的路径中有就调用,不然就提示命令没找到。gulp
-> export PATH=$PATH: # 将 /usr/bin 追加到 PATH 变量中 -> export NODE_PATH="/usr/lib/node_modules;/usr/local/lib/node_modules" #指定 NODE_PATH 变量
那 NODE_PATH
就是NODE
中用来寻找模块所提供的路径注册环境变量
。咱们可使用上面的方法指定NODE_PATH环境变量。而且用;
分割多个不一样的目录。windows
关于 node 的包加载机制我就不在这里废话了。NODE_PATH中的路径被遍历是发生在
从项目的根位置递归搜寻 node_modules
目录,直到文件系统根目录的 node_modules
,若是尚未查找到指定模块的话,就会去 NODE_PATH中注册的路径中查找
。
基于 nodejs 的包加载路径搜索算法,咱们能够 采用全局安装的方式,将咱们的包安装到全局。
这样,咱们的项目就能够共享全局中的依赖包。
npm root -g
查看在你的系统中全局的路径。
咱们也能够经过npm config ls -l | grep prefix
(*nix) 系统中
或是npm config get prefix
来查看全局路径。
是的 prefix
字段就是全局base path
怎么设置全局路径呢?
# in *nix npm config set prefix /path/to/global # in windows npm config set prefix C:\\Users\\pc\\global
若是 项目A 使用了,express的3.x版本,项目B 使用了 express的4.x版本,那这种状况该怎么办呢?
能够将 NODE_PATH 指定的位置中存放 express的4.x版本,再将 项目B的 node_modules
目录中放置 3.x 版本。
这样就解决了模块版本差别性问题。
因此说,两种安装方式咱们并非只是用其中的一种,他们能够结合使用,根据 nodejs 的包加载机制,咱们能够灵活使用。
在部署以前,咱们能够将咱们项目的全部能够全局安装的模块,都以全局的安装方式安装到服务器中。接下来咱们就能够轻松,上传咱们的项目到服务器中了。这样上传也会变得的很快。
而后配置咱们的 NODE_PATH
环境变量。怎么配置上面也谈过,这里就不用多说了。(由于项目的部署方式多种多样,因此具体状况能够自行决定。)
本人是使用 PM2 部署管理Nodejs项目,因此我写在 配置文件中。
是的这种方式也有缺点。由于在使用 --global
参数的时候 --save
或 --save-dev
参数是无效的。
这样就带来一个问题。此时 package.json
中的 dependencies
, devDependencies
将没法享受到npm自动更新带来的便利,不使用 dependencies
, devDependencies
字段对咱们的项目管理来讲是不可接受的。
我有一个不是很优雅地解决方法,可是也算是解决了这个问题,但愿有更好解决办法的同窗给我留言。
我写了一个小工具(npmafter
),它的使用方法很简单, 它是跨平台的。兼容(Mac,Windows,Linux)。(我没有发布到github上,由于感受会有更好的办法)
$ npm install -g http://yinchangsheng-blog.qiniudn.com/blog/nodejs/npmafter.tgz # install # 而后咱们安装任何模块就能够这样 $ npm install express -g | npmafter $ npm install request q -g | npmafter --save $ npm install mocha chai -g | npmafter --save-dev
是的 package.json
文件就会获得更新。
好的,若是你不纠结这个问题那么这个问题就算是解决了。
使用 NODE_PATH
能够很好的解决项目开发部署的问题。