关于NODE_PATH,node全局package的使用

在开发和运行 Node.js 应用程序时,我们经常需要使用到各种第三方的包和模块。一种常见的方式是将这些包安装在每个项目的本地目录中。然而,有时我们可能希望在多个项目之间共享某些通用的包或模块,以提高重复利用代码的效率。

Node.js 提供了一种机制来解决这个问题,即全局安装包。全局包是指一些在全局范围内安装的包,这意味着它们可以在任何项目中使用,而不仅仅是某个特定的项目。在全局包安装之后,我们可以通过命令行或脚本直接访问它们。

然而,使用全局包存在一个常见的问题,即如何确保在不同的项目中找到正确的包。默认情况下,Node.js 将只查找本地项目目录中的包,而不会查找全局安装的包。

NODE_PATH 是一个环境变量,用于指定 Node.js 在模块解析过程中要搜索的目录。通过设置 NODE_PATH 变量,我们可以告诉 Node.js 除了默认的本地目录之外还要搜索哪些目录。

至于为什么配置NODE_PATH全局变量呢?

因为我们在部署的时候可以轻松部署js工程,node_modules拷贝过去或者在部署服务器安装都非常不方便,NODE_PATH配置以后,就不用在通过项目根目录文件夹再次安装,而且通过NODE_PATH可以做到多个项目模块复用,节省资源

为什么不是--global?

NODE_PATH--global 安装的包有几个区别:

  1. 作用范围NODE_PATH 可以让你在项目中引用位于不同位置的模块,而 --global 安装的包则是全局可用的,可以在任何项目中使用。
  2. 安装位置 :使用 NODE_PATH,你可以将 node_modules 文件夹放在特定位置,并通过设置环境变量进行引用。而 --global 安装的包会被安装到全局的 node_modules 文件夹中。
  3. 可访问性--global 安装的包可以在命令行中直接调用,无论当前所在的项目位置如何。而使用 NODE_PATH 引用的包需要在项目代码中显式地引入。

总结起来,NODE_PATH 更适合于在特定项目中引用特定位置的模块,而 --global 安装的包适用于全局使用,并且可以从命令行直接调用。具体使用哪种方法取决于你的需求和使用场景。需要注意的是,全局安装的包对于团队协作和项目管理可能会带来一些问题,因为不同项目可能依赖于不同的包版本,而全局安装只能有一个版本。

NODE_PATH 和 --global 安装的包有不同的优先级

  • NODE_PATH 环境变量可以用于指定一个或多个目录,Node.js 在查找模块时会将这些目录包含在内。如果一个模块无法在当前目录或内置模块中找到,Node.js 会按照 NODE_PATH 中定义的顺序逐个查找指定的目录。因此,如果同名模块在 NODE_PATH 的目录中出现,它们将会被优先加载。
  • --global 安装的包是全局安装的,意味着这些包可以在任何项目中被使用,而不必再次安装。全局安装的包会被放置在系统的全局模块目录中(例如在 Windows 上是 C:\Users\username\AppData\Roaming\npm)。当你在一个项目中引入一个模块时,Node.js 会首先查找该项目的本地依赖,如果找不到,它将会去全局模块目录中查找。

综上所述,如果一个模块既在 NODE_PATH 对应的目录中存在,又被全局安装了,那么 NODE_PATH 的优先级会更高,这意味着它将会被优先加载。只有当没有找到位于 NODE_PATH 目录中的模块时,Node.js 才会去全局模块目录中查找。

1.选定一个全局安装变量的位置

首先我们新建一个文件夹,例如我们在D盘创建新文件夹,文件夹名字为global-node-path 文件路径为

vbnet 复制代码
D:\global-node-path
2.初始化package.json

在任务栏输入cmd,在当前文件夹输入

bash 复制代码
npm init --yes
3.先安装一个package

我们这里用axios这个包为例,输入

复制代码
npm install axios
4.配置环境变量

我们在"系统属性"=> "高级" => "环境变量",在WINDOWS的环境变量,配置NODE_PATH变量,变量值是全局node_modules的地址。 新建环境变量值 环境变量名称

复制代码
NODE_PATH

环境变量值

vbnet 复制代码
D:\global-node-path\node_modules
4.必须重启电脑,否则配置不会生效
5.测试时候成功配置

在电脑任意一个地方建一个js文件,我们随意命名为1.js

ini 复制代码
// 1.js
const axios  = require('axios');
console.log(axios);

运行1.js这个文件

复制代码
node 1.js

结果如下:

说明成功找到包路径

6.补充,linux的配置方式
ini 复制代码
export PATH=$PATH: # 将 /usr/bin 追加到 PATH 变量中
export NODE_PATH="/global-node-path/node_modules" 
7.补充,差异性问题

如果 项目A 使用了,express的3.x版本,项目B 使用了 express的4.x版本,那这种情况该怎么办呢?

可以将 NODE_PATH 指定的位置中存放 express的4.x版本,再将 项目B的 node_modules 目录中放置 3.x 版本。

这样就解决了模块版本差异性问题。

相关推荐
zhougl9966 分钟前
html处理Base文件流
linux·前端·html
花花鱼9 分钟前
node-modules-inspector 可视化node_modules
前端·javascript·vue.js
HBR666_12 分钟前
marked库(高效将 Markdown 转换为 HTML 的利器)
前端·markdown
careybobo2 小时前
海康摄像头通过Web插件进行预览播放和控制
前端
杉之3 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue
喝拿铁写前端3 小时前
字段聚类,到底有什么用?——从系统混乱到结构认知的第一步
前端
再学一点就睡3 小时前
大文件上传之切片上传以及开发全流程之前端篇
前端·javascript
木木黄木木4 小时前
html5炫酷图片悬停效果实现详解
前端·html·html5
请来次降维打击!!!5 小时前
优选算法系列(5.位运算)
java·前端·c++·算法
難釋懷5 小时前
JavaScript基础-移动端常见特效
开发语言·前端·javascript