本篇文章带大家了解一下Node.js的两个强大包管理器:npm 和 yarn,希望对大家有所帮助!

学习Node的第一步就是要了解node的包管理器:npm,对于npm相信大家并不陌生,因为我们常用它去下载一些包资源
但因为npm的资源库(https://www.npmjs.com/)在国外,使用它下载资源的速度比较慢,于是就出现了yarn这些第三方的node包管理器以及国内的跟npm仓库同步更新的淘宝镜像(cnpm)
接下来我们就将深入去学习这些内容,让我们开始吧!
Node系列专栏开始更新了,关注博主,订阅专栏,学习Node不迷路!
一、npm的使用
npm是什么
使用npm前首先要了解什么是npm,在Node系列专栏的第一篇文章【Node.js | 从前端到全栈的必经之路】中提到npm是Node的开源仓库,并且是全球最大的开源仓库
这个仓库地址是:https://www.npmjs.com/
截至2020年3月17日,npm为大约1200万开发人员提供了130万个软件包,这些开发人员每月下载这些软件包达750亿次
要想去下载使用npm仓库里面的资源可以使用npm的指令(npm开头的,如npm i axios 下载axios)或使用其它第三方的指令(第三方的Node包管理器),如yarn等
官方说法:
npm是NodeJS的包管理和分发工具包管理就体现在它是个
NodeJS的仓库,存放并管理着NodeJS的各种软件包分发工具就体现在使用
npm的指令去下载npm仓库里的包
在我们配置NodeJS环境时,npm指令模块是随着NodeJS一起安装的,我们可以通过终端运行npm -v 查看安装的版本:

但如果默认安装的npm版本太老,你也可以自己手动安装更新npm:
npm i npm@latest -g
@latest代表安装最新版本,-g代表全局安装,这些npm指令将在后面讲到
上面可以发现一个神奇的事情,我们正在通过npm安装npm,自己安装自己?
这其实很好理解,npm的指令模块也是作为一个包存放于npm这个仓库中的,并且这个包的名字就叫npm,见npm地址:https://www.npmjs.com/package/npm

所以我们一般称呼的npm都只是指npm的这个指令模块(这个名为npm的包)
但其实
npm这个词即代指了npm指令模块,也代指了npm这个NodeJS开源仓库本身
所以就有了我们在npm中(这个npm代表NodeJS的开源仓库)下载npm(这个npm代表名为npm的这个包,这个包是npm的指令模块)的说法
npm常用指令
npm的指令非常多,这里只列举出常用的,更多信息可见npm官方文档
-
npm init:生成package.json
npm install:下载package.json中记录的所有资源npm install 包名: 下载指定的包到当前目录下npm uninstall 包名: 卸载当前目录下指定的包npm update 包名:更新当前目录下指定的包,不加包名则更新当前目录下所有包npm outdated 包名:检查当前目录下指定包是否过时,不加包名则检查当前目录下所有包npm info 包名:获取当前目录下包的详细信息npm list:查看当前目录下安装的所有包及其依赖并显示版本号(list可简写为ls)npm list 包名:查看当前目录下安装的指定包的版本号(list可简写为ls)
几点补充:
install可简写为i,如:npm install axios可简写为npm i axiosuninstall可简写为un在包名后加
@符可指定包的版本,如:npm i md5@1下载1版本的md5,npm i md5@latest表示下载最新版本的md5
npm指令后缀
-
-g:指定全局环境npm指令默认是在当前目录下操作,加上-g是指定在全局环境下操作,如上面提到的全局安装npm最新版:npm i npm@latest -g,这样在任何目录下都能使用npm -
--save可简写为-s: 指定 生产环境 下的依赖(记录在dependencies中)npm5版本之后默认是--save,如安装在生产环境和开发环境都需要用到的axios:npm i axios -s -
--save-dev可简写为-D:指定开发环境下的依赖(记录在devDependencies中)如安装生产环境下不需要使用的babel(仅在开发环境下使用的到):
npm i babel -D --save-prod可简写为-P:与--save相同--save-optional可简写为-O:指定可选依赖(记录在optionalDependencies中)--no-save:不会记录在package.json中
关于
-g,--save,--save-dev的具体作用和区别可看我的这篇文章:npm install -g/–save/–save-dev的区别
npm指令后缀也可以放到包名的前面:
npm i -g npm@latest
依赖包管理
在 npm 中,熟知的依赖是 :dependencies 和 devDependencies
除此之外,其实还有包括 :
-
peerDependencies, optionalDependenciesbundledDependencies / bundleDependencies
在内的几种依赖,这些都是在package.json中进行记录的:

上面我们说npm指令后缀时提到了这几种依赖,这里详细说一下它们代表什么:
dependencies和 devDependencies
可查看我的另一篇文章: npm install -g/–save/–save-dev的区别
peerDependencies
可查看大佬的文章:一文搞懂peerDependencies
optionalDependencies
可选依赖,如果有一些依赖包即使安装失败,项目仍然能够运行或者希望npm继续运行,就可以使用
optionalDependencies,另外optionalDependencies会覆盖dependencies中的同名依赖包,所以不要在两个地方都写
bundledDependencies / bundleDependencies
打包依赖,
bundledDependencies是一个包含依赖包名的数组对象,在发布时会将这个对象中的包打包到最终的发布包里,数组里面的包必须先在devDependencies或dependencies声明过,否则打包会报错
package.json中需要注意的包版本问题
通过npm下载的所有包的版本信息都会记录在package.json中
在运行npm i时就会根据package.json中记录的包信息进行下载,它的下载规则如下:
-
包版本以
^开头时(默认情况),会锁定大版本// package.json "dependencies": { "md5": "^2.1.0" // ^开头的 },通过
npm i将会安装md52.x.x的最新版本(2大版本下的最新版本),并不一定是2.1.0,还可能是2.3.0 -
包版本以
~开头时,会锁定到第二个大版本// package.json "dependencies": { "md5": "~2.1.0" },通过
npm i将会安装md52.1.x的最新版本(2.1版本下的最新版本),并不一定是2.1.0,还可能是2.1.1 -
包版本为
*,会锁定到最新版本// package.json "dependencies": { "md5": "*" },通过
npm i将会安装md5的最新版本 -
包版本前不带前缀,会锁定到指定版本
// package.json "dependencies": { "md5": "2.1.0" },通过
npm i将会安装md5的2.1.0版本
解决npm速度慢的问题
因为npm仓库在国外,我们在国内使用npm指令下载这个国外仓库的内容速度会比较慢
这时我们就可以运行以下指令将npm的仓库源切换到国内的淘宝镜像(cnpm) 的源:
npm config set registry https://registry.npmmirror.com
使用npm config get registry查看当前源:

往后再使用npm时就会自动从国内的淘宝镜像仓库下载了,速度就会很快
淘宝镜像之前的源地址为http://registry.npm.taobao.org,现在更改为了http://registry.npmmirror.com,查看详情
但我们这样通过修改npm的配置进行源的切换难免会有点麻烦,我们可以全局安装一个nrm来帮助我们快速的切换npm源
使用nrm快速切换npm源
全局安装nrm:
npm install -g nrm
执行nrm ls可查看可切换的npm源:

使用npm use 切换源,如切换到淘宝源:nrm use taobao

使用nrm test 源名测试相应源的响应时间:

可以看到淘宝源的响应速度要比npm的默认源快很多
中国npm镜像:cnpm
cnpm是一个完整的npmjs.org镜像,可以用它代替官方版本
cnpm与官方版本的同步频率为10分钟一次,cnpm官网
下载cnpm:
npm install -g cnpm --registry=https://registry.npmmirror.com
cnpm就是淘宝镜像,上面我们使用淘宝镜像源只是将npm的源更改为淘宝镜像(cnpm)的源(这个源其实就是指仓库的地址),之后还是通过npm指令进行使用
而这里是直接下载cnpm这个完整镜像,之后就可以使用cnpm指令而不是npm指令:
cnpm installcnpm i axios -g // ....
cnpm的指令与npm的指令完全相同,使用时直接使用cnpm代替npm就行
二、yarn的使用
yarn是Facebook发布的一款依赖管理工具,它比npm更快、更高效
安装:
npm install -g yarn
更新yarn:
yarn set version latest yarn set version from sources
优点
速度超快
yarn缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快超级安全
在执行代码之前,yarn会通过算法校验每个安装包的完整性
yarn常用指令
-
yarn init:初始化项目,生成package.json文件,生成步骤与npm init大致相同
yarn help:显示命令列表yarn install:下载package.json中记录的所有资源,可简写为yarnyarn add 包名: 下载指定的包到当前目录下yarn remove 包名: 卸载当前目录下指定的包yarn upgrade 包名:更新当前目录下指定的包,包名后可加@指定版本号来指定需要更新到的版本
yarn指令后缀
-
--dev:指定开发环境下的依赖(devDependencies),简写为-D -
--peer:指定核心依赖(peerDependencies) -
--optional:指定可选依赖(optionalDependencies)
结语
本篇文章介绍了npm和yarn,以及npm派生出的nrm,cnpm等
博主一直使用的是npm + nrm切换源的组合,因为这样不仅能保证速度快,能够方便的切换源,还不用下载像cnpm,yarn这些额外的包
npm和yarn的内容都比较多,本篇文章只是讲解了最常用的内容,如果想要了解更多可移步到对应的官网进行查看
更多node相关知识,请访问:nodejs 教程!
以上是了解两个强大的Node包管理器:npm 和 yarn的详细内容。更多信息请关注PHP中文网其他相关文章!
掌握JavaScript开发人员的命令行Jul 24, 2025 am 03:59 AM掌握基础但深入的命令行技能:熟练使用Tab补全、history、Ctrl R搜索、pwd定位及ls-la查看隐藏文件;2.高效运用Node.js与包管理器:善用npminit-y、--save-dev、npx免安装运行、npmrun脚本及outdated检查,优选pnpm提速;3.精准搜索代码与日志:结合grep-r/-i、find找文件、jq格式化JSON及xargs组合查找含特定内容的JS文件;4.编写简单脚本自动化任务:如deploy.sh一键部署,chmod x赋予执行权;5.自定义Sh
如何检查变量是否是JS中的数组?Jul 24, 2025 am 03:58 AM判断变量是否为数组类型,首选Array.isArray()方法,其次可使用Object.prototype.toString.call()。1.Array.isArray(variable)返回true或false,适用于现代浏览器和Node.js;2.Object.prototype.toString.call(variable)==='[objectArray]',兼容老旧环境。避免使用typeof和instanceof,因它们在判断数组时存在缺陷。根据需求选择合适方法:无需兼容旧版本时优先
JavaScript依赖管理策略Jul 24, 2025 am 03:58 AM保持依赖版本一致、定期更新依赖、分清依赖类型、使用Monorepo管理多项目依赖。1.使用package-lock.json或yarn.lock提交至Git以确保环境一致性;2.定期检查依赖树,避免重复安装和冲突;3.使用npmoutdated或yarnoutdated检查更新,优先处理安全问题并评估主版本升级影响;4.明确区分dependencies和devDependencies,避免生产环境误装开发工具;5.使用Lerna或Nx等工具统一管理多个项目的共享依赖与代码,提升协作效率。
带Jest和剧作家的高级JavaScript测试策略Jul 24, 2025 am 03:56 AM使用Jest的MockFunctions和Timers可控制异步行为,通过jest.fn()和jest.useFakeTimers()提升测试效率;2.Playwright中使用Fixtures和PageObjectModel(POM)可提高可维护性,封装常用操作和页面逻辑;3.Jest与Playwright可协同实现单元测试与端到端测试的全面覆盖;4.Playwright的TraceViewer可用于直观调试失败测试。这些策略分别优化测试效率、代码结构、测试层级覆盖与调试能力,适用于复杂项目提
如何使用bun:多合一的JavaScript工具包Jul 24, 2025 am 03:54 AMBun是一个现代JavaScript运行时,可替代Node.js、npm和Webpack等工具,其核心优势在于速度。1.Bun基于Zig构建,使用JavaScriptCore引擎,能直接运行JavaScript和TypeScript文件,无需额外配置;2.它内置包管理器,支持从npm安装依赖,速度比npm快10–100倍,并生成bun.lockb锁文件;3.内置原生打包器,支持最小化、环境变量、代码分割等功能,可替代Webpack或esbuild;4.提供类Jest语法的快速测试运行器,自动查找
使用JavaScript Websockets实时通信Jul 24, 2025 am 03:50 AM要实现实时通信,使用JavaScript的WebSocket关键在于理解其基本用法和常见场景。1.建立连接只需一行代码:constsocket=newWebSocket('ws://example.com/socket');,使用open、message、error、close事件处理连接状态;2.发送和接收数据常用JSON格式,通过socket.send()发送,监听message事件接收并解析数据;3.处理断开和重连可通过监听close和error事件,结合setTimeout实现自动重连,
ES模块与commonjs:详细的比较Jul 24, 2025 am 03:50 AMESModules(ESM)和CommonJS是JavaScript的两种模块系统,主要区别在于语法、加载机制、执行时机、环境支持和互操作性。1.语法上,ESM使用import/export静态声明,CommonJS使用require()/module.exports动态赋值。2.加载机制上,ESM支持静态分析和tree-shaking,CommonJS为运行时动态加载,灵活性高但不利于优化。3.执行时机上,ESM通过实时绑定处理循环依赖,能获取最新值;CommonJS缓存模块输出,可能返回部分
JavaScript和Node.js中的高级错误处理策略Jul 24, 2025 am 03:47 AMcentecustomerrorclasseslikevalidationErrandDataBaseErrortoEnablePreciseErnableSerrorhandusingInstanceOfandImproveloggingConsistency.2.usecentralizedErrizedErrizedErrizedErnizedErnizedMiddlemiddlewareinexpress.jsbypassingerrorrornothtempress()


热AI工具

Undress AI Tool
免费脱衣服图片

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Atom编辑器mac版下载
最流行的的开源编辑器

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

SublimeText3汉化版
中文版,非常好用









