目录
简介:
在分析之前一定要 了解 node环境下npm这个包管理工具, 因为在使用npm进行本地安装就会生成 pacage.json 这个文件(内部记录了我们安装的包的版本信息)。 这里又引入一个本地安装的概念,
本地安装
本地安装的包又分为开发依赖(devDependencies)和生产依赖(dependencies)。
安装的包分别放到对应的依赖位置
如果想要安装的包放在开发依赖(devDependencies)中,我们传递参数 --save-dev 或 -D 即可。
如果想要安装的包放在生产依赖(dependencies)中,我们传递参数 --save 或 -S 即可。
如果既不想放在开发依赖也不想放在生产依赖,我们可以使用npm install --no-save
注意如果我们没传递依赖参数。会把包默认安装到生产依赖(dependencies)中
对于线上环境,我们只需要安装dependencies中的包,我们可以使用npm install --prod命令。
npm安装流程
1、查找 npm 的配置信息
执行安装命令之后,npm
首先会去查找 npm
的配置信息。 其中,我们最熟悉的就是安装时候的源信息。npm 会在项目中查找是否有 .npmrc
文件,没有的话会再检查全局配置的 .npmrc
,还没有的话就会使用 npm
内置的 .npmrc
文件。 具体了解npmrc文件看
2、构建依赖树
3、下载完整的依赖资源
有了依赖树 ,会根据依赖树下载依赖资源到node_modules中。 下载前会查看是否如果有缓存用缓存。 下载完整资源时会进行完整性检测 ,如果通过过了才会添加到node_modules中
4、生成package-lock.json
package-lock.json
是自动生成的,当我们使用 npm install
安装包后就会自动生成。但是package-lock.json
并不是每次都生成,只有在没有的情况下才会自动生成。
当存在并且有包的变化的时候会自动同步更新。
package.json详解
package.json
文件,它是项目的配置文件,常见的配置有配置项目启动、打包命令,声明依赖包等。package.json
文件是一个JSON
对象,该对象的每一个成员就是当前项目的一项设置。
♦ 下面只是对package.json中部分进行说明:
特殊符号
说下 package.json 内部的一些符号说明,可能很多人没注意,下面截取了package.json文件中的一部分。
"dependencies": {
"@handsontable/vue": "^12.1.2",
"axios": "^0.18.1",
"core-js": "3.6.5",
"element-ui": "2.13.2",
"express": "^4.18.2",
"handsontable": "^12.1.2",
"js-cookie": "2.2.0",
"js-md5": "^0.7.3",
"jsonp": "^0.2.1",
"jspdf": "^2.5.1",
},
^ : 兼容某个大版本,意味着下载的包可能会是更高的次版本号或者修订版本号。(也就是主版本不能变,次版本、修订版本可以随意变)。
~ : 兼容某个次版本,意味着有可能会有更高的修订版本号。(也就是主版本、次版本不能变,修订版本可以随意变)。
dependencies 生产依赖
dependencies 表示项目依赖,这些依赖都会成为你的线上生产环境中的代码组成的部分。当它关联到 npm 包被下载的时候,dependencies下的模块也会作为依赖,一起被下载。
devDependencies 开发依赖
devDependencies表示开发依赖, 不会被自动下载。这里面的包一般是程序员开发次才被用到。 比如 Webpack, 预处理器babel-loader
、scss-loader ,还有些测试工具啊等等
平时我们开发,只要不开源其实放哪无所谓。但是如果你要开源代码库就需要严格区分啦,试想下如果你把 项目 不可缺少的依赖包下到了 devDependencies中,被别人下载后没下载到该依赖是会报错运行不了的,因为当你在安装第三方包的时候,只会同步下载第三方包dependencies
里面的依赖
package-lock.json 详解
前面说了package.json
里面的包版本不是一个具体的版本,而是一个最优版本。而package-lock.json
里面定义的是某个包的具体版本,以及包之间的层叠关系。
一个 package-lock.json 里面的每个依赖主要是有以下的几部分组成的:
- Version: 依赖包的版本号
- Resolved: 依赖包的安装源(其实就是可以理解为下载地址)
- Intergrity: 表明完整性的 Hash 值
- Dev: 表示该模块是否为顶级模块的开发依赖或者是一个的传递依赖关系
- requires: 依赖包所需要的所有依赖项,对应依赖包 package.json 里
dependencices
中的依赖项- dependencices: 依赖包
node_modeles
中依赖的包(特殊情况下才存在)。并不是所有的子依赖都有dependencies
属性,只有子依赖的依赖和当前已安装在根目录的node_modules
中的依赖冲突之后, 才会有这个属性。 这可能涉及嵌套情况的依赖管理。
package-lock.json什么时候会变
package-lock.json
在npm install
的时候会自动生成。当我们修改依赖位置,比如将部分包的位置从
dependencies
移动到devDependencies
这种操作,虽然包未变,但是也会影响package-lock.json
,会将部分包的dev
字段设置为true
。还有如果我们安装源
registry
不同,执行npm install
时也会修改package-lock.json
。、当我们使用
npm install
添加或npm uninstall
移除包的时候,同时也会修改package-lock.json
。当我们更新某个包的版本的时候,同时也会修改
package-lock.json
。
如何查看安装的包版本
前面说了,
package.json
里面存储的包版本信息不是一个具体的版本,而是一个最优版本,也就是带^/~
符号的,下面说下最优的看安装包的具体版本。使用命令,
npm list --depth 0
查看本地安装的所有包信息,这种方式感觉是最好的
这里说下:
当我们的项目第一次去搭建的时候, 使用 npm install
安装依赖包, 并去提交 package.json、package-lock.json
, 至于node_moduled
目录是不用提交的。
更改npm镜像地址
npm
默认的镜像地址是国外地址https//registry.npmjs.org
,如果用这个地址安装包的话安装速度会比较慢,我们平时开发最好就是将镜像设置为淘宝镜像。
//查看本地镜像源
npm config get registry
// 设置阿里镜像
npm config set registry https://registry.npmmirror.com