当前位置: 首页 > news >正文

npm 实现原理

输入 npm install 命令并敲下回车后,会经历如下几个阶段(以 npm 5.5.1 为例):

1.执行工程自身 preinstall

当前 npm 工程如果定义了 preinstall 钩子此时会被执行。

2.确定首层依赖模块

首先需要做的是确定工程中的首层依赖,也就是 dependencies 和 devDependencies 属性中直接指定的模块(假设此时没有添加 npm install 参数)。

工程本身是整棵依赖树的根节点,每个首层依赖模块都是根节点下面的一棵子树,npm 会开启多进程从每个首层依赖模块开始逐步寻找更深层级的节点。

3.获取模块

获取模块是一个递归的过程,分为以下几步:

获取模块信息。在下载一个模块之前,首先要确定其版本,这是因为 package.json 中往往是 semantic version(semver,语义化版本)。此时如果版本描述文件(npm-shrinkwrap.json 或 package-lock.json)中有该模块信息直接拿即可,如果没有则从仓库获取。如 packaeg.json 中某个包的版本是 ^1.1.0,npm 就会去仓库中获取符合 1.x.x 形式的最新版本。
获取模块实体。上一步会获取到模块的压缩包地址(resolved 字段),npm 会用此地址检查本地缓存,缓存中有就直接拿,如果没有则从仓库下载。
查找该模块依赖,如果有依赖则回到第1步,如果没有则停止。

4.模块扁平化(dedupe)

上一步获取到的是一棵完整的依赖树,其中可能包含大量重复模块。比如 A 模块依赖于 loadsh,B 模块同样依赖于 lodash。在 npm3 以前会严格按照依赖树的结构进行安装,因此会造成模块冗余。

从 npm3 开始默认加入了一个 dedupe 的过程。它会遍历所有节点,逐个将模块放在根节点下面,也就是 node-modules 的第一层。当发现有重复模块时,则将其丢弃。

这里需要对重复模块进行一个定义,它指的是模块名相同且 semver 兼容。每个 semver 都对应一段版本允许范围,如果两个模块的版本允许范围存在交集,那么就可以得到一个兼容版本,而不必版本号完全一致,这可以使更多冗余模块在 dedupe 过程中被去掉。

比如 node-modules 下 foo 模块依赖 lodash@^1.0.0,bar 模块依赖 lodash@^1.1.0,则 ^1.1.0 为兼容版本。

而当 foo 依赖 lodash@^2.0.0,bar 依赖 lodash@^1.1.0,则依据 semver 的规则,二者不存在兼容版本。会将一个版本放在 node_modules 中,另一个仍保留在依赖树里。

5.安装模块

这一步将会更新工程中的 node_modules,并执行模块中的生命周期函数(按照 preinstall、install、postinstall 的顺序)。

6.执行工程自身生命周期

当前 npm 工程如果定义了钩子此时会被执行(按照 install、postinstall、prepublish、prepare 的顺序)。

最后一步是生成或更新版本描述文件,npm install 过程完成。

相关文章:

npm 实现原理

输入 npm install 命令并敲下回车后,会经历如下几个阶段(以 npm 5.5.1 为例): 1.执行工程自身 preinstall 当前 npm 工程如果定义了 preinstall 钩子此时会被执行。 2.确定首层依赖模块 首先需要做的是确定工程中的首层依赖&a…...

国家开放大学 练习题

学前儿童社会教育活动指导 参考试题 一、单项选择题(每小题3分,共30分) 1.《规程》第三十二条规定:“幼儿园应当充分尊重幼儿的个体差异,根据幼儿不同的心理 发展水平,研究有效的活动形式和方法&am…...

Kotlin

函数命名 针对您目前为止学到的 Kotlin 知识,下面给出了一些相关样式指南: 函数名称应采用驼峰式大小写形式,并且应该是动词或动词短语。每个语句都应单独占一行。左花括号应出现在函数开始行的末尾。左花括号前应有一个空格。 变量声明 变…...

和未来合伙人的共同价值观 - 初期

一定要互补,能力板块的互补。 价值观一定要正。 如何管理创业团队? 层级是一个公司逼不得已才要做的,每一个层级的堆积,都会带来一些压力和效率的损失,你一旦把这个团队,变成了十个十个人的团队&#xf…...

虚函数表存储的位置(解析C++内存分配及其编译分段)

先上结论:C虚函数表保存在.rdata只读数据段。编译时期由编译器确定虚函数表。虚函数表属于类,类的所有对象共享这个类的虚函数表。 c/c的内存分配 栈(stack):又称堆栈,栈是由编译器自动分配释放&#xf…...

JS如何正确销毁 VIDEO 和AUDIO 元素

