[Node] Node.js 包管理工具详解npm yarn cnpm npx pnpm

简介: [Node] Node.js 包管理工具详解npm yarn cnpm npx pnpm

包管理工具详解npm yarn cnpm npx pnpm

1 npm包管理工具

包管理工具npm

Node Package Manager 就是Node包管理器


目前已经不仅仅是Node包管理器 在前端项目中 我们也在使用它来管理依赖的包


如 vue vue-router vuex express koa react react-dom axions babel webpack


npm的配置文件


我们每一个项目都会有一个对应的配置文件,无论是前端还是后端


这个配置文件会记录着你项目的名称,版本号,项目描述等


也会记录项目所依赖的其他库的信息和依赖库的版本号


=> 这个文件就是package.json

常见的属性

必须填写的属性:name version

name

项目的名称

version

当前项目的版本号

description

描述信息,项目的基本描述

author

作者相关信息

license

开源协议

private

记录当前的项目是否私有,为true时 npm不能发布它,防止私有项目或模块发布出去的方式

main

程序的入口,我们使用axios模块,如果有main属性 实际上是找到对应的main属性查找文件

scripts

配置一些脚本命令 以键值对的形式存在;配置后可以通过npm run命令的key来执行

dependencies 指定无论开发环境还是生成环境都需要依赖的包
我们项目实际开发用到的一些苦的模块 vue vuex vue-router react react-dom axios等
与之对应的是 devDependencies
devDependencies 一些包在生成环境是不需要的 如 webpack babel等
我们可以通过 npm install webpack --save-dev将它安装到 这个属性中
peerDependencies 还有一种项目依赖关系是对等依赖,就是 你依赖的一个包,它必须是以另外一个宿主包为前提的,如 element-plus是依赖于vue3的 ant design是依赖于 react  react-dom
engines


指定Node和NPM的版本号 在安装过程中 会先检查对应的引擎版本 如果不符合就报错

依赖的版本管理

我们会发现安装的依赖版本会出现: ^2.2.2或~2.2.2 是什么意思呢?


npm的包通常需要遵从semver版本规范


semver版本规范是X.Y.Z:


X主版本号:当你做了不兼容的API修改(可能不兼容之前的版本)


Y次版本号:当你做了向下兼容的g功能性新增(新功能增加,但是兼容之前的版本)


Z修订号:当你做了向下兼容的问题 修正(没有新功能 修复了之前的版本bug)


^和~的区别:


x.y.z:表示 一个明确的版本号


^x.y.z: 表示x是保持不变的,y和z永远安装最新的版本


~x.y.z: 表示x和y保持不变,z永远安装最新的版本

2 npm install 原理

Npm install 命令

安装npm包分两种情况:


全局安装

:npm i webpack -g

局部安装:

npm  i webpack

全局安装


全局安装是直接将某个包安装到全局;比如全局安装yarn;

JavaScript
npm i yarn -g

通常使用 npm全局安装的包 都是一些工具包 如: yarn webpack等


并不是类似于axios express koa等库文件


所以全局安装了之后并不能让我们在所有的项目中使用axios等库

项目安装

项目安装会在当前目录下生成一个node_modules文件夹


局部安装分为开发时依赖和生产时依赖

JavaScript
# 默认安装开发和生产依赖
npm i axios
# 开发依赖
npm i webpack -D
# 根据package.json中的依赖包
npm install

npm install 原理

Npm install  内部原理?


执行 npm install 他背后帮助我们完成了什么操作?


会发现一个称为package-lock.json文件 它的作用是什么?


从npm5开始 npm支持缓存策略(来自yarn的压力)缓存有什么用?

b11fa0393dc04f108725bd0d6ea77fc7.png

Npm install 原理图解析

npm install 检测是否有package-lock.json文件:


没有lock文件


分析依赖关系,因为包可能会依赖其他的包 并且多个包之间会产生相同依赖关系


从registry仓库下载压缩包(设置了镜像 会从镜像服务器中瞎子啊)


