npm内部机制与核心原理
npm的核心目标:给你、你的团队和你的公司带来最好的开源库
npm install的流程
- 解析 package.json:npm 读取项目根目录下的
package.json文件。其中包含了项目所需的各种依赖包及其版本信息。dependencies字段列出了项目运行所依赖的包。例如,"lodash": "^1.0.0"表示项目依赖lodash库,版本为1.0.0。devDependencies字段则包含了开发过程中需要的工具包,如"webpack": "^4.0.0"。
- 确定依赖树:npm 根据
package.json中的依赖关系构建依赖树。它会递归地检查每个依赖包及其依赖项,确保所有依赖都被正确安装。- 假设项目依赖
A包,A包又依赖B包,B包依赖C包。npm 会将A、B、C包以及它们的依赖关系形成一棵依赖树。 - 在这个过程中,可能会出现版本冲突。例如,
A包依赖B包的某个版本,而B包的另一个版本被其他依赖包引用。 npm 会按照一定的规则来解决这些冲突,通常优先使用满足所有依赖的最新版本。
- 假设项目依赖
- 下载依赖:npm 从官方仓库(或指定的镜像源)下载所需的依赖包。
- 它会根据依赖树的结构,依次下载每个包及其依赖项。例如,
A包依赖B包,B包依赖C包,npm 会先下载C包,再下载B包,最后下载A包。 - 下载过程中会显示进度条,告知用户下载的进度。
- 它会根据依赖树的结构,依次下载每个包及其依赖项。例如,
- 安装依赖:npm 将下载好的依赖包解压到项目的
node_modules目录中。- 它会将每个包的文件和目录结构按照指定的位置进行解压和安装。例如,
A包解压到node_modules目录下的A文件夹,B包解压到node_modules目录下的B文件夹。 - 安装完成后,npm 会更新
package-lock.json文件,记录安装的包版本以及依赖关系。
- 它会将每个包的文件和目录结构按照指定的位置进行解压和安装。例如,
npm缓存机制
获取npm的缓存路径
npm config get cache
npm在Mac的缓存路径./npm/_cacache
在安装时会根据lock文件生成唯一的key,通过key,在缓存中查找,如果有则跳过网络下载步骤,如果没有,则进行下载。
npm在下载依赖时,会下载到_cacache里面,如果有则解压到node_modules中。
以上步骤是npm下载与缓存的基本原理。
npm实用小技巧
自定义 npm init
npm 支持自定义 npm init,通过prompt()方法,获取动态产出和用户输入内容。
可以写一个JS脚本,设置自定义npm初始化
npm config set init-module .npm-init.js
通过这个命令使用自定义的JS脚本,脚本内容可以这样设置
const desc = prompt('请输入项目描述', '项目描述')
module.exports = {
key: 'value',
name: prompt('name?', process.cwd().split('/').pop()),
version: prompt('version?', '0.0.1'),
description: desc,
main: 'index.js',
respository: prompt('github repository url', '', function (url) {
if (url) {
run('touch README.md');
run('git init');
run('git add README.md');
run('git commit -m "first commit"');
run('git remote add origin ${url}');
run('git push -u origin master');
}
return url;
})
}
自定义创建过程
也可以通过这种方式设置
npm config set init.author.name "Green Fred"
npm config set init.author.email "xxx@163.com"
npm config set init.author.url "gfred.com"
npm config set init.license "MIT"
网上说返回默认设置,删除JS文件就可以,但是实测不好使,我采用的方法是在配置一遍空的文件,也可以实现默认配置的目的。
私服npm
为了保证稳定性和私密性,可以设置内部源
npm config set registry https://xxxx //设置源
搭建自己的npm私有仓库
安装nexus
下载地址:help.sonatype.com/repomanager…
进入nexus目录下的bin下
./nexus start
创建私服npm库
创建npm(hosted)
创建npm(proxy)
创建npm(group)
npm创建安装失败的处理