包管理器的演变
通过 Node.js 官方内置可以看出,目前前端领域最火的包管理工具主要是 npm( Node.js 直接内置)、yarn (corepack 内置) 以及 pnpm (corepack 内置)。
因此,本文主要是围绕这三者来阐述包管理工具在迭代演进中提出的一些创新性特性以及其遇到困难是如何解决问题的。
NPM
- pnpm - 快速、节省磁盘空间高效的包管理器
- npm - JavaScript 包管理工具
- yarn - 现代包管理工具,拆分成多个不同的包
- yalc - 更适用的前端 link 工具
- nrm - 快速切换 npm 注册服务商,如 npm、cnpm、nj、taobao
- cnpm - NPM 中国区镜像客户端
NPM 是什么
NPM(node package manager),通常称为 node 包管理器。顾名思义,它的主要功能就是管理 node 包,包括:安装、卸载、更新、查看、搜索、发布等
一般伴随着 Node 一起被下载来,就是说你下载了 Node,意味着也下载了 NPM
npm 官网:https://www.npmjs.com/
npm 官网文档:https://docs.npmjs.com/
npm 中文教程:https://www.npmjs.cn/
npm 菜鸟教程:https://www.runoob.com/nodejs/nodejs-npm.html
NPM 常用命令行
npm init
初始化,加 -y 一键
npm install npm@latest -g
升级到最新
npm cache clean -f
npm 清除缓存
npm publist
将包推送到远程仓库
npm update
升级包
npm audit fix
修复包的安全漏洞并升级
pm2 monit <AppName>/<id>
监控这个进程的 CPU 和内存信息
pm2 delete <AppName>/<id>
删掉
npm version的含义
npm version 是 Node.js 包管理器 npm 中的一个命令,它用于管理和更新项目的版本号。npm 版本号遵循语义版本控制(SemVer)规范,其格式为 主版本号.次版本号.修订号
(major.minor.patch)。各部分的含义如下:
- 主版本号(major):当你做了不兼容的 API 修改时增加此版本号。
- 次版本号(minor):当你在不破坏兼容性的前提下添加功能时增加此版本号。
- 修订号(patch):当你做了向下兼容的问题修正时增加此版本号。
PNPM
pnpm 在依赖包管理方式上舍弃了 npm 的那一套,而是巧妙利用 symbol link 和 hard link 做出了自己的创新
symbol
npm 扁平化 node_modules 之后带来了新的问题,而 pnpm 利用符号链接(symbol link)的方式重新设计了 node_modules 的结构来处理扁平化带来的问题
复用之前提到过的依赖关系:
Application -> A_v1 -> B_v1
-> C_v1 -> B_v2
-> D_v1 -> B_v2
hard link
pnpm 在安装过程中,会在全局的 store 目录中去存储依赖包,然后在对应的 node_modules 中创建相应的硬链接。由于不能对目录进行 hard link,因此不像 npm 一样缓存的是压缩包,pnpm 是将依赖包的每个文件都缓存到 store 中,然后创建相应文件的硬链。
总结:
- npm与yarn两者设计类似 都有幽灵依赖问题
- yarn比npm在依赖提升更智能一点 节约磁盘体积好一点 其他没啥区别了...
- pnpm从设计层面解决了幽灵依赖问题 但是在使用时存在兼容性问题 感觉还是要慎用
cnpm
快速、节省磁盘空间高效的包管理器。
因为 npm 的服务器在国外,使用 npm 下载太慢,一般使用 cnpm 加速
npm install -g cnpm --registry=https://registry.npm.taobao.org
--save 与 --save-dev 的区别
只要 npm install X,就会把 X 包安装到 node_modules 中,区别在于
- 什么都不写,不会添加到 package.json
- --save(或者 -S),会在 dependencies 属性下添加 X
- 生产环境下使用
- --save-dev(或者 -D),会在 devDependencies 属性下添加 X
- 开发环境下使用
package.json
- read-pkg-up - 读取最近的 package.json 文件
- node-pkginfo - 从 package.json 读取属性的简单方法
- pkg-dir - 查找 npm 包的根目录
- read-pkg - 读取 package.json 文件
- write-pkg - 写入 package.json 文件
- read-package-json-fast - 类似 read-package-json, 但更快
属性说明
- name 包名
- version 版本
- description 描述
- homepage 官网 url
- author 作者
- dependencies 生产依赖包列表
- devDependencies 开发依赖包列表
- ...
如何升级项目中的包
使用 npm outdated
查看有哪些过时的包
若要将所有软件包更新到新的主版本,则全局地安装 npm-check-updates
软件包:
npm install -g npm-check-updates
然后运行:
ncu -u
这会升级 package.json
文件的 dependencies
和 devDependencies
中的所有版本,以便 npm 可以安装新的主版本。
现在可以运行更新了:
npm update
如果只是下载了项目还没有 node_modules
依赖包,并且想先安装新的版本,则运行:
npm install