获取到压缩包后会对压缩包进行缓存(npm5开始有)


将压缩包解压到项目的node_modules文件夹中(require的查找顺序会在该包下面查找)


有lock文件:


检测lock中包版本是否跟package.json一致(会按照semver版本规范)


不一致-> 会重新构建依赖关系,直接走顶层的流程


一致的-> 会优先查找缓存  要是没找到 会从registry仓库下载 直接走的顶层流程


查找到.会获取缓存中的压缩文件,并将压缩文件解压到node_modules文件夹中

package-lock.json

package-lock.json文件解析:


name:项目名称


version:项目的版本


lockfileVersion:lock文件的版本


requires:使用requires来跟踪模块的依赖关系


当前项目依赖axios 但是axios依赖follow-redireacts


axios中的属性如下:


Version 表示实际安装的axios版本


Resolved 用来记录下载的地址 registry仓库中的位置


requires/dependencies 记录当前模块的依赖


Integrity 用来从缓存中获取索引 在通过索引去获取压缩包文件

npm其他命令

卸载某个依赖包

Npm uninstall package
Npm uninstall package --savs-dev
Npm uninstall package -D

强制重新bulid(重新构建)

Npm rebuild(很少用)

清除缓存

Npm cache clean

3 yarn cnpm npx

yarn工具

另一个node包管理工具yarn:


yarn是由 Facebook Google Exponent 和 Tilde 联合推出一个新的JS包管理工具


yarn是为了弥补早期npm的一些缺陷而出现的


早期的npm存在许多缺陷,如 安装依赖速度慢 版本依赖混乱等


虽然从npm5版本开始 进行了很多的升级改改进 但是依然很多人喜欢使用yarn


bd74789898ef484a8652ba647f183dda.png

cnpm工具

由于一些特殊原因,没办法很好的从https://registry.npmjs.org下载需要的包


查看npm镜像:

Npm config get registry # npm config get registry

我们可以直接设置nom的镜像:

Npm config set registry https://registry.npn.taobao.org

大多数人来说 并不希望将npm镜像修改


第一:不太希望随意修改npm原本从官方下来包的渠道


第二:担心某天淘宝的镜像不维护了,又要改来改去

4 发布自己的包

Npm 发布自己的包注册npm账号:

https://www.npmjs.com/


选择sign up


命令行登录:


Npm login


修改package.json


发布到npm registry上


Npm publish


更新仓库:


1 修改版本号(最好符合semver规范)


2 重新发布


删除发布的包


Npm unpublish


让发布的包过期


Npm deprecate

5 pnpm使用和原理

pnpm解决了 不用每个项目都有一个(节省磁盘空间)

什么是pnpm呢?

pnpm:理解为 performant npm 缩写;

硬链接和软链接的概念

硬链接(hard link):


硬链接:电脑文件系统中的多个文件平等地共享同一个文件存储单元


删除一个文件名字后,还可以用其他名字继续访问该文件


符号链接(软链接soft link Symbolic link)


符号链接 是一类 特殊的文件


包含有一条以绝对路径或者相对路径的形式指向其他文件或者目录的引用


(左图:符号链接 右图:硬链接)

810688f1f9a64c2c98750bfc7a726370.png

pnpm到底做了什么呢?

当使用 npm 或Yarn时 如果有100歌项目 且 所有项目都有一个相同的依赖包,那么你在硬盘上就需要存100份该相同依赖包的副本


如果使用pnpm 依赖包将被 存放在一个统一的位置,因此:


如果你对同一依赖包使用相同的版本 那么自盘上只有这个依赖包的一份文件


同一依赖包需要使用 不同版本 则仅有版本之间不同的文件会被存储起来


所有文件都保存再硬盘上的统一位置:


当安装软件包时候 其包含的所有文件都会硬链接到此位置,而不会占用额外的硬盘空间


这让你可以再项目指尖方便地共享相同版本的 依赖包


