关于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 版本。

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

相关推荐
恋猫de小郭27 分钟前
Flutter Zero 是什么?它的出现有什么意义?为什么你需要了解下?
android·前端·flutter
崔庆才丨静觅7 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60618 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了8 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅8 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅8 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅9 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment9 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅9 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊9 小时前
jwt介绍
前端