npm、pnpm、cnpm、yarn、npx之间的区别

文章目录

  • 区别
  • 特点
    • pnpm
    • yarn
    • cnpm
  • 关键解读
  • 如何选择
  • 代码示例
    • 安装依赖
    • 运行命令


区别

特性npmyarnpnpmcnpmnpx
核心定位Node.js 默认包管理增强稳定性与性能高效存储与严格隔离国内镜像加速工具临时执行包命令
依赖存储方式扁平化 node_modules扁平化 + lock 文件全局硬链接 + 符号链接同 npm不适用
安装速度较慢较快(并行下载)最快(复用缓存)快(国内 CDN)不适用
磁盘占用极低(共享存储)
依赖隔离性弱(依赖提升)中(lock 文件控制)强(符号链接隔离)同 npm不适用
Monorepo 支持基础(workspaces)强大(workspaces)原生支持不支持不适用
锁文件package-lock.jsonyarn.lockpnpm-lock.yaml同 npm
安全性极高低(镜像源风险)
国内网络优化有(淘宝镜像)
典型命令npm installyarn addpnpm addcnpm installnpx create-app
适用场景简单项目、兼容性需求中大型项目、稳定性大型项目、Monorepo国内网络环境加速临时执行 CLI 工具

特点

pnpm

pnpm 使用 硬链接(Hard Link)和符号链接(Symlink) 来管理依赖文件。所有依赖包的实际文件存储在全局的单一内容寻址存储中(类似 Git),不同项目共享相同文件。

优势:

  1. 节省磁盘空间:

    • 所有依赖的每个版本仅保存一份实体文件。(例如,10 个项目都依赖 lodash@4.17.21,磁盘上只保留一份文件。)

    • 多个项目共用同一依赖的同一版本时,无需重复下载。

  2. 安装速度快:

    • 新项目安装依赖时,若全局已有该包,直接创建硬链接,无需重新下载。
  3. 非扁平化结构:

    • pnpm 的 node_modules 结构是非扁平化的,每个依赖只能访问其显式声明的依赖,避免了“幽灵依赖”(Phantom Dependencies)问题。

    • 例如,你的项目依赖 A,而 A 依赖 B。在 NPM 的扁平化结构中,你的代码可能直接引用 B(即使未声明依赖 B),导致潜在风险;而 PNPM 会严格限制这种访问。

.

yarn

yarn详细入门教程

yarn 在速度、稳定性和 Monorepo 支持上优于 NPM,适合对依赖管理要求严格的场景。若项目已使用 NPM,可权衡迁移成本;若为新项目,Yarn 是更现代的选择(尤其是 Yarn 2+)。

优势:

  1. 并行下载:

    • 可以并行下载依赖包,显著提升安装速度(尤其在依赖数量多时)。

    • 早期 npm 安装依赖时是顺序下载且无缓存复用,速度较慢(NPM 5+ 已改进,但 Yarn 仍有一定优势)。

  2. 本地缓存机制:

    所有下载过的依赖会缓存在本地,后续安装直接从缓存读取,减少网络请求。

  3. lock 文件:

    • yarn 默认生成 yarn.lock 文件,严格锁定依赖树中每个包的具体版本和哈希值,确保不同环境下安装的依赖完全一致,防止恶意代码注入。

    • 对比:早期 npm 的 package-lock.json 在部分场景下可能因版本范围定义不严格导致依赖版本漂移(NPM 5+ 已改进,但 Yarn 的锁定机制更早成熟)。

  4. 离线模式:
    yarn 优先从本地缓存安装依赖,即使无网络连接也可完成安装(需提前缓存过依赖)。

.

cnpm

cnpm 是淘宝镜像提供的工具,主要针对国内用户,解决npm在国内下载速度慢的问题。它的核心优势应该在于镜像源的速度和稳定性,以及可能的并行安装提升速度。

