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文件夹变得越来越大