这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

依赖管理解决了在软件开发过程中管理和协调各种依赖项的问题,简化了开发流程,提高了项目的可靠性、可维护性和可重复性。它们帮助开发人员更高效地管理项目的依赖关系,减少了潜在的错误和冲突,并提供了更好的开发体验。


常用的依赖管理

在 JavaScript 生态系统中,有多种工具可用于管理项目的依赖项。

  1. npm(Node Package Manager):npm 是 Node.js 官方提供的包管理器,用于安装、管理和发布 JavaScript 包。它是 Node.js 安装时默认包含的工具。通过 npm install 命令可以安装项目依赖。
npm install package-name
  1. pnpm:pnpm 是一个快速、磁盘空间效率高的包管理器。与 npm 不同,pnpm 采用了符号链接的方式共享依赖项,因此在项目之间共享依赖时可以节省磁盘空间。pnpm 的命令与 npm 类似。
pnpm install package-name
  1. yarn:yarn 是由 Facebook 开发的另一个包管理器,旨在提供更快、更可靠的依赖管理。它具有与 npm 类似的功能,但执行速度更快,并且具有一些额外的功能,例如离线模式和锁定文件。与 npm 不同,yarn 使用 yarn add 命令来安装依赖。
yarn add package-name
  1. npx:npx 是 npm 5.2.0 版本及以上内置的命令行工具,用于执行项目安装的依赖项中的可执行文件。它可以临时安装依赖项并运行其中的命令,而无需全局安装。
npx command-name
  1. cnpm:cnpm 是淘宝镜像提供的 npm 的镜像版本,用于加速国内用户对 npm 包的安装和下载速度。它是通过将 npm 的源地址配置为淘宝的源地址来实现的。与 npm 相比,使用 cnpm 可以更快地安装依赖项。

常用依赖管理的对比

准确地说,npx 并不是一个专门的依赖管理工具,而是 npm 附带的一个命令行工具,用于临时执行项目依赖中的可执行文件,而无需全局安装。以下对其它常用依赖管理工具的对比,npx在后续小节会提到期妙用。

优势 pnpm npm cnpm Yarn
性能 - 采用硬链接来共享依赖项,减少磁盘空间占用和安装时间 - 单线程安装和构建依赖项 - 采用并行安装模式,速度较快 - 并行安装和构建依赖项,速度较快
  - 并行安装和构建依赖项,提高安装速度      
  - 增量安装依赖项,只安装更新的部分      
  - 本地缓存和离线安装支持      
效率 - 快速的重复安装速度 - 较慢的重复安装速度 - 较快的重复安装速度 - 快速的重复安装速度
  - 较小的网络传输量      
依赖大小 - 仅保存每个包的单个实例 - 需要保存每个包的多个实例,占用较大的磁盘空间 - 仅保存每个包的单个实例,占用较小的磁盘空间 - 仅保存每个包的单个实例,占用较小的磁盘空间
锁定文件机制 使用 pnpm-lock.yaml 使用 package-lock.json 使用 package-lock.json 使用 yarn.lock
生态系统支持 - 生态系统相对较小,但兼容 npm 生态系统 - 庞大的生态系统和广泛的社区支持 - 生态系统相对较小,可能有一些包不完全支持 - 庞大的生态系统和广泛的社区支持
         
社区支持与更新频率 - 社区相对较小,更新频率较低 - 庞大的社区支持和活跃的更新频率 - 社区相对较小,更新频率较低 - 庞大的社区支持和活跃的更新频率

软链接与硬链接

在依赖管理工具中,常见的使用软链接和硬链接的方式有以下情况:

  1. 符号链接(Symbolic Link)或软链接(Soft Link):

    • npm:npm使用符号链接来创建软链接。当使用npm link命令时,它会创建一个全局软链接,将全局安装的模块链接到当前项目中,从而实现模块的共享和开发环境的快速调试。
    • Yarn:Yarn也使用符号链接来创建软链接。类似于npm link,Yarn通过yarn link命令创建一个全局软链接,将全局安装的模块链接到当前项目中。
  2. 硬链接(Hard Link):

    • pnpm:pnpm使用硬链接来共享已安装的依赖项。当安装依赖项时,pnpm会在项目之间创建硬链接,这样相同的依赖项可以被多个项目共享,减少了磁盘空间占用和安装时间。

需要注意的是,符号链接(Symbolic Link)是一种创建链接的方式,它创建了一个文件或目录的指向目标的链接。而软链接(Soft Link)是符号链接的一种特殊类型,用于指向文件或目录。硬链接(Hard Link)创建了一个新的文件名,直接在文件系统中指向同一个索引节点和数据。

软硬链接的适用场景

软链接和硬链接各有其适用的情况,没有绝对的好与坏。它们的选择取决于具体的使用场景和需求。

软链接的优点
  1. 跨文件系统:软链接可以跨越不同的文件系统,可以指向其他分区或磁盘上的文件或目录。
  2. 可读性:软链接是可读的,可以通过查看链接文件获取目标文件或目录的路径信息。
  3. 灵活性:软链接可以指向文件和目录,可以创建循环链接(即链接的链条形成闭环),可以链接到不存在的目标,可以链接到目录的特定子目录。
