包管理工具
最初的包管理工具是npm,其余的包管理工具是通过npm进行发展的,npm(Node Package Manager),也就是node包管理器,是用于管理项目中所依赖的第三方包。
npm
npm包管理工具是为了我们项目进行依赖管理的工具,在npm出现之前,项目依赖都是手动下载和管理引入的。在npm出现之后,可以通过npm install xxx的方式将第三方依赖的信息(包括名称和版本号)存储在package.json的dependencies字段中,并且将下载的文件保存到node_modules文件夹中。
package.json文件中的字段
package.json文件中会包括项目的名称(name)、项目版本号(version)、项目描述(description)、项目执行入口(main)等字段,也会在dependencies字段中记录着项目所依赖的第三方库的名称以及版本号,这个文件可以通过npm init 手动配置,也可以通过npm init -y快速实现默认配置。
dependencies依赖类型
dependencies
通过npm install xxx安装,表示这个依赖实在项目运行时的依赖,比如axios,在项目运行的时候需要使用的依赖。
devDependencies
通过npm install -D或者npm install --save-dev安装,表示该依赖实在开发时的依赖,打包build时,不会打进包里,是用来辅助我们开发的,比如项目中使用的 gulp ,压缩 css、js 的模块。这些模块在我们的项目部署后是不需要的。
peerDependencies
这个属性比较特殊,只会在发布自己的包时才会用到,或者说某个包是在为另一个包开发插件时才会用到,或者说有些模块必须需要其他模块作为前提才能使用,这个时候在那个模块的packag.json文件里面的peerDependencies会有标注。比如element-plus使用的前提就是需要有vue。
npm install的执行原理
当我们npm install xxx时,会在package-lock.json中创建依赖,并记录当前项目所用依赖的版本号,当我们删除node_modules文件夹时而保存package.json和package-lock.json文件时,执行npm install时会有下列两种不同情况。
- 当package.json和package-lock.json中的版本号不一致时执行npm install下载包时,会下载package.json中的包的版本,并且更新package-lock.json中的包的版本与package.json中相同例如:
- 如果两者是同一状态,那么执行
npm i
都会根据lock下载,不会理会package实际包的版本是否有新。
附一张看到的关于npm install的原理图
npm常用命令
npm list -g --depth 0 查看全局安装过的模块
npm init 生成 package.json 文件(需要手动选择配置)
npm init -y 生成 package.json 文件(使用默认配置)
npm i/install 一键安装 package.json 下的依赖包
npm i xxx 在项目中安装包名为 xxx 的依赖包(配置在 dependencies 下)
npm i xxx --save 在项目中安装包名为 xxx 的依赖包(配置在 dependencies 下)
npm install xxx@latest 更新包的版本至最新
npm i xxx --save-dev 在项目中安装包名为 xxx 的依赖包(配置在 devDependencies 下)
npm i -g xxx 全局安装包名为 xxx 的依2赖包
npm update -g xxx 更新全局安装的包
npm uninstall -g xxx 卸载全局安装的包
npm run xxx 运行 package.json 中 scripts 下的命令
npm home xxx 打开 xxx 包的主页
npm repo xxx 打开 xxx 包的代码仓库
npm publish 将当前模块发布到 npmjs.com,需要先登录
yarn
yarn也是一个包管理器,它和npm其实没有本质区别,都是管理和安装包的。只是它解决了早期npm的一些问题比如:不支持离线模式、树形结构的依赖、依赖安装不确定性等。为什么说是早期?因为npm新版本基本上已经解决了自身的老毛病,两者没有想象中那么大的区别。
早期的yarn相对于npm比较大的优势:
支持离线安装(npm@5已支持)
依赖扁平化结构(npm@3已支持)
依赖安装确定性yarn.lock(npm@5增加了package-lock.json)
安装速度快并行下载
安装失败自动重试
关于yarn的并行下载
在npm中,是按照队列中的顺序去下载每一个依赖的,也就是当前依赖没有下载完毕是不会去下载其他依赖的,而yarn下载依赖的方式是并行的,会同步执行所有依赖的下载。
yarn常用命令
yarn set version latest 将yarn更新至最新版本
yarn init 初始化项目,生成 package.json 文件(需要手动选择配置)
yarn init -y 生成package.json文件(使用默认配置)
yarn/yarn install 安装所有依赖项
yarn serve 默认运行vue项目文件同于npm run serve
yarn build 默认打包vue项目同于npm run build
//添加依赖包
# 在项目中安装包名为 xxx 的依赖包(配置在 dependencies 运行时依赖 下),同时 yarn.lock 也会被更新
yarn add [package]
yarn add [package]@[version]
yarn add [package]@[tag]
# 全局安装包名为 xxx 的依赖
yarn global add xxx
//将依赖项添加到不同的依赖类别中
yarn add [package] --dev # dev dependencies
yarn add [package] --peer # peer dependencies
//更新依赖包
yarn up/upgrade [package] (默认更新至最新版本)
yarn up/upgrade [package]@[version]
yarn up [package]@[tag]
//删除依赖包
yarn remove [package]
cnpm
cnpm与npm的不同两者之间只是node中包管理器的不同。 npm是node官方的包管理器。cnpm是个中国版的npm,是淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm。如果因为网络原因无法使用npm下载,那cnpm这个就派上用场了。
npm和cnpm只是下载的地址不同,npm是从国外下载东西,cnpm是从国内下载东西。
由于国内下载国外的包,下载的网速可能会很慢甚至失败,所以此时就可以通过国内镜像,可以通过下列方式查看当前镜像并修改镜像。
# 查看npm镜像:
npm config get registry
# 我们可以直接设置npm的镜像:
npm config set registry https://registry.npm.taobao.org
如果不想直接修改npm的下载路径(国外下载路径更改为国内淘宝镜像),我们可以下载cnpm,并将cnpm的镜像设置为淘宝镜像。
npm install -g cnpm --registry=https://registry.npm.taobao.org
pnpm
pnpm 项目的初始状态看起来就像一个 npm 项目一样,也是有 package.json 文件 和 node_modules 文件夹,不同的是在 node_modules 文件夹中, 它有自己的文件夹目录 .pnpm,在这个目录中,它会用平铺的方式来存储各个包,然后以依赖名和版本号的名字命名,实现了版本的复用。而且它不是通过拷贝机器缓存中的依赖到项目目录下,而是通过硬链接的方式,这能减少空间占用。
pnpm到底做了什么
- 当使用 npm 或 Yarn 时,如果你有 100 个项目,并且所有项目都有一个相同的依赖包,那么, 你在硬盘上就需要保存 100 份该相同依赖包的副本。
- 如果是使用 pnpm,依赖包将被存放在一个统一的位置,因此:
- 如果你对同一依赖包使用相同的版本,那么磁盘上只有这个依赖包的一份文件;
- 如果你对同一依赖包需要使用不同的版本,则仅有版本之间不同的文件会被存储起来;
- 所有文件都保存在硬盘上的统一的位置:
- 当安装软件包时,其包含的所有文件都会硬链接到此位置,而不会占用额外的硬盘空间;
- 这让你可以在项目之间方便地共享相同版本的依赖包;
总结
npm
是一个包管理器,方便开发者分享和下载开源包。经历了许多重大版本的更新,各方面已经和yar
n在同一水平。cnpm
是方便中国开发者下载依赖包而诞生的下载器。yarn
解决了npm@5
之前的一些让人诟病的问题,同时拥有一些其它的优点。例如离线安装、失败自动重试安装和并行下载等。pnpm
通过连接的方式,让多个项目的依赖公用同一个包,大大节省了磁盘空间,比yarn
和npm
下载速度快得多,但是也有连接带来的各种兼容问题。