销毁 VIDEO 元素意味着停止视频的播放,并释放与其相关的所有资源。 一般情况下,我们可以通过调用 VIDEO 元素的 pause() 方法来停止视频播放,然后使用 remove() 方法从 DOM 树中删除元素。 但是,仅仅这样做可能并不能完全卸载 V…...

SpringMvc第四战-【SpringMvc文件上传,下载】

目录 一.SpringMvc文件上传 1.导入依赖(在pom.xml中) 2.配置文件上传解析器(在spring-mvc.xml中) 3.前端标记多功能表单(构建一个jsp界面来操作) 4.将文件写出流,然后写入服务器 5.配置映…...

一种结合白平衡统计信息和曝光信息的软光敏算法专利学习(专利四)

图像分块: 参见下图,一幅图像大小为5*6(像素),每个像素包含R、G、B三个分量,该图像划分为4个分块,第一分块的大小为3*3像素,第二分块的大小为3*3(像素),第三分块的大小为2*3像素,第四…...

华为数通方向HCIP-DataCom H12-821题库(单选题:301-320)

第301题 某台路由器运行 IS-IS,其输出信息如图所示,下列说法错误的是? [R1]display isis sdb local verboseDatabase information for ISIS(1) Level-1 Link State Database LSPID Seq Num Checksum Holdtime…...

dll文件反编译源代码 C#反编译 dotpeek反编译dll文件后export

目录 背景下载安装dotpeek导入dll文件export导出文件参考 背景 项目合作的时候,使用前人的或者其他部门dll文件直接在机台运行,会出现很多问题,逻辑,效率等等,此时我们可以选择对他们的代码进行反编译和重构&#xff…...

地图结构 | 图解占据栅格地图原理(附Matlab建图实验)

目录 0 专栏介绍1 栅格地图1.1 应用场景1.2 基本概念 2 占据栅格地图2.1 更新模型2.2 截断策略 3 仿真实现3.1 算法流程3.2 Matlab实现 0 专栏介绍 🔥附C/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索…...

element-plus点击菜单栏全部展开问题解决

这是由子菜单项的index属性引起的,子菜单项的index属性添加相同的值时就会出现这种情况。所以为每个子菜单项添加不同的index属性值就可解决。...

React 简便获取经纬度

