nodejs 中的 NODE_PATH
2015-08-25 12:23
429 查看
在使用 nodejs 开发中我们都免不了要去安装一些第三方模块。
那么你或多或少的遇到过以下一些问题
再继续阅读之前,我们先来弄清楚一个概念。
你写一个项目 A 需要安装一个 express 模块,又开发一个项目 B 又需要安装一个 express 模块
由于
或
其实这里面的代码也就是
如果你部署过 node 项目到远程服务器,node_modules 目录的上传将是一件恐怖的事情
操作系统中都会有一个
那
关于 node 的包加载机制我就不在这里废话了。NODE_PATH中的路径被遍历是发生在
从项目的根位置递归搜寻
基于 nodejs 的包加载路径搜索算法,我们可以 采用全局安装的方式,将我们的包安装到全局。
这样,我们的项目就可以共享全局中的依赖包。
我们也可以通过
或是
来查看全局路径。
是的
怎么设置全局路径呢?
如果 项目A 使用了,express的3.x版本,项目B 使用了 express的4.x版本,那这种情况该怎么办呢?
可以将 NODE_PATH 指定的位置中存放 express的4.x版本,再将 项目B的
这样就解决了模块版本差异性问题。
在部署之前,我们可以将我们项目的所有可以全局安装的模块,都以全局的安装方式安装到服务器中。接下来我们就可以轻松,上传我们的项目到服务器中了。这样上传也会变得的很快。
然后配置我们的
本人是使用 PM2 部署管理Nodejs项目,所以我写在 配置文件中。
是的这种方式也有缺点。因为在使用
这样就带来一个问题。此时
我有一个不是很优雅地解决方法,但是也算是解决了这个问题,希望有更好解决办法的同学给我留言。
我写了一个小工具(
是的
好的,如果你不纠结这个问题那么这个问题就算是解决了。
使用
那么你或多或少的遇到过以下一些问题
再继续阅读之前,我们先来弄清楚一个概念。
npm install --global xxx属于
全局安装
npm install xxx属于
本地安装
安装的模块太多项目太臃肿,模块没能复用
你写一个项目 A 需要安装一个 express 模块,又开发一个项目 B 又需要安装一个 express 模块
项目中依赖包太多,文件过多,模块没法复用,各种问题浮现
由于 安装的依赖包过多(而且依赖包嵌套依赖包),如果一个项目依赖多的话,(比如依赖
gulp系列
或
grunt系列的项目构模块)那么一个项目可以说轻
轻松松上百兆。如果想给想项目更换一个目录,都发现是痴心妄想了。
(基本都是1-10KB的小文本文件组成了一个100多MB的项目,那得有多少个文件啊!想想如果像java那样,模块都是以jar包存在的压缩归档文件可能也好一点)。更别提部署了。
其实这里面的代码也就是
几十KB到1兆是我们自己写的代码。这些文件想实现 复制,移动,部署是很方面的。
给部署带来的困扰
如果你部署过 node 项目到远程服务器,node_modules 目录的上传将是一件恐怖的事情
NODE_PATH 出现,模块复用,最佳实践方案
NODE_PATH是干什么的呢?
操作系统中都会有一个
PATH环境变量,想必大家都知道,当系统调用一个命令的时候,就会在PATH变量中注册的路径中寻找,如果注册的路径中有就调用,否则就提示命令没找到。
[code]-> 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环境变量。并且用
;分割多个不同的目录。
加载时机
关于 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
怎么设置全局路径呢?
[code]# 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上,因为感觉会有更好的办法)
[code]$ 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可以很好的解决项目开发部署的问题。
相关文章推荐
- nodejs安装:nodejs入门
- Using up all the the free Inodes
- 后端分布式系列:分布式存储-HDFS NameNode 设计实现解析
- 后端分布式系列:分布式存储-HDFS NameNode 设计实现解析
- 后端分布式系列:分布式存储-HDFS NameNode 设计实现解析
- HDFS NameNode 设计实现解析
- CCNode扩展,适应MMO的复杂UI逻辑
- node.js(三)url处理
- node.js 基础学习笔记2
- [237] Delete Node in a Linked List
- node.js 基础学习笔记1
- 【LeetCode】19. Remove Nth Node From End of List
- 不能将Lnode * 类型的值分配到Lnode * 类型的实体
- leetcode: (19) Remove Nth Node From End of List
- npm(node)的安装步骤
- node相关的碎碎念
- [LeedCode OJ]#237 Delete Node in a Linked List
- node-restify简介
- Nodejs学习路线图
- [LeetCode 222]Count Complete Tree Nodes