Article
nvm 版本管理与 pnpm 对比笔记
解决 nvm list available 返回空的镜像配置问题,并对比 pnpm 与 npm 在依赖存储与安装速度上的差异。
nvm 版本管理
nvm list available 查看版本为空
解决办法:
- 查看配置的镜像地址
$ npm config get registry
https://registry.npmmirror.com/
// 已经配置了镜像地址

npm config list,查看目录
- 找到
.npmrc文件,并进入修改
输入:
home=https://npmmirror.com
registry=https://registry.npmmirror.com/

- 再次查看,修改成功

- 找到
nvm安装路径,打开setting.txt文件。没有则创建一下
- 修改完
setting.txt文件的镜像配置即可,设置node_mirror和npm_mirror为:node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror: https://npmmirror.com/mirrors/npm/

查看可安装的 node 版本 ,nvm list available 即可看到可安装版本信息

安装使用 14版本的node成功

pnpm vs npm
npm 的平铺目录结构
- 从 npm v3 开始,npm 使用平铺的依赖结构。 这可以减少磁盘空间占用, 但却导致
node_modules目录的混乱。 - pnpm 通过使用硬链接和符号链接到全局磁盘内容可寻址存储来管理
node_modules。 带来减少磁盘空间使用的好处,同时还保持您的node_modules是干净的。
pnpm 正确的 node_modules 结构的好处在于,它有助于避免愚蠢的错误,因为它让你无法使用不是 package.json 中指定的模块。
安装
pnpm 不允许安装 package.json 中没有包含的包。 如果没有参数传递给 pnpm add,包将保存为常规依赖项。 与 npm 一样, --save-dev 和 --save-optional 可以是用于安装包作为开发或可选的依赖。
由于此限制,项目在使用 pnpm 时不会有任何无关的包,除非它们删除依赖项并将其保留为孤立的。 这就是为什么 pnpm 的实现的 prune command 不允许你指定包来修剪 - 它总是去除所有多余的和孤儿包。
安装 pnpm
npm install -g pnpm
或者
npm install -g @pnpm/exe
| Node.js | pnpm5 | pnpm6 | pnpm7 | pnpm8 |
|---|---|---|---|---|
| node V12 | √ | √ | × | × |
| node V14 | √ | √ | √ | × |
| node V16 | 未知 | √ | √ | √ |
| node V18 | 未知 | √ | √ | √ |
查看安装位置
使用 Git Bash 查看
$ which pnpm
目录依赖
目录依赖以 file: 前缀开始,指向文件系统的目录。 与 npm 一样,pnpm 符号链接这些依赖项。 与 npm 不同的是,pnpm 不执行这些文件依赖项的安装。
这意味着如果您有一个名为 foo (<root>/foo) 的包,它有 bar@file:../bar 作为依赖项,则当你在 foo 上执行 pnpm install 时, pnpm 将不会为 <root>/bar 安装。
PNPM的局限
npm-shrinkwrap.json和package-lock.json被忽略。 与 pnpm 不同,npm可以多次安装相同的name@version,并且具有不同的依赖项组合。 npm 的锁文件旨在反映平铺的node_modules布局,但是,由于 pnpm 默认创建隔离布局,它无法由 npm 的锁文件格式反映出来。- Binstubs(在
node_modules/.bin中的文件)总是 shell 文件,而不是指向 JS 文件的符号链接。 创建 shell 文件是为了帮助支持插件的 CLI 的程序在特殊的node_modules结构中能够正确地找到它们的插件。 这是很少有的问题,如果您希望文件是 JS 文件,请直接引用原始文件
pnpm add 和 install
pnpm add 和pnpm install命令的本质是相同的,都可以用来安装依赖包。它们的区别在于用法和语法。
pnpm add会将安装的包名和版本号添加到package.json文件的dependencies或devDenpendencies中,pnpm install不会pnpm add支持一次性安装多个包。eg:pnpm add package0 package1 package……install用来安装项目的全部依赖
pnpm add
安装软件包以及其依赖的任何软件包。 默认情况下,任何新添加的软件包都将作为生产依赖项。
| 命令 | 用法 |
|---|---|
| pnpm add sax | 保存到dependencies |
| pnpm add -D sax | 保存到devDependencies |
| pnpm add -O sax | 保存到optionalDependencies |
| pnpm add -g sax | 安装到全局 |
| pnpm add sax@next | 安装标记为 next 的版本 |
| pnpm add sax@3.1.0 | 安装指定版本 3.1.0 |
add命令的来源:
- npm 源
- workspace内
- 本地文件
- 从远端tar包安装
- 从git安装
add命令支持的参数:
–save-prod,-P:安装到dependencies–save-dev,-D:安装到devDependencies–save-optional,-O:安装到optionalDependencies–save-exact,-E:保存的版本号会是一个具体的值,相当于锁死版本–save-peer:安装到peerDependencies和devDependencies中–ignore-workspace-root-check:允许在项目根目录添加依赖包–global,-g:安装到全局–workspace:仅添加在 workspace 内找到的依赖项
pnpm install
install 用来安装项目的全部依赖
| Command 命令 | Meaning 意义 |
|---|---|
pnpm i --offline | 使用本地缓存离线安装 |
pnpm i --frozen-lockfile | pnpm-lock.yaml is not updated |
pnpm i --lockfile-only | 只更新pnpm-lock.yaml |
install支持的参数:
–force:强制重新安装依赖。–offline: 默认值:false。如果设置了--offline参数,pnpm会只使用本地缓存的包,如果本地没有找到某个包,最终安装就会失败。可以理解为离线模式。–prefer-offline:默认值:false。如果设置了--prefer-offline参数,本地没有的包会从远端安装,其他会优先使用本地缓存的包。–prod,-P:如果环境变量中NODE_ENV被设置为production,那么pnpm不会安装任何属于devDependencies的包,如果有相关的包已经被安装了,则会清除这些包。使用这个指令pnpm会忽略NODE_ENV,强制pnpm以production的方式执行install命令。–dev,-D:仅安装devDependencies并删除已安装的dependencies。–no-optional:不安装optionalDependencies依赖。–lockfile-only:使用时,只更新 pnpm-lock.yaml 和 package.json。 不写入 node_modules 目录。–fix-lockfile:自动修复损坏的lock文件入口。–frozen-lockfile:默认值:非 CI: false。CI: true, 如果存在 lock 文件- 如果设置 true, pnpm 不会生成 lockfile,而且如果 lockfile是偏旧或不存在lockfile则会安装失败.
–reporter=name:默认值:TTY stdout: default,非 TTY stdout: append-only允许您选择将调试信息记录到终端, 以了解安装进度.silent- 控制台不展示任何信息default- TTY的默认输出append-only- 始终向末尾追加输出ndjson- 打印所有ndjson格式日志,最详细的版本–use-store-server:通过本地的store服务安装,安装完成后store服务不会自动关闭,需要使用pnpm server stop停止。
–shamefully-hoist:创建一个扁平化node_modules目录结构, 类似于npm 或 yarn。不推荐使用,可能会导致未知问题。–ignore-scripts:不执行任何项目中package.json以及依赖内定义的任何脚本。