背景
一直觉得npm、cnpm、yarn的安装删除基本一样用哪个都行,不过俗话说的好,实践出真知,这里记录一下今天简单测试得到的结果总结。
可能会有错误,希望大家评论指正,十分感谢。
测试电脑系统:Mac
初始化
步骤:在三个文件夹里分别执行以下命令
npm init
cnpm init
yarn init
结果都是添加了一个package.json文件
安装包
步骤:在三个文件夹里分别用三种命令安装包,然后在不同文件夹换命令安装,查看文件变化情况
npm i dayjs
- 较其他两种方式速度慢些
- 自动生成了package-lock.json
- node_modules中只有一个dayjs包
- dependencies依赖里有dayjs
yarn add moment
安装成功,package-lock.json中没有moment版本锁
cnpm i dayjs
- 没有生成lock文件
- node_modules里有两个包(不重要)
- dayjs没有加入到dependencies中,使用
cnpm i dayjs -S
才能加进去
yarn add dayjs
- 生成了yarn.lock文件
- node_modules里有dayjs包和.yarn-integrity文件(感觉是存储依赖版本的hash值,
yarn check --integrity
可能会用到) - dependencies依赖里有dayjs
npm i moment
安装成功,yarn.lock中没有moment版本锁
删除包
删除步骤尝试略多,不赘述,直接一起总结。
测试结果
- 如下图,上面是npm、yarn安装的包,下面是cnpm安装的包
npm i xxx
默认参数为 -S,改变package.json和package-lock.json,同时会删除掉cnpm安装的包(不管cnpm是否带参)npm r xxx
,改变package.json和package-lock.json,删除存在与依赖的包时,同时会把没有在依赖里的其他包删除掉(比如没有加参数的用cnpm安装的包),有在依赖里的其他包会被更新 由
变成
cnpm i xxx / cnpm r xxx
只能安装 / 删除包,不改变任何配置文件cnpm i xxx / cnpm r xxx
带 -S / -D 参数时,只改变package.json,不改变锁文件yarn add xxx
默认参数为 -S,改变package.json和yarn.lockyarn remove xxx
找不到没有写入package.json依赖的包,无法删除;写入package.json依赖的可以删除yarn remove xxx
改变package.json和package-lock.json,删除存在与依赖的包时,同时会把没有在依赖里的其他包删除掉(比如没有加参数的用cnpm安装的包),有在依赖里的其他包会被更新
✨理论总结✨
能改变package.json的命令
- npm、yarn
- cnpm带 -S / -D 参数时
锁文件的改变
- package-lock.json文件只由npm改变
- yarn.lock文件只由yarn改变
- cnpm带不带参数都无法影响两个锁文件
cnpm安装的包会受到的影响
- npm、yarn安装包时会把cnpm不带 -S / -D 安装的其他包删除
- npm、yarn删除包时会把cnpm不带 -S / -D 安装的其他包删除,有在依赖里的cnpm安装的其他包会被更新
- npm安装包时会把cnpm带 -S / -D 安装的其他包删除,但package.json里依赖不会被删除,这时再执行npm删除,会按照依赖把误删的其他包装回来,但是继续安装不会装回来。(ps:有点秀~)
- yarn安装包时会把cnpm带 -S / -D 安装的其他包更新
- npm能直接删除cnpm不带 -S / -D 安装的包
- yarn不能直接删除cnpm不带 -S / -D 安装的包,会提示找不到包
(cnpm带不带 -S / -D归根结底是有没有在package.json中添加依赖)
附一个小知识
代码语言:javascript复制yarn check //检查package.json里的依赖版本和yarn.lock里是否一致
yarn check --integrity //检查package.json里的依赖版本的hash值和yarn.lock里是否一致,有助于验证包依赖没有更改