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

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

相关推荐
学不会•2 小时前
css数据不固定情况下,循环加不同背景颜色
前端·javascript·html
活宝小娜4 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点4 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow4 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js
我开心就好o4 小时前
uniapp点左上角返回键, 重复来回跳转的问题 解决方案
前端·javascript·uni-app
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
刚刚好ā5 小时前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
沉默璇年7 小时前
react中useMemo的使用场景
前端·react.js·前端框架
yqcoder7 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
2401_882727577 小时前
BY组态-低代码web可视化组件
前端·后端·物联网·低代码·数学建模·前端框架