npm link 与 pnpm link 的用法以及不同之处

简介: npm link 与 pnpm link 的用法以及不同之处

1. npm和pnpm的重点区别简述

npm和pnpm是JavaScript生态系统中两个主要的包管理器,它们都用于安装、管理和共享Node.js模块。下面从多个维度对比npm与pnpm,并详细说明npm linkpnpm link的异同及用法。

npm vs pnpm

1. 依赖树结构

  • npm:采用扁平化模式(在v3版本后),但同一依赖的不同版本仍然会分别安装,可能导致磁盘空间浪费。
  • pnpm:采用了严格依赖关系图模式,通过借用文件链接技术避免了重复的依赖安装,显著节省存储空间。

2. 安装速度

  • npm:由于可能有重复的依赖安装,因此安装速度相对慢些。
  • pnpm:因为依赖共享机制,安装速度快且网络带宽占用较少。

3. 磁盘空间占用

  • npm:对每个项目都会复制所有依赖,磁盘空间占用较大。
  • pnpm:通过硬链接和符号链接技术复用相同依赖,极大减少磁盘占用。

2. npm link 和 pnpm link 不能等效替代

这两个命令主要用于本地开发和调试时,创建一个全局可用的链接到当前工作目录中的模块,使得在其他项目中可以像使用已发布模块一样使用此本地模块。

  • npm link
# 在你的本地模块目录下执行
cd my-local-module
npm link

# 然后在你想要引用这个模块的项目目录下执行
cd my-project
npm link my-local-module

这样,my-project就会链接到全局注册的my-local-module,任何对此模块的修改都会立即反映在引用它的项目中。

pnpm link

其基本用法与npm link相似,但是利用了pnpm的虚拟存储机制,同样实现本地模块的快速迭代和测试:

# 在本地模块目录下执行
cd my-local-module
pnpm link

# 在需要引用该模块的项目目录下执行
cd my-project
pnpm link my-local-module

使用pnpm link时,即使存在深度或循环依赖,由于其特有的链接和缓存策略,也能有效避免一些npm链接带来的问题,比如版本冲突或多次加载同一个模块。


总结来说,npm linkpnpm link都是为了解决本地模块开发和调试的问题,而pnpm在此基础上优化了存储和依赖管理,提供了更为高效和可靠的解决方案。

3. 取消全局link

取消全局link,即解除通过npm link创建的全局链接,可以分别在模块目录和项目目录中执行不同的命令:

取消模块全局链接:

# 首先,进入被全局链接的模块目录
cd my-local-module

# 然后,取消该模块的全局链接
npm unlink -g my-local-module

取消项目与全局模块的链接:

# 进入使用了全局链接模块的项目目录
cd my-project

# 在该项目中取消对全局模块的链接引用
npm unlink my-local-module

对于pnpm,操作类似:

取消模块全局链接(pnpm):

# 进入被全局链接的模块目录
cd my-local-module

# 取消全局链接(pnpm 6+)
pnpm unplug -g my-local-module

# 对于早期版本的pnpm可能需要卸载模块
pnpm uninstall -g my-local-module

取消项目与全局模块的链接(pnpm):

# 进入使用了全局链接模块的项目目录
cd my-project

# 取消项目对全局模块的链接引用
pnpm unlink my-local-module

4. pnpm link 不生效的原因

首先请注意,pnpm在早期版本中并未直接提供pnpm linkpnpm unlink命令来处理全局链接,而是推荐使用工作区(workspace)或虚拟存储(virtual-store-dir) 的机制来实现类似功能。但自pnpm v6开始,已经支持了类似于npm的全局链接功能。

pnpm link未能成功可能有以下原因:

  1. 权限问题
  1. 在全局链接模块时,如果没有足够的权限访问全局存储路径,可能会导致链接失败。确保以管理员身份运行命令或在适当的权限下操作。
  1. 版本兼容性
  1. 确保你的pnpm版本与当前项目或者被链接的本地模块相兼容。不同版本的pnpm可能存在一些功能上的差异或已知问题。
  1. 网络问题
  1. 尽管pnpm link主要处理本地模块,但在某些情况下,如果模块依赖于远程包,且网络连接不稳定,可能会阻止链接过程完成。
  1. 环境变量设置
  1. pnpm需要正确的环境变量来定位和链接模块。检查环境变量是否正确配置。
  1. 模块结构不正确
  1. 被链接的本地模块必须是一个有效的Node.js包,包含package.json文件,并且结构符合npm包规范。
  1. 虚拟存储机制冲突
  1. pnpm使用了特有的虚拟存储(vstore)机制,如果存在已经存在的缓存冲突或其他与vstore相关的技术问题,可能会影响链接操作。
  1. 已存在的全局链接或项目链接
  1. 如果目标模块已经通过其他方式全局链接或在当前项目中链接过,可能导致新的链接操作无法成功。


相关文章
|
存储 缓存 资源调度
包管理npm、yarn、pnpm区别
包管理npm、yarn、pnpm区别
120 0
|
5月前
|
存储 缓存 资源调度
你真的知道 NPM、Yarn 与 PNPM 这三个前端包管理器之间的区别吗?
【6月更文挑战第9天】NPM、Yarn和PNPM是主流前端包管理器,各有特色。NPM生态庞大,易用但速度慢;Yarn速度快,依赖管理稳定;PNPM性能优异,节省磁盘空间。Yarn和PNPM在速度和确定性上胜出,NPM因广泛使用和丰富资源领先。开发者可根据项目需求和喜好选择,三者共同推动前端开发进步。
148 8
|
5月前
|
存储 缓存 资源调度
npm、yarn与pnpm详解
npm、yarn与pnpm详解
129 0
|
6月前
|
存储 资源调度 JavaScript
pnpm、npm、yarn是什么?怎么选择?
pnpm、npm、yarn是什么?怎么选择?
213 2
|
6月前
|
JavaScript Unix Shell
#! /usr/bin/env node 命令与 npm link 建立项目间软连接(一)
#! /usr/bin/env node 命令与 npm link 建立项目间软连接(一)
121 0
|
6月前
|
缓存 前端开发 JavaScript
NPM进阶知识与用法详解(二)
NPM进阶知识与用法详解(二)
110 0
|
6月前
|
存储 JavaScript 前端开发
NPM进阶知识与用法详解(一)
NPM进阶知识与用法详解(一)
123 0
|
6月前
|
缓存 资源调度 JavaScript
npm、pnpm和yarn【简单了解】
npm、pnpm和yarn【简单了解】
49 2
|
6月前
|
存储 缓存 资源调度
三巨头对决:深入了解pnpm、yarn与npm
三巨头对决:深入了解pnpm、yarn与npm
833 0
|
6月前
|
缓存 资源调度 前端开发
npm、yarn、pnpm 如何删除缓存文件?
在前端工程化的环境下,频繁的安装、更新、移除依赖,总会产生一些不活跃的 npm 依赖包,一直隐藏在某个角落里。
181 5

推荐镜像

更多