4f15dcdbdfc142889c4268a977470fbb.png

pnpm创建非扁平的node_modules目录

当使用npm或 Yarn Classic安装依赖包时 所有软件包都将被提升到node_modules的根目录下


源码可以访问 本不属于当前项目所设定的依赖包

4d01b9b7baae49308296e79a9296863d.png

pnpm的安装和使用

如何安装pnpm?


官网提供了很多种方式来安装pnpm: https://www.pnpm.io/


使用npm

JavaScript
npm install -g pnpm

npm命令

pnpm等价命令

Npm install

Pnpm install

Npm install <pkg>

Pnpm add <pkg>

Npm uninstall <pkg>

Pnpm remove <pkg>

Npm run <cmd>

Pnpm <cmd>

Pnpm的存储store

在pnpm7.0之前,统一的存储位置是 ~/.pnpm-score中的


在pnpm7.0之后,统一的存储位置进行了改变:

<pnpm home directory>/store

在Linux上 默认是

~/local/share/pnpm/store

在Windows上:

%LOCALAPPDATA%/pnpm/store

在macOS上:

~/Library/pnpm/store

我们可以通过一些命令 获取这个目录:获取当前活跃的store目录


Pnpm store path


另外一个非常重要的store命令是 prune(修剪):从store中删除当前未被引用的包来释放store的空间


Pnpm store prune

相关文章
|
1月前
|
JavaScript
Nodejs的cnpm包管理器快速入门
介绍Node.js的cnpm包管理器,包括cnpm的实现原理、如何安装cnpm、使用cnpm安装软件包,以及Node.js搜索包的流程。
26 2
Nodejs的cnpm包管理器快速入门
|
14天前
|
数据安全/隐私保护
发布一个npm包
发布一个npm包
|
2月前
|
缓存 JavaScript 安全
2022年最新最详细的安装Node.js以及cnpm(详细图解过程、绝对成功)
这篇文章提供了2022年最新最详细的Node.js和cnpm安装教程,包括步骤图解、全局配置路径、cnpm安装命令、nrm的安装与使用,以及如何管理npm源和测试速度。
2022年最新最详细的安装Node.js以及cnpm(详细图解过程、绝对成功)
|
2月前
|
资源调度 前端开发 JavaScript
谈后端人眼里的 nvm、yarn、pnpm……
虽然我是做后端的,但也时常关注前端,只是最近觉得前端的各种工具名称太眼花缭乱了,nvm、yarn、pnpm、taro……
23 4
2071 verbose node v16.6.0 2072 verbose npm v7.19.1或者 no such file or directory, lstat ‘D:\wor
该博客文章提供了解决在使用npm版本7.19.1时出现的"no such file or directory"错误的具体方法,建议通过降级npm到6.14.8版本来解决问题,并确认了该方法可以成功安装node_modules。
2071 verbose node v16.6.0 2072 verbose npm v7.19.1或者 no such file or directory, lstat ‘D:\wor
|
2月前
|
缓存 JavaScript 前端开发
成功解决:npm 版本不支持node.js。【 npm v9.1.2 does not support Node.js v16.6.0.】
这篇文章介绍了如何解决npm版本与Node.js版本不兼容的问题,提供了查看当前npm和Node.js版本的步骤,以及如何根据Node.js版本选择合适的npm版本并进行升级的详细指导。
成功解决:npm 版本不支持node.js。【 npm v9.1.2 does not support Node.js v16.6.0.】
|
2月前
NPM——删除已发布的包
NPM——删除已发布的包
55 1
|
2月前
|
JavaScript 前端开发 开发者
从零到一:教你如何发布自己的npm插件包
从零到一:教你如何发布自己的npm插件包
|
2月前
Mac卸载 Node npm,升级 Node
Mac卸载 Node npm,升级 Node
53 0
|
2月前
|
JavaScript
GitHub——自动发布NPM包
GitHub——自动发布NPM包
14 0

推荐镜像

更多
下一篇
无影云桌面