硬链接的优点
  1. 空间效率:硬链接不会额外占用磁盘空间,多个链接共享相同的数据和索引节点,节省存储空间。
  2. 性能:由于硬链接直接指向同一索引节点,访问硬链接文件的速度与访问目标文件相同,不需要额外的解析步骤。
  3. 指向目录:硬链接可以指向目录,而软链接无法直接指向目录。

根据具体的使用情况,可以选择合适的链接类型。一般来说:

  • 如果需要跨越文件系统或者需要链接到目录,可以选择软链接。
  • 如果注重空间效率和性能,并且在同一文件系统内进行链接,可以选择硬链接。

对于pnpm来说,当一个项目使用pnpm安装依赖项时,pnpm会将这些依赖项安装到一个称为node_modules/.pnpm的目录中。其他项目可以通过创建硬链接来使用这个已安装的依赖项,而无需在各自项目的node_modules目录中重复安装。

这种共享依赖项的机制使得多个项目可以共享相同的依赖项,但每个项目仍然需要维护自己的package.json文件和项目特定的配置。这样,每个项目可以独立地管理自己的开发和构建过程,而共享的依赖项保持一致,减少了重复的依赖项下载和存储消耗。这是pnpm的一项优势,可以提高项目的构建速度和整体效率。

npx的妙用

npx 是一个非常有用的命令行工具,特别适用于以下几种场景:

  1. 临时执行项目依赖的可执行文件: 有时候你可能需要在命令行中临时执行某个项目依赖的可执行文件,而不想全局安装这个工具。npx 可以帮助你在不污染全局环境的情况下直接运行这些可执行文件。
npx eslint index.js

上述示例中,我们使用 npx 来运行项目依赖中的 eslint 工具,对 index.js 文件进行代码检查,而无需事先全局安装 eslint。

  1. 执行最新版本的工具: npx 可以确保你运行的是最新版本的工具。当你使用全局安装的工具时,可能会受限于旧版本,而 npx 可以自动下载和使用最新版本。
npx create-react-app my-app

在上述示例中,我们使用 npx 创建一个新的 React 应用程序,npx 会自动下载最新版本的 create-react-app 工具并使用它来初始化项目。

  1. 尝试新的工具和库: 当你想尝试一个新的工具或库时,不必将其全局安装,只需使用 npx 运行它。这样可以节省磁盘空间,并且你可以快速尝试新工具而无需担心与现有环境冲突。
npx next init my-app

在上述示例中,我们使用 npx 初始化一个新的 Next.js 应用程序,而不必预先全局安装 Next.js。

  1. 运行一次性命令: 当你只需要运行一次性的命令时,npx 是一个很好的选择。你可以直接在命令行中指定要运行的命令,而无需创建额外的脚本文件。
npx http-server

在上述示例中,我们使用 npx 启动一个简单的 HTTP 服务器,而不必事先编写启动脚本。

总之,npx 是一个非常方便的工具,适用于在命令行中临时执行项目依赖的可执行文件、运行最新版本的工具、尝试新的工具和库,以及运行一次性命令等场景。

npx的执行机制

当你使用 npx 执行可执行文件时,npx 会首先检查本地是否已经存在该可执行文件。如果本地已经安装了这个可执行文件(位于项目的 node_modules/.bin 目录中),npx 会直接运行它,而无需下载。

如果本地不存在该可执行文件,npx 会自动下载对应的包,并将其安装在一个临时目录中,然后执行该可执行文件。这意味着 npx 会在需要时临时下载所需的包,而不会将其全局安装或污染项目的依赖。

临时下载的包会被存储在一个缓存目录中,以便下次使用相同的包时可以快速加载。默认情况下,npx 使用 npm 的缓存目录作为临时下载的包的存储位置。

在执行完可执行文件后,npx 会自动删除临时下载的包,以节省磁盘空间。这意味着每次使用 npx 执行可执行文件时,它都会检查本地是否存在该包,如果不存在则临时下载,执行完后再删除。

总之,npx 会检查本地是否已经安装了要执行的可执行文件,如果没有,则会临时下载并执行它,执行完毕后再删除临时下载的包。这样可以确保你在运行命令时使用的是最新版本的工具,同时避免全局安装或污染项目的依赖。

本文转载于:

https://juejin.cn/post/7326268908984352777

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