cnpm 默认使用淘宝镜像源(https://registry.npmmirror.com),所有依赖包会从国内服务器下载,避开国际网络延迟。

优势:

  1. 下载速度极快:

    • 国内用户安装依赖的速度可提升 5-10 倍(尤其对大体积包如 node-sass、electron 等效果显著)。

    • 避免因国际网络波动导致的安装失败,稳定性高。

    • 而 npm 默认从 registry.npmjs.org 下载,国内直连速度慢且不稳定。

  2. 完全兼容 NPM 的命令:

    • cnpm 完全兼容 npm 的命令(如 cnpm installcnpm publish),仅需将 npm 替换为 cnpm 即可使用。

    • 支持私有源,可通过 cnpm config set registry <url> 切换为私有仓库(如企业内网源)。

  3. 镜像同步频率高:

    • 实时同步:淘宝镜像每隔 10 分钟与 NPM 官方仓库同步一次,基本覆盖最新版本。

    • 容灾备份:镜像服务器分布多地,避免单点故障。

配置:

  1. 全局配置:建议全局配置淘宝镜像,提升日常开发效率
    npm config set registry https://registry.npmmirror.com

  2. 临时需求:若需从官方源安装个别包,可通过参数临时指定
    npm install some-package --registry=https://registry.npmjs.org


关键解读

1. 存储机制
pnpm 通过硬链接复用全局依赖,节省 70%+ 磁盘空间。
npm/yarn 的扁平化结构易导致依赖冲突。

2. 安装效率
pnpm > yarn > npm(尤其在依赖重复场景)。
cnpm 依赖国内 CDN,适合解决网络问题。

3. Monorepo 支持
pnpm 和 yarn 有原生优化,npm 需手动配置。

4. 安全性
pnpm 严格隔离依赖,避免非法访问;cnpm 镜像源需注意信任问题。

5. 临时执行
npx 专为运行一次性命令设计(如脚手架工具),无需全局安装。


如何选择

  • 个人/小团队:优先 pnpm(省空间+快)或 yarn(功能全)。

  • 国内网络环境:用 cnpm 加速,但生产环境切回 npm 或 pnpm。

  • Monorepo 项目:pnpm 或 yarn workspace。

  • 临时执行 CLI:无脑 npx。


代码示例

安装依赖

# npm
npm install lodash# yarn
yarn add lodash# pnpm
pnpm add lodash# cnpm
cnpm install lodash

运行命令

# npm
npm run dev# yarn
yarn dev# pnpm
pnpm dev# npx(临时运行)
npx vite create my-project

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32506.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DataWhale 大语言模型 - 语言模型发展历程

大语言模型 LLMBook 项目背景 本课程围绕中国人民大学高瓴人工智能学院赵鑫教授团队出品的《大语言模型》书籍展开&#xff0c;覆盖大语言模型训练与使用的全流程&#xff0c;从预训练到微调与对齐&#xff0c;从使用技术到评测应用&#xff0c;帮助学员全面掌握大语言模型的…

C#带有设备仿真功能串口调试助手

本文档介绍一种方法,可以用来仿真串口设备。这样调试PLC程序时可以在没有仪器时用于测试程序的运行。详细代码见: https://download.csdn.net/download/qq_34047402/90477066 C#带有设备仿真功能串口调试助手资源-CSDN文库 步骤如下: 1.把串口设备接收和发送仿真数据放到一…

本地部署 OpenManus 保姆级教程(Windows 版)

一、环境搭建 我的电脑是Windows 10版本&#xff0c;其他的没尝试&#xff0c;如果大家系统和我的不一致&#xff0c;请自行判断&#xff0c;基本上没什么大的出入啊。 openManus的Git地址&#xff1a;https://github.com/mannaandpoem/OpenManus 根据官网的两种安装推荐方式如…

01 | Go 项目开发极速入门课介绍

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课。 你好&#xff0c;欢迎学习本课程。本课程是一个 Go 项目开发极速入门课程。旨在帮助刚学习完 Go 基础语法的 Go 开发者&#xff0c;快速掌握如何开发一个功能相对全面的 Go 项目。 根据课程设计目标…

使用 Elastic-Agent 或 Beats 将 Journald 中的 syslog 和 auth 日志导入 Elastic Stack

作者&#xff1a;来自 Elastic TiagoQueiroz 我们在 Elastic 一直努力将更多 Linux 发行版添加到我们的支持矩阵中&#xff0c;现在 Elastic-Agent 和 Beats 已正式支持 Debian 12&#xff01; 本文演示了我们正在开发的功能&#xff0c;以支持使用 Journald 存储系统和身份验…

江科大51单片机笔记【15】直流电机驱动(PWM)

写在前言 此为博主自学江科大51单片机&#xff08;B站&#xff09;的笔记&#xff0c;方便后续重温知识 在后面的章节中&#xff0c;为了防止篇幅过长和易于查找&#xff0c;我把一个小节分成两部分来发&#xff0c;上章节主要是关于本节课的硬件介绍、电路图、原理图等理论…

【Linux】:封装线程

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来封装线程相关的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结…

全球领先的光学方案设计公司:倚光科技

在光学技术革新的浪潮中&#xff0c;倚光&#xff08;深圳&#xff09;科技有限公司以创新者的姿态迅速崛起&#xff0c;成为全球光学领域的标杆企业。自 2021 年成立以来&#xff0c;公司始终聚焦纳米光学技术研发与超精密加工&#xff0c;凭借顶尖的技术实力和前瞻性的市场布…

2.2.3 TCP—UDP-QUIC

文章目录 2.2.3 TCP—UDP-QUIC1. TCP如何做到可靠性传输1. ACK机制2. 重传机制3. 序号机制4. 窗口机制5. 流量机制6. 带宽机制 2. tcp和udp如何选择1. tcp和udp格式对比2. ARQ协议&#xff08;Automatic Repeat reQuest&#xff0c;自动重传请求&#xff09;1. ARQ协议的主要类…

【动手实验】TCP 连接的建立与关闭抓包分析

本文是基于知识星球程序员踩坑案例分享中的作业进行的复现和总结&#xff0c;借此加深对 TCP 协议的理解&#xff0c; 原文参见TCP 连接的建立和关闭 —— 强烈建议新手看看。 实验环境 这里使用两台位于同一子网的腾讯云服务器&#xff0c;IP 分别是 node2&#xff08;172.1…

视频理解之Actionclip(论文宏观解读)

配合解读代码解读 1.研究背景 1. 视频行为识别的重要性 视频行为识别是视频理解领域的核心任务之一&#xff0c;旨在通过分析视频内容来识别和分类其中的人物行为或活动。这一任务在多个领域具有重要的应用价值&#xff0c;例如智能监控、人机交互、自动驾驶、医疗健康等。随…

基于LabVIEW的脚本化子VI动态生成

该示例展示了一种利用LabVIEW VI脚本&#xff08;VI Scripting&#xff09;技术&#xff0c;通过程序化方式动态生成并替换子VI的解决方案。核心逻辑为&#xff1a;基于预定义的模板VI&#xff0c;根据用户选择的数学操作&#xff08;加法或乘法&#xff09;&#xff0c;自动生…

Debian系统grub新增启动项

参考链接 给grub添加自定义启动项_linux grub定制 启动项名称自定义-CSDN博客 www.cnblogs.com 1. boot里面的grub.cfg 使用vim打开boot里面的grub.cfg sudo vim /boot/grub/grub.cfg 这时候会看到文件最上方的提示 2. 真正配置grub的文件 从刚才看到的文件提示中&#x…

ctfhub-web-SSRF通过攻略

1.URL Bypass 打开题目 请求的URL中必须包含http://notfound.ctfhub.com&#xff0c;使用来绕过即可 /?urlhttp://notfound.ctfhub.com127.0.0.1/flag.php 成功获得flag 2.数字IP Bypass 开启题目 发现127以及172被过滤了 尝试别的绕过 127.0.0.1–>localhost 127.0…

C语言(23)

字符串函数 11.strstr函数 1.1函数介绍&#xff1a; 头文件&#xff1a;string.h char *strstr ( const char * str1,const char *str2); 作用&#xff1a;在一个字符串&#xff08;str1&#xff09;中寻找另外一个字符串&#xff08;str2&#xff09;是否出现过 如果找到…

uniapp+Vue3 组件之间的传值方法

一、父子传值&#xff08;props / $emit 、ref / $refs&#xff09; 1、props / $emit 父组件通过 props 向子组件传递数据&#xff0c;子组件通过 $emit 触发事件向父组件传递数据。 父组件&#xff1a; // 父组件中<template><view class"container">…

晨控CK-FR08与汇川H5U系列PLC配置EtherNet/IP通讯连接手册

晨控CK-FR08与汇川H5U系列PLC配置EtherNet/IP通讯连接手册 晨控CK-FR08系列作为晨控智能工业级别RFID读写器,支持大部分工业协议如RS232、RS485、以太网。支持工业协议Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由协议TCP/IP等。 本期主题&#xff1a;围…

BLDC直流无刷电机转速电流双闭环调速MATLAB仿真

微♥&#xff1a;“电击小子程高兴的MATLAB小屋”获取巨额优惠 1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Ra&#xff09;软件。建议采用matlab2017 Ra及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09; 2.仿真算法&#x…

Windows 11下Git Bash执行cURL脚本400问题、CMD/PowerShell不能执行多行文本等问题记录及解决方案

问题 在Postman里可成功执行的POST请求&#xff1a; 找到Postman的Code 因为cURL基本上算是行业标准&#xff0c;所以Postman默认选中cURL&#xff0c;支持切换不同的开发语言&#xff1a; 点击上图右上角的复制按钮&#xff0c;得到cURL脚本。 Windows 11家庭版&#xff…

4个 Vue 路由实现的过程

大家好&#xff0c;我是大澈&#xff01;一个喜欢结交朋友、喜欢编程技术和科技前沿的老程序员&#x1f468;&#x1f3fb;‍&#x1f4bb;&#xff0c;关注我&#xff0c;科技未来或许我能帮到你&#xff01; Vue 路由相信朋友们用的都很熟了&#xff0c;但是你知道 Vue 路由…