从零揭秘npm install的黑科技

 更新时间:2023年05月29日 11:45:52   作者:𝑺𝒉𝒊𝒉𝑯𝒔𝒊𝒏𝒈  
通过npm package manager来安装和管理包是我们最为常见的方式之一,本文将从浅入深地带大家剖析一下npm install的执行过程,感兴趣的可以学习一下

作为一名前端开发人员,每天我们都要使用到许多的第三方包。而通过npm package manager来安装和管理这些包是我们最为常见的方式之一。但是,你是否知道当我们使用npm install安装一个包时,发生了哪些事情呢?接下来,本文将从浅入深地剖析npm install的执行过程。

浅谈npm install

什么是npm

npm,即Node.js Package Manager,是一个用于 Node.js 的包管理器。通过该软件包管理器,开发者可以下载别人编写的代码包以及发布自己编写的代码包,并在项目中引用和使用这些包。

npm包是什么

npm包实际上就是可以被复用的Node.js模块。这些模块可以是由其他开发者创建的,也可以是我们自己个人创建并且上传到npm上的。

npm install是做什么的

通过npm install,我们可以将一个或多个npm包安装到当前项目中。这样,在项目中就可以直接使用这些包,而不必担心依赖关系等问题。

npm install的内部执行过程

话不多说,现在让我们一起来看看npm install的内部执行过程吧。

第一步:读取package.json文件

首先,npm会读取当前项目中的package.json文件,该文件含有了所有相关的依赖和开发者信息。在package.json文件中,可以指定使用哪个版本的某个包。

第二步:创建node_modules文件夹

接下来,在package.json所在的目录下,npm会自动创建一个名为node_modules的文件夹。

第三步:下载依赖项

当以上两个步骤完成后,npm就开始执行真正的安装操作了。这时,它会根据package.json中定义的依赖信息,从npm registry上下载所有依赖项,并将它们放置到node_modules目录下。

值得注意的是,如果项目中的依赖项已经存在于本地缓存中,则npm会直接从本地缓存中拷贝这些依赖对象,而不是重新从registry上下载。这样做的好处是可以提高安装速度,同时避免重复下载相同版本的依赖包。

例如,我们使用以下命令来安装jQuery:

$ npm install jquery --save-dev

那么,npm就会检查package.json文件中所列出的依赖项,并将jQuery 3.4.1版本下载并安装到本地的node_modules/jquery目录下。

第四步:解决依赖项

通过上述步骤,我们成功下载并安装了我们使用到的依赖包。不过,我们的项目中还可能存在其他依赖项,这些依赖项也需要被安装到node_modules目录下。

具体来说,当npm发现项目中某个包依赖于另一个包时,它会检查该依赖包是否已经在本地缓存中。如果是,则会将该依赖项拷贝到该包的node_modules目录下;如果不是,则从npm registry上下载该包,并将其安装到本地缓存里。

例如,当前项目中使用了lodashunderscore.string两个包。其中,在package.json中,lodash是直接被定义为项目的一个依赖,而underscore.string是被定义为lodash的一个依赖。那么,在执行npm install时,会按以下顺序进行依赖项的解决:

  • 首先,npm会安装lodash包,并将其拷贝到node_modules/lodash中。
  • 接着,当npm看到在package.json文件中定义了underscore.string的依赖项时,它会检查lodash是否已经被安装。此时,由于lodash已经被安装在了node_modules/lodash目录下,因此npm会继续安装并将underscore.string打包到node_modules/lodash/node_modules/underscore.string路径下。

第五步:执行preinstall脚本

在所有的依赖项被成功安装后,npm可能会在默认情况下运行预安装钩子(preinstall hook)脚本,以确保所有依赖关系都已经被正确地安装。

如果有任何错误发生,npm将会在这个阶段抛出异常,并停止执行npm install命令。

第六步:执行postinstall脚本

当所有依赖关系已经被处理完毕后,npm可根据需要运行一个或多个后安装钩子(postinstall hook)脚本,以执行任何定制化的项目初始化、配置或是构建任务等操作。

第七步:生成Lockfile

最后,npm会在项目根目录下生成一个package-lock.json文件,该文件用于锁定该项目中所有依赖项的版本号。该文件可以帮助其他开发者在不同的主机或环境中重新创建和复制该项目时,确保使用的依赖项版本与原本一致。

总结

事实上,npm install过程中涉及的步骤还有很多。但是,在掌握了基本的执行流程后,我们至少能对整个npm包安装过程有一个较为清晰的认识,方便我们针对具体场景进行问题的分析和解决。

npm深层次的工作原理远远超出于我们所期望的那么复杂。不过,通过以上的讲解,相信大家都已经对npm包管理器有了一个初步的认识了。

最后附上小提示:熟记一些基本的npm命令可以帮助你更加高效地进行代码开发,提高你的工作效率。

到此这篇关于从零揭秘npm install的黑科技的文章就介绍到这了,更多相关npm install内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 用Nodejs实现在终端中炒股的实现

    用Nodejs实现在终端中炒股的实现

    这篇文章主要介绍了用Nodejs实现在终端中炒股的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 150行Node.js实现的dns代理工具

    150行Node.js实现的dns代理工具

    这篇文章主要介绍了150行Node.js实现的dns代理工具,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Node.js用Socket.IO做聊天软件的实现示例

    Node.js用Socket.IO做聊天软件的实现示例

    本文主要介绍了Node.js用Socket.IO做聊天软件的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 如何降低node版本,怎样实现降低node版本

    如何降低node版本,怎样实现降低node版本

    这篇文章主要介绍了如何降低node版本,怎样降低node版本问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • nodejs搭建本地http服务器教程

    nodejs搭建本地http服务器教程

    本篇文章主要介绍了nodejs搭建本地http服务器教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • 解决node.js安装包失败的几种方法

    解决node.js安装包失败的几种方法

    nodejs安装包失败的原因可能有很多,下面这篇文章给大家整理三种方法来解决,大家可以试一试或许可以解决你的问题,下面来一起看一看。
    2016-09-09
  • Node中使用http-proxy-middleware实现代理跨域的方法步骤

    Node中使用http-proxy-middleware实现代理跨域的方法步骤

    本文主要介绍了Node中使用http-proxy-middleware实现代理跨域的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Node.js  REPL (交互式解释器)实例详解

    Node.js REPL (交互式解释器)实例详解

    这篇文章主要介绍了Node.js REPL (交互式解释器)实例详解的相关资料,Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端,我们可以在终端中输入命令,并接收系统的响应,需要的朋友可以参考下
    2017-08-08
  • node.js中cluster的使用教程

    node.js中cluster的使用教程

    这篇文章主要介绍了node.js中cluster的使用教程,分别介绍使用NODE中cluster利用多核CPU、通过消息传递来监控工作进程状态以及终止进程等功能,给出了详细的示例代码供大家参考学习,需要的朋友们下面来一起看看吧
    2017-06-06
  • vscode 调试 node.js的方法步骤

    vscode 调试 node.js的方法步骤

    这篇文章主要介绍了vscode 调试 node.js的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09

最新评论