记录--npm, npx, cnpm, yarn, pnpm梭哈的更多相关文章

  1. npm npx cnpm yarn 的区别

    npm npm 是 Node.js 官方提供的包管理工具.用于 Node.js 包的发布.传播.依赖控制.npm 提供了命令行工具,使你可以方便地下载.安装.升级.删除包,也可以让你作为开发者发布并维 ...

  2. 主流包管理工具npm、yarn、cnpm、pnpm之间的区别与联系——原理篇

    接触 node 之后,一直使用npm包管理工具, cnpm 一开始会用一些,但是并没有觉得比 npm 快得多,使用 cnpm 的时候还经常安装不成功,只能再用 npm 安装一遍,渐渐的就弃用了 cnp ...

  3. NodeJS之npm、cnpm、npx、yarn

    一.npm 1,概念 npm 是 Node.js 官方提供的包管理工具,他已经成了 Node.js 包的标准发布平台,用于 Node.js 包的发布.传播.依赖控制.npm 提供了命令行工具,使你可以 ...

  4. npm 加速之 yarn cnpm pnpm

    npm 加速之 yarn cnpm pnpm 有没有感觉到使用 npm 的时候很慢? 安装速度 几Kb/s 不说, 还装着装着出错了, 奇奇怪怪的问题.这种情况大多数还是因为网络的原因, 很多时候虽然 ...

  5. npm、cnpm、yarn 安装删除异同

    背景 一直觉得npm.cnpm.yarn的安装删除基本一样用哪个都行,不过俗话说的好,实践出真知,这里记录一下今天简单测试得到的结果总结. 可能会有错误,希望大家评论指正,十分感谢. 测试电脑系统:M ...

  6. centos7 yum 安装nodejs、npm、cnpm、pm2、yarn

    一.环境准备 1.1 查看系统环境 [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) [ ...

  7. npm init & npx create & yarn create

    npm init & npx create & yarn create https://create-react-app.dev/docs/getting-started/#creat ...

  8. 关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用

    关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用   工作环境:window下 在一切的最开始,安装node.js (中文站,更新比较慢http://nodejs.cn/) ...

  9. [转]npm、 cnpm、yarn

    本文转自:https://blog.csdn.net/sinat_34682450/article/details/79473658 终于搞懂了三者之间的关系- 要知道三者之间的关系首先要了解三个包管 ...

  10. npm\cnpm\yarn\tyarn 关于源和代理的问题

    npm 是一个包管理器.Node.js 自带. cnpm 是 npm 的阿里版,用的阿里源. yarn 是另一个包管理器,不自带,需要另外装.可以单独装,也可以用 npm 装. tyarn 是 yar ...

随机推荐

  1. NC24608 [USACO 2011 Ope S]Learning Languages

    题目链接 题目 题目描述 Farmer John's N (2 <= N <= 10,000) cows, conveniently numbered 1..N, are fluent i ...

  2. 解决Burpsuite1.6中文显示乱码问题

    说明 最近公司项目被测试团队测试出有越权访问等安全问题,用的是这个Burpsuit工具,我想做软件测试的同学应该很熟悉.那么中间在模拟请求响应过程中发现返回的信息中文是乱码,搜索了一圈发现很多人提供的 ...

  3. Vue+ElementUI实现用户管理前后分离实战一:前端篇

    项目介绍 前几天有老铁问我能不能写一个Vue+ElementUI+SpringBoot后端的前后分离项目,最近有点忙,但今天他还是来了!希望对大家能有点帮助,大家还想要点啥也可以加我QQ或给我留言 : ...

  4. 为什么华为今年疯狂招od?

    不知道的大家有没有发现 这两年市场不好公司用人需求紧缩 唯有华子疯狂招人 很多人都听过华为OD 但是具体是什么还是有很多人疑惑 总结以下三个部分: 1.为啥疯狂招od而不是之前的纯"外包&q ...

  5. MinGW 和 MSVC

    在 Winodws 上编译通常会用到这两种工具链 MinGW(Minimalist GNU for Windows) 通常用于跨平台开发,可以编译出在 Windows 系统上运行的 .exe 程序 M ...

  6. Java 小练习(2) 利用面向对象的编程方法 设计类Circle计算圆的面积

    1 package com.bytezero.exer; 2 /*** 3 * 4 * @Description 5 * @author Bytezero·zhenglei! Email:420498 ...

  7. C++ 函数模板案列 //利用函数模板封装一给排序的函数,对不同的数据类型进行排序 //排序规则从大到小 排序算法为选择排序 //分别用char 数组 和 int 数组进行测试

    1 //函数模板案列 2 //利用函数模板封装一给排序的函数,对不同的数据类型进行排序 3 //排序规则从大到小 排序算法为选择排序 4 //分别用char 数组 和 int 数组进行测试 5 6 7 ...

  8. 一些shell脚本

    1.判断目录是否为空 DIRECTORY=$1 #在此加上是不是目录的判断. if [ "ls -A $DIRECTORY" = "" ]; then echo ...

  9. 精贴总结 - 万字长文带你入门Istio

    原文 - 万字长文带你入门Istio 一.个人看法 背景:以docker+k8s普及,支持快速部署,通过k8s允许统一管理 解决:1)设计分布式系统,导致开发难度提高:2)统一多语言的服务治理方案 目 ...

  10. Linux 网络编程从入门到进阶 学习指南

    前言 大家好,我是小康.在上一篇文章中,我们探讨了 Linux 系统编程的诸多基础构件,包括文件操作.进程管理和线程同步等,接下来,我们将视野扩展到网络世界.在这个新篇章里,我们要让应用跳出单机限制, ...