在开发和运行 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
安装的包有几个区别:
- 作用范围 :
NODE_PATH
可以让你在项目中引用位于不同位置的模块,而--global
安装的包则是全局可用的,可以在任何项目中使用。 - 安装位置 :使用
NODE_PATH
,你可以将node_modules
文件夹放在特定位置,并通过设置环境变量进行引用。而--global
安装的包会被安装到全局的node_modules
文件夹中。 - 可访问性 :
--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 版本。
这样就解决了模块版本差异性问题。