最近在学习前端的过程中接触到了npm,隐隐约约感觉是和pip类似的东西,但具体是什么又没有了解很清楚,等到下载了别人的项目准备跑一下看看效果时,下载慢、nrm ls报错、切换版本等一大堆似懂非懂的东西都出现了,于是趁此机会梳理一下npm到底是什么,以及一些相关的东西。
npm
的来历
npm详细介绍请看:npm 是干什么的?(非教程) - 知乎 (zhihu.com)
社区
程序员自古以来就有社区文化:
社区的意思是:拥有共同职业或兴趣的人们,自发组织在一起,通过分享信息和资源进行合作。虚拟社区的参与者经常会在线讨论相关话题,或访问某些网站。
加入社区最大的好处之一是,你可以使用别人贡献的代码,你也可以贡献代码给别人用。
前端程序员也有社区,世界上最大的前端社区应该就是 GitHub 了。前端通过 GitHub 来:
- 分享源代码(线上代码仓库)
- 讨论问题(Issue 列表)
- 收集学习资源和常去的网站(比如优质中文前端博客)
问题
在GitHub还没有兴起的年代,前端通过网址来共享代码。
- 去 jQuery 官网下载 jQuery
- 去 BootStrap 官网下载 BootStrap
- 去 Underscore 官网下载 Underscore
- ……
当一个网站依赖的代码越来越多,就会发现需要去不同的网址上下载各种相关代码,事情变得很麻烦。
有些程序员就受不鸟了,一个拥有三大美德的程序员 Isaac Z. Schlueter (以下简称 Isaaz)给出一个解决方案:用一个工具把这些代码集中到一起来管理吧!
这个工具就是他用 JavaScript (运行在 Node.js 上)写的 npm,全称是 Node Package Manager(node包管理工具)
npm
NPM 的思路大概是这样的:
-
买个服务器作为代码仓库(registry),在里面放所有需要被共享的代码
-
发邮件通知 jQuery、Bootstrap、Underscore 作者使用 npm publish 把代码提交到 registry 上,分别取名 jquery、bootstrap 和 underscore(注意大小写)
-
社区里的其他人如果想使用这些代码,就把 jquery、bootstrap 和 underscore 写到 package.json 里,然后运行 npm install ,npm 就会帮他们下载代码
-
下载完的代码出现在 node_modules 目录里,可以随意使用了。
这些可以被使用的代码被叫做「包」(package),这就是 NPM 名字的由来:Node Package(包) Manager(管理器)。
(现在下载安装nodejs之后会默认安装npm)
cnpm
前面说到,npm其实就是有一个服务器上放了所有的包,大家连到服务器上进行下载,但因为这个东西是外国人的工作,因此服务器等等都在境外,因为墙的存在,国内使用就会受到影响,出现连接不上、下载缓慢、下载中断等等问题。因此,淘宝团队做了一件事:把国外服务器上的资源搬到国内。
来自官网:“这是一个完整npmjs.org镜像,你可以用此代替官方版本(只读,不能发布自己的包或注册用户),同步频率目前为10分钟一次以保证尽量与官方服务同步。”
如此一来,相当于直接从国内服务器下载资源,自然就没有了墙的阻挡。在使用的时候,只需要将原本的npm
变为cnpm
即可。
cnpm安装命令如下:
1 | npm install -g cnpm -registry=https://registry.npm.taobao.org |
nrm
为了使用npm方便,不止一家对npm的资源进行了备份,因此下载npm资源就有了多个来源。
原始状态下,如果想要切换npm下载资源的来源,有两种思路:
- 只对当前下载的包,指定下载的来源
1 | npm --registry https://registry.npm.taobao.org install [name] |
- 对配置文件进行更改,以后使用npm都默认使用某一个来源
1 | npm config set registry https://registry.npm.taobao.org |
但是,不同的来源又各有自己的网络条件,有时某个来源挂掉了,需要进行来源的切换,每次使用一长串命令就比较麻烦,因此出现了nrm
(npm registry manager),其使用如下:
nrm ls 列出当前可用的源
nrm use taobao 选择国内淘宝的源
nrm add taobao http://192.168.10.127:8081/repository/npm-public/ 添加源
nrm del XXX 删除对应的源
nvm
在开发中,有时候对node的版本有要求,有时候需要切换到指定的node版本来重现问题等。遇到这种需求的时候,我们需要能够灵活的切换node版本。nvm就是为解决这个问题而产生的,他可以方便的在同一台设备上进行多个node版本之间切换
- node version manager(node版本管理工具)
nvm的安装及使用可以参考:nvm-CN: 🧊 nvm安装工具 (gitee.com)
yarn
Yarn是facebook发布的一款取代npm的包管理工具。其使用与npm类似,相比来说优点如下:
速度快: npm安装包时是一个个安装,yarn采用并行方式安装;而且yarn拥有“离线模式”:如果之前已经安装过一个软件包,用Yarn再次安装时从缓存中获取,就不用像npm那样再从网络下载了。
安装版本统一: 为了防止拉取到不同的版本,Yarn 有一个锁定文件 (lock file) 记录了被确切安装上的模块的版本号。每次只要新增了一个模块,Yarn 就会创建(或更新)yarn.lock 这个文件。保证同一项目复现时安装的相关包为同一版本,这一点比npm好用很多。
多注册来源处理: 所有的依赖包,不管他被不同的库间接关联引用多少次,安装这个包时,只会从一个注册来源去装,要么是 npm 要么是 bower, 防止出现混乱不一致。
更好的语义化: yarn改变了一些npm命令的名称,比如 yarn add/remove,感觉上比 npm 原本的 install/uninstall 要更清晰。
参考及引用链接:
node中,npm、nvm、nrm、npx、cnpm区别和用法_bamboozjy的博客-CSDN博客
设置npm源的几种方式 - 云+社区 - 腾讯云 (tencent.com)
npm和yarn的区别,我们该如何选择? - 简书 (jianshu.com)