文章目录
npmcnpmpnpmyarn_1">包管理工具之-npm,cnpm,pnpm,yarn
- npm(Node Package Manager)
- 作用:
- 它是JavaScript运行时环境Node.js的默认包管理器。主要用于安装、管理和共享JavaScript代码包。例如,当你开发一个Node.js应用程序时,需要安装一些依赖包,如Express(一个流行的Web应用框架),就可以使用
npm install express
命令来安装。 - 可以管理项目的依赖关系,记录在
package.json
文件中。这个文件包含了项目所依赖的包及其版本范围。当你在一个新的环境中部署项目时,运行npm install
会根据package.json
文件自动安装所有需要的依赖包。 - 可以发布自己的包供其他开发者使用。你可以通过
npm publish
命令将自己开发的JavaScript模块发布到npm仓库中。
- 它是JavaScript运行时环境Node.js的默认包管理器。主要用于安装、管理和共享JavaScript代码包。例如,当你开发一个Node.js应用程序时,需要安装一些依赖包,如Express(一个流行的Web应用框架),就可以使用
- 特点:
- 拥有庞大的软件包生态系统,几乎涵盖了所有类型的JavaScript库和工具。
- 它是按照包的语义化版本号(SemVer)来管理依赖的。例如,一个包的版本号可能是
1.2.3
,其中1
是主版本号,2
是次版本号,3
是补丁版本号。通过在package.json
中指定版本范围(如^1.2.3
表示可以安装1.2.3
及以上的兼容版本)来控制依赖的更新。
- 作用:
- cnpm(Chinese npm)
- pnpm(Performant npm)
- 作用:
- 特点:
- yarn
- 作用:
- 特点:
包管理工具之源头
-
- 底层算法概述
- 改进方向
- 为了解决依赖冲突和版本管理问题,npm引入了
package - lock.json
文件。这个文件记录了安装时每个依赖的确切版本和依赖树结构,确保在不同环境下安装的一致性。例如,当团队成员在不同的机器上安装项目依赖时,package - lock.json
可以保证大家安装的是相同版本的包。
- 为了解决依赖冲突和版本管理问题,npm引入了
-
cnpm
- 底层算法概述
- 改进方向
-
pnpm
- 底层算法概述
- 改进方向
- 不断优化全局存储的管理算法,提高存储效率和包的检索速度。同时,也在改进其与现有项目的兼容性,尤其是对于那些依赖于传统
node_modules
扁平结构的工具和插件,使其能够更好地适应pnpm的非扁平存储方式。
- 不断优化全局存储的管理算法,提高存储效率和包的检索速度。同时,也在改进其与现有项目的兼容性,尤其是对于那些依赖于传统
-
- 底层算法概述
- 改进方向
- 进一步优化并行安装算法,减少安装过程中的资源竞争和冲突。同时,也在不断改进
yarn.lock
文件的管理算法,例如在更新依赖包时,提供更智能的版本更新建议,以平衡项目的稳定性和对新功能的需求。
- 进一步优化并行安装算法,减少安装过程中的资源竞争和冲突。同时,也在不断改进
依赖下载安装的完整性
-
确保依赖下载完整性的通用原则和方法
- 校验和验证机制
- 重试机制
- 这些包管理器通常都有重试机制。如果在下载过程中出现网络问题(如连接中断、超时等),包管理器会尝试重新连接并继续下载。例如,npm会在一定次数内(通常有默认的重试次数设置)自动重试下载,直到成功或者达到重试次数上限。
- 依赖锁定文件
- npm的
package - lock.json
和yarn的yarn.lock
:这两个文件记录了依赖包的精确版本和文件树结构。在安装依赖时,包管理器会严格按照锁定文件中的信息进行安装。以package - lock.json
为例,它包含了每个依赖包的名称、版本、下载地址、以及依赖关系树等详细信息。当重新安装依赖时,npm会根据这些信息确保下载的是相同版本和相同内容的包,从而保证了完整性。 - pnpm的存储机制:pnpm通过内容可寻址存储(CAS),每个包在存储区域(store)中的位置是由其内容的哈希值决定的。在安装依赖时,它会先检查全局存储中的包是否满足项目需求,如果满足就直接使用,这种方式可以确保每次使用的包内容都是完整且一致的。
- npm的
-
关于
cnpm i --force
的原理与应用- 原理
- 应用场景
npm__79">node 与 npm 之间的关系
-
Node.js是运行环境,npm是其生态系统中的包管理器
-
npm依赖于Node.js运行
-
Node.js项目通常借助npm来管理依赖和构建生态系统
- 在开发一个Node.js应用程序时,几乎都会用到npm来添加所需的功能模块。例如,要构建一个RESTful API服务器,可能需要安装
express
框架和body - parser
中间件(用于解析请求体)。可以通过npm install express body - parser
命令来添加这些依赖。 - 同时,
package.json
文件是Node.js项目和npm之间的重要纽带。这个文件记录了项目的基本信息(如名称、版本、作者等)和依赖信息(包括生产环境和开发环境的依赖)。npm会根据package.json
文件中的依赖配置来安装、更新和管理项目中的依赖包。例如,package.json
文件中的"dependencies"
字段列出了项目运行时所需要的包,"devDependencies"
字段列出了开发过程中需要的工具(如测试框架、代码格式化工具等)。
- 在开发一个Node.js应用程序时,几乎都会用到npm来添加所需的功能模块。例如,要构建一个RESTful API服务器,可能需要安装
如何手动管理依赖
-
了解依赖的类型
- 在Node.js项目中,依赖主要分为两种类型:生产依赖(
dependencies
)和开发依赖(devDependencies
)。 - 生产依赖:是项目在生产环境(实际运行环境)中运行所必需的依赖。例如,对于一个Web应用程序,
express
(一个用于构建Web服务器的框架)就是生产依赖,因为没有它,应用程序无法正常运行并提供服务。 - 开发依赖:是在开发过程中使用的依赖,如测试框架(
mocha
、jest
)、代码格式化工具(prettier
)等。这些依赖在项目实际运行时通常不需要,仅用于开发阶段来提高代码质量和测试效率。
- 在Node.js项目中,依赖主要分为两种类型:生产依赖(
-
不使用包管理器,手动下载依赖包
- 步骤一:确定依赖包的来源
- 可以从官方网站(如果有)或可靠的代码仓库(如GitHub)获取依赖包的源代码。以
express
为例,可以访问其官方网站或GitHub仓库,找到适合项目的版本并下载。
- 可以从官方网站(如果有)或可靠的代码仓库(如GitHub)获取依赖包的源代码。以
- 步骤二:解压和放置依赖包
- 将下载的依赖包解压到项目的
node_modules
目录下。如果没有node_modules
目录,可以手动创建一个。每个依赖包通常是一个包含package.json
、index.js
等文件的文件夹结构。例如,将express
包解压后的文件夹放置在node_modules
目录下,就可以在项目代码中引用express
模块了。
- 将下载的依赖包解压到项目的
- 步骤三:管理依赖版本和更新
- 这种手动方式很难管理依赖的版本。要更新依赖,需要重复上述步骤,手动查找和下载最新版本,并且需要注意新的版本是否与项目中的其他依赖兼容。而且没有包管理器的自动版本检查和冲突解决机制,容易出现依赖冲突问题。
- 步骤一:确定依赖包的来源
-
通过修改
package.json
文件手动管理依赖(以npm为例)- 步骤一:创建或编辑
package.json
文件- 如果项目没有
package.json
文件,可以通过在项目根目录下运行npm init
命令来创建一个。这个文件记录了项目的基本信息和依赖信息。在package.json
文件中,有两个主要的字段用于管理依赖:"dependencies"
和"devDependencies"
。
- 如果项目没有
- 步骤二:添加生产依赖
- 步骤三:添加开发依赖
- 对于开发依赖,如
mocha
(一个测试框架),可以在package.json
文件的"devDependencies"
字段中添加"mocha": "^10.2.0"
,然后运行npm install --save - dev
命令来安装mocha
。这个命令会将mocha
安装到node_modules
目录中,并将其添加到package.json
的"devDependencies"
字段中。
- 对于开发依赖,如
- 步骤四:更新和删除依赖
- 步骤一:创建或编辑
手动管理依赖的优优缺点
-
优点
- 深度理解依赖关系
- 手动管理依赖时,开发者需要亲自下载、解压和配置每个依赖包。这使得开发者能够深入了解每个依赖在项目中的作用、其内部结构以及与其他依赖的相互关系。例如,在手动将
express
框架添加到项目中时,开发者会直接接触到express
的文件结构,了解其核心模块、中间件的存储位置等,这有助于更好地理解整个项目的架构。
- 手动管理依赖时,开发者需要亲自下载、解压和配置每个依赖包。这使得开发者能够深入了解每个依赖在项目中的作用、其内部结构以及与其他依赖的相互关系。例如,在手动将
- 高度定制化
- 可以根据项目的特殊需求进行定制化操作。如果项目对某个依赖有特定的修改要求,手动管理可以方便地对依赖包进行局部调整。比如,对于一个安全性要求较高的项目,开发者可以手动审查和修改依赖包中的某些安全相关代码,而这在使用自动化包管理器时可能会比较复杂。
- 不依赖外部工具(在一定程度上)
- 在某些环境下,可能无法使用包管理器(如网络限制、安全策略等)。手动管理依赖可以让项目在不依赖外部包管理器的情况下,依然能够添加和更新所需的依赖。例如,在一个封闭的开发环境中,通过手动从本地存储设备获取依赖包并添加到项目中,使项目能够继续推进。
- 深度理解依赖关系
-
缺点
- 效率低下
- 手动下载和配置依赖包是一个繁琐且耗时的过程。尤其是当项目依赖众多时,需要逐个查找、下载、解压和放置依赖包,这会花费大量的时间和精力。例如,一个复杂的Node.js项目可能有几十个甚至上百个依赖,手动管理这些依赖会使项目的初始化和更新过程变得非常缓慢。
- 容易出现版本冲突
- 手动管理很难有效地控制依赖版本。没有像包管理器那样的自动版本检查和冲突解决机制,开发者需要自己跟踪每个依赖的版本兼容性。例如,当更新一个依赖时,可能会因为与其他依赖的版本不兼容而导致项目出现错误,而且很难快速定位和解决这些冲突。
- 维护成本高
- 随着项目的发展和依赖的更新,手动管理依赖会变得越来越困难。每次更新依赖都需要手动重复下载、解压等操作,并且要确保新的版本不会破坏项目的现有功能。在团队开发环境中,这种方式还会导致不同开发者的依赖环境不一致,增加了项目的维护成本和沟通成本。
- 效率低下
镜像源安装及下载
npm_135">cnpm
npm install -g cnpm --registry=http://registry.npmmirror.com
设置镜像源:
npm config set registry http://registry.npmmirror.com
恢复镜像源:
npm config set registry https://registry.npmjs.org/
npmaddnewremoveinstall_142">pnpm(add(new),remove,install(配置文件下载))
npm install pnpm -g
设置镜像源
pnpm config set registry https://registry.npmmirror.com/
恢复镜像源:
npm config set registry https://registry.npmjs.org/
yarnaddnewremoveinstall_149">yarn(add(new),remove,install(配置文件下载))
npm i yarn -g
设置镜像源:
yarn config set registry https://registry.npmmirror.com
恢复镜像源:
yarn config set registry https://registry.yarnpkg.com