各类包管理工具的使用

package.json文件

package.json 文件其实就是对项目或者模块包的描述,里面包含许多元信息。比如项目名称,项目版本,项目执行入口文件,项目贡献者等等

package.json的字段含义

必须字段

有几个字段是package必须填写的,会在执行npm init的时候填写:
◎ name:项目名称,必需字段。
◎ version:项目版本,必需字段。
◎ main:入口文件。
◎ license:项目遵守的许可证。
◎ scripts:可运行的npm命令。
◎ keywords:关键字。
◎ author:作者。
◎ description:项目描述。
使用npm init -y可以简化必填的操作,默认都是yes

scripts配置

scripts这个配置都是可执行的脚本命令,可以配置启动项目、测试脚本等,在前端工程中是不可或缺的重要配置之一:

"scripts": {
    
    
    "dev": "node index.js",
    "predev": "node preIndex.js",
    "postdev": "node postIndex.js"
},

devDependencies、dependencies配置

依赖包:npm包声明会添加到dependencies或者devDependencies中。
dependencies中声明的是项目在生产环境中所必需的包。运行npm install xxx --save或者npm install xxx
devDependencies中声明的是开发阶段需要的包,如Webpack、ESLint、Babel等,用来辅助开发。打包上线时并不需要这些包,所以要根据包的实际用途把它们声明在适当的位置。运行npm install xxx --save-dev或者npm install xxx -D

Babel配置

可以对项目中ES6—7的代码转换配置等等,大多数都是Babel编译配置

"babdel" : {
    
    
  	"presets": ['@babel/preset-env'],
  	"plugins": [...]
 }

为什么安装的依赖版本都是三位,代表什么意思呢?

版本规范是X.Y.Z
X主版本号:发生一些重大版本更新才会修改
Y次版本号:增加了新功能才会修改
Z修订号:修复bug才会修改
注意:1.0.0和^1.0.0和~1.0.0的区别
1.0.0代表写死版本,npm install的时候是一定会安装这个版本
^1.0.0代表如果当前包有更新的版本,例如现在升级到1.1.1了,那么npm install的时候会自动安装到1.1.1的版本,
~1.0.0也跟^1.0.0差不多,区别是 ^1.0.0代表X不会变,Y.Z会随着最新的版本发生改变~1.0.0代表X和Y不变,Z保存最新的版本

npm install的原理

在这里插入图片描述

package-lock.json文件

如果重新 npm install 的时候以及当node_modules文件夹并不存在或被删除时,需要用到npm install重新装载全部依赖时,通过package-lock.json可以直接表明下载地址和相关依赖,就无需再从package.json逐个分析包的依赖项,因此会大大加快安装速度,package-lock.json目的就是确保所有库包与你上次安装的完全一样

如果要升级package-lock.json里面的库包
npm install [email protected]

npm和yarn的区别

共同点:yarn和npm都是包管理工具,可以说yarn是npm的优化版

不同点:
yarn支持并行安装(服务器速度快,导致下载速度快),可同时执行多个任务,而npm 需等待上一个任务安装完成才能运行下一个任务;
yarn支持离线模式安装,如果已经安装过一个包,那么用 yarn 再次安装会从缓存中获取,而 npm 会从网络下载;
yarn支持版本锁定,用yarn安装包会默认有一个 yarn.lock 文件锁定版本,保证环境统一,而 npm 默认从网络下载最新的最稳定的。(注意:npm 可以通过命令实现版本锁定,版本锁定可以解决包之间版本不兼容问题,即:npm install --save 包名称@版本号)
yarn 安装包时输出的信息较少,npm 输出信息冗余。

npm和cnpm的区别

(1) 两者之间只是 node 中包管理器的不同。
(2) npm是node官方的包管理器。cnpm是个中国版的npm,是淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm。
(3)如果因为网络原因无法使用npm下载,那cnpm这个就派上用场了。
一定切记切记,npm和cnpm只是下载的地址不同,npm是从国外下载东西,cnpm是从国内下载东西。

npx的使用

示例:
假设有一个名为my-package的软件包,想要执行它。

好吧,若没有npx,要执行一个软件包,必须通过其本地路径运行来完成,如下所示:

./node_modules/bin/my-package

或在 package.json文件的 scripts section中将其定义为单独的脚本,如下所示:

{
    
    

"name":"something",

"version": "1.0.0",

"scripts": {
    
    

"my-package":"./node_modules/bin/my-package"

}

}

然后使用npm run my-package运行。

现在,运用npx,只需运行npx my-package.,即可轻松实现此目的。
例2:
一个在nodemodules中安装的包在全局也安装了,在当前目录下执行xxx --version发现找到的是全局的版本,要想获得当前nodemodules中的版本,执行npx xxx --version即可得到。

pnpm的使用

之前的状况:一个电脑上有十几个项目,但是在之前的包管理工具中,都不能解决一个问题,那就是这十几个项目假如都是vue,那么都会引用一份vue的包,并且独立存在,这样会造成电脑内存过大。

最大的优点:快速的,节省磁盘空间的包管理工具。

pnpm到底做了什么
1、当使用npm或yarn时,如果你有100个项目,并且所有项目都有一个相同的依赖包,那么,你在硬盘上就需要保存100份该相同依赖包的副本。

2、如果是使用pnpm,依赖包将被存放在一个统一的位置,因此:
如果你对同一依赖包使用相同的版本,那么磁盘上只有这个依赖包的一份文件;
如果你对同一依赖包需要使用不同的版本,则仅有版本之间不同的文件会被存储起来;
所有文件都保存在硬盘的统一的位置:
当安装软件包时,其包含的所有文件都会硬链接到此位置,而不会占用而外的硬盘空间;
这让你可以在项目之间方便地共享相同版本的依赖包。

软连接和硬连接的概念

软连接就是一类引用,比如快捷方式,这个快捷方式保存的就是一个路径,如果原始文件被删除,所有指向它的符号链接也就都被破坏了
硬连接就是一个真实指向数据的单元,当移动或者删除原始文件时,硬链接不会被破坏,因为它所引用的是文件的物理数据而不是文件在件结构中的位置

pnpm的原理

如果使用的是pnpm,依赖包将被存放到一个硬盘上的统一的位置

当安装软件包时,其包含的所有文件都会硬连接到此位置,而不会占用额外的硬盘空间;
这让你可以在项目之间方便地共享相同版本的依赖包;
同时会建立软连接放到node Modules中
在这里插入图片描述

pnpm创建非扁平化的node Modules

■当使用npm或Yarn安装依赖包时,所有软件包都将被提升到node_ modules 的根目录下,也就是扁平化
其结果是,源码可以访问本不属于当前项目所设定的依赖包;
而pnpm创建的是如上图的非扁平化的node Modules,其中不会显示多余的依赖包

与npm等价的命令

在这里插入图片描述
pnpm缺点是随着时间的变化,项目的增多,pnpm的store文件夹变得越来越大

猜你喜欢

转载自blog.csdn.net/wyh666csdn/article/details/128333440