以下是关于React获取定位经纬度的代码解释: import React, { useEffect, useState } from react;const LocationComponent () > {const [latitude, setLatitude] useState(null);const [longitude, setLongitude] useState(null);useEffect(() > {navigat…...

【多线程】线程安全的单例模式

线程安全的单例模式 饿汉模式懒汉模式单线程版多线程版多线程版(改进) 单例模式能保证某个类在程序中只存在 唯一 一份实例, 而不会创建出多个实例,从而节约了资源并实现数据共享。 比如 JDBC 中的 DataSource 实例就只需要一个. 单例模式具体的实现方式, 分成 “饿…...

Competitive Collaboration 论文阅读

论文信息 题目:Competitive Collaboration: Joint Unsupervised Learning of Depth, Camera Motion, Optical Flow and Motion Segmentation 作者:Anurag Ranjan, Varun Jampani, Lukas Balles 来源:CVPR 时间&#x…...

非科班菜鸡算法学习记录 | 代码随想录算法训练营完结!

这俩月终于结束了233333,之后就是反复复习和背八股了吧,然后整整项目春招再投投投,感觉大部分题都有思路了但是做过的题也会没思路,还是要复习 总结 数组: 双指针用的很多,一般一个指向遍历位置&#xff0…...

C语言实现三字棋

实现以下: 1游戏不退出,继续玩下一把(循环) 2应用多文件的形式完成 test.c. --测试游戏 game.c -游戏函数的实现 game.h -游戏函数的声明 (2)游戏再走的过程中要进行数据的存储,可以使用3*3的二维数组 char bor…...

【LeetCode】35.复杂链表的复制

题目 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。 示例 1: 输入:head [[7,null],[13,0],[11,4]…...

代码大全阅读随笔(五)

数据初始化要点: 数据初始化过程很容易出错,所以请使用本章介绍的方法,来初始化数据,从而避免由于非预期的初始化值而造成的错误。 最小化变量作用域。 使用相同的变量的语句尽可能的集中在一起。 早期绑定会减少灵活性&#xff0…...

No1.详解【2023年全国大学生数学建模竞赛】C题——蔬菜类商品的自动定价与补货决策(代码 + 详细输出 + 数据集代码 下载)

时间告诉你什么叫衰老,回忆告诉你什么叫幼稚。不要总在过去的回忆里纠缠,昨天的太阳,晒不干今天的衣裳。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客…...

有什么好用的电容笔?apple pencil替代品推荐

近年来,电容笔越来越成为人们日常生活中常见的数码产品之一。电容笔的便捷性得到了消费者的认可。它逐渐取代无纸化书写。那么到底电容笔哪个品牌好呢,电容笔哪一款最好用呢,今天小编给大家总结几款市面好用的电容笔,让我们一起来…...

什么是回调函数?写出一个示例?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 回调函数⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前…...

深度学习在医疗保健领域的应用:从图像识别到疾病预测

文章目录 深度学习在医学影像识别中的应用1. 癌症检测2. 病理学图像分析3. 医学图像分割 深度学习在疾病预测中的应用1. 疾病风险预测2. 疾病诊断辅助3. 药物研发 深度学习在个性化治疗中的应用1. 基因组学分析2. 临床数据集成 深度学习在医疗保健中的挑战和未来数据隐私和安全…...

SpringBoot实现自定义environment中的value加密

environment中的value为什么要加密? 未经过加密的配置文件,密码均是采用明文密码,很容易导致信息泄露。 SpringBoot environment中的value加密代码如下 package com.xxx.core.encryption;import com.google.common.collect.Maps; import lomb…...

celery的用法--任务调度

在Celery中,任务(Task)是执行特定操作的基本单元。任务可以异步执行,可以带有参数,可以返回结果,可以链式调用,还可以设置任务优先级、超时等属性。 1.定义任务: 使用app.task装饰器…...

MyBatis-Plus学习笔记总结

一、查询 构造器分为QueryWrapper和LambdaQueryWrapper 创建实体类User package com.system.mybatisplus.model;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.…...

How Language Model Hallucinations Can Snowball

本文是LLM系列文章,针对《How Language Model Hallucinations Can Snowball》的翻译。 语言模型幻觉是如何产生雪球的 摘要1 引言2 为什么我们期待幻觉像滚雪球一样越滚越大?3 实验4 我们能防止雪球幻觉吗?5 相关工作6 结论局限性 摘要 在实…...

autojs修改顶部标题栏颜色

顶部标题栏的名字是statusBarColor 不是toolbar。难怪我搜索半天搜不到 修改之后变成这样了 代码如下: "ui"; importClass(android.view.View); importClass(android.graphics.Color); ui.statusBarColor(Color.parseColor("#ffffff")); ui.…...

arppy gis 读取text 并批量添加字段 arcpy.AddField_management

arppy gis 读取text 并批量添加字段 arcpy.AddField_management 例:给“省级行政区域”添加“A、B、C、D” 4个字段。 (1)用Excel制作出字段及其描述表,定义字段结构; (2)复制除标题行以为的内…...

Pandas中at、iat函数详解

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 at 函数:通过行名和列名来取值(取行名为a, 列名为A的值) iat 函数:通过行号和列号来取值(取第1行,第1列的值) 本文给出at、iat常见的…...

郑州做网站的多不多/百度知道登录

目录 一.什么是火墙 二. iptables和filrewalld两种工具的切换 三.firewalld 1.火墙的域 2.设定原理及数据存储 3.firewalld 的管理命令 4.firewalld高级规则 三.iptables 1.五条链 2.三张表 3.iptables 4.数据包状态 5.dnat,snat 一.什么是火墙 Natfilter 是集成到lin…...

广州大型网站建设/企业管理培训课程

电脑被病毒搞得只好重装系统,重装系统后发生了两件让我生气的小事:MSN Messager无法登陆,系统无法激活。SN无法登陆,错误代码为80048820,google了一下查询!答案是:出现这种问题一般是由于系统时间不对,先校…...

中国空间站完整图/seo优化报价公司

本节主要是要介绍下,做一个这样的测试平台,都需要提取掌握哪些技术呢?还没掌握的可以在看完本节之后,去好好学习一下相关技术。本公众号会用直白的土话给您讲讲,并不是百度百科那种晦涩难懂的定义哈。 1.Django 说到python,大家应该都会的差不多,平时写个小脚本,写个小…...

wordpress文章如何调整字体/广告咨询

与WifiMonitor.java负责监控supplicant状态不同,WifiService.java负责给supplicant下命令,WifiService.java是framework中wifi的核心模块。1 WifiService是server端,WifiManager是client端WifiService处理WifiManager发来的各种命令2 AsyncCh…...

wordpress批量后台破解工具/营销策划书格式及范文

1.使用lsof命令 lsof 是“list open files”的缩写,在linux系统中,一切可是为文件,网络连接也可视为文件,因此,我们可以通过lsof命令查看占用某个端口号的进程。 示例: lsof -i :8080 或者 lsof -i | gr…...

连云港营销型网站建设/前端seo优化

Chapter27:参数方程和极坐标27.参数方程和极坐标27.1 参数方程27.1.1 参数方程的导数27.1.2 参数定义的曲线长度27.1.3 参数化曲线的旋转体表面积27.2 极坐标27.2.1 极坐标与笛卡尔坐标互换27.2.2 极坐标中画曲线常见的极坐标曲线27.2.3 求极坐标曲线的切线27.2.4 求…...