nodejs 中的 NODE_PATH

在使用 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变量中注册的路径中寻找,如果注册的路径中有就调用,否则就提示命令没找到。

-> 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

怎么设置全局路径呢?

# 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 中的 dependenciesdevDependencies 将无法享受到npm自动更新带来的便利,不使用 dependenciesdevDependencies 字段对我们的项目管理来说是不可接受的。

如何解决

我有一个不是很优雅地解决方法,但是也算是解决了这个问题,希望有更好解决办法的同学给我留言。
我写了一个小工具(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 可以很好的解决项目开发部署的问题。

转载于:https://www.cnblogs.com/jinhengyu/p/10257764.html

NODE_PATH的疑难杂症(转)相关推荐

  1. @property疑难杂症

    @property疑难杂症 @property大家都知道能够根据给定的内存管理语意以及原子性和非原子性的设置自动合成对应的setter和getter方法.但是@property具体在背后除此之外还干了 ...

  2. sed修炼系列(四):sed中的疑难杂症

    sed系列文章: sed修炼系列(一):花拳绣腿之入门篇 sed修炼系列(二):武功心法(info sed翻译+注解) sed修炼系列(三):sed高级应用之实现窗口滑动技术 sed修炼系列(四):s ...

  3. linux修改权限后不能开机,打造完美Linux系统:疑难杂症的解决(转)

    打造完美Linux系统:疑难杂症的解决(转)[@more@] 如果谁说他的Linux从来没有遇到"疑难杂症",我觉得是不可信的,就算是操作界面最友好的Window XP也时常遇到各 ...

  4. TCP协议疑难杂症全景解析|硬核

    大家好,我是Alex,今天分享一篇好文章,来自好友dog250,本文深入浅出地分析了TCP协议为什么要这样设计的背后原因,解答了几乎所有TCP疑难杂症问题,可以帮助大家查缺补漏,加深对TCP协议的理解 ...

  5. 《直播疑难杂症排查》之三:首开慢

    本系列会涵盖的内容包括但不限于如下一些主题: 播放失败 播放卡顿 首开慢 延时高 音画不同步 马赛克严重 播放黑屏.花屏.绿屏 播放杂音.噪音.回声 点播拖动不准 直播发热问题 其他问题(待续) 本文 ...

  6. Web UI⾃动化测试平台,专治Web 的各种疑难杂症。

    Web UI⾃动化测试平台,专治Web 的各种疑难杂症. • Totoro - https://github.com/totorojs/totoro • Dalekjs - http://dalekj ...

  7. python断点调试_「Python调试器」,快速定位各种疑难杂症!!!

    在很多的编辑器其实都带着「调试程序」的功能,比如写 c/c++ 的 codeblocks,写 Python 的 pycharm,这种图形界面的使用和显示都相当友好,简单方便易学,这个不是我这篇文章要讲 ...

  8. 这篇文章,专治MQ中间件各种疑难杂症

    点击▲关注 "数据和云"   给公众号标星置顶 更多精彩 第一时间直达 " 今天这篇文章为大家总结下 MQ 应用中的一些疑难杂症. 消息队列有什么优点和缺点? 为什么使用 ...

  9. TCP协议疑难杂症全景解析

    说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面 2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的 3).针对对象:对TCP已经有了全面了解的 ...

最新文章

  1. c++中的数组和指针,引用
  2. iPhone开发环境搭建For PC
  3. c语言删除文件中的数据_第20问:删除了数据文件,该往哪个方向逃跑
  4. 计算器显示代码java_java编写的计算器源代码
  5. 当设计模式遇上 Hooks
  6. windows 安装docker_Windows下docker安装 postgresql12.0
  7. Windows单机之Weblogic 12c受管服务器配置
  8. C++ auto类型说明符如for(atuo x : s)
  9. 矩阵基础11- 广义逆矩阵及应用
  10. 文件不小心删除了怎么恢复呢,怎么恢复误删除的文件
  11. 一份完整详细的新媒体营销推广策划方案 (微信微博等)
  12. 阿里巴巴图库的使用教程
  13. 深度学习-2.机器学习基础
  14. Verdi调整字体大小
  15. render createElement JSX
  16. node.js 安装详细步骤如下(win 版)
  17. 采样定理 ADC采样
  18. 丁鹿学堂:前端http面试总结,状态码详解
  19. 今天,我们算一算数据中心停机的账
  20. Android:实际运用Zxing集成二维码扫描 及 自定义扫码界面(demo源码)

热门文章

  1. 在Outlook中修改脱机文件(.ost)的保存位置
  2. 【python】 读取Excel文件并绘制图表
  3. 使用Silverlight Toolkit绘制图表(上)--柱状图
  4. Android下添加新的自定义键值和按键处理流程【转】
  5. #翻译# 关于 Java 性能方面的 9 个谬论
  6. JS 处理Json 时间带T 时间格式
  7. MongoDB PHP数据库查询类
  8. 一些常用的IHTMLXX接口
  9. SQL Server根据访问历史日志分析提供优化
  10. what does boston dynamics do?