node包管理工具梳理

最近在学习前端的过程中接触到了npm,隐隐约约感觉是和pip类似的东西,但具体是什么又没有了解很清楚,等到下载了别人的项目准备跑一下看看效果时,下载慢、nrm ls报错、切换版本等一大堆似懂非懂的东西都出现了,于是趁此机会梳理一下npm到底是什么,以及一些相关的东西。

npm的来历

npm详细介绍请看:npm 是干什么的?(非教程) - 知乎 (zhihu.com)

社区

程序员自古以来就有社区文化:

社区的意思是:拥有共同职业或兴趣的人们,自发组织在一起,通过分享信息和资源进行合作。虚拟社区的参与者经常会在线讨论相关话题,或访问某些网站。

加入社区最大的好处之一是,你可以使用别人贡献的代码,你也可以贡献代码给别人用。

前端程序员也有社区,世界上最大的前端社区应该就是 GitHub 了。前端通过 GitHub 来:

  1. 分享源代码(线上代码仓库)
  2. 讨论问题(Issue 列表)
  3. 收集学习资源和常去的网站(比如优质中文前端博客

问题

在GitHub还没有兴起的年代,前端通过网址来共享代码。

  1. 去 jQuery 官网下载 jQuery
  2. 去 BootStrap 官网下载 BootStrap
  3. 去 Underscore 官网下载 Underscore
  4. ……

当一个网站依赖的代码越来越多,就会发现需要去不同的网址上下载各种相关代码,事情变得很麻烦。

有些程序员就受不鸟了,一个拥有三大美德的程序员 Isaac Z. Schlueter (以下简称 Isaaz)给出一个解决方案:用一个工具把这些代码集中到一起来管理吧!

这个工具就是他用 JavaScript (运行在 Node.js 上)写的 npm,全称是 Node Package Manager(node包管理工具)

npm

NPM 的思路大概是这样的:

  1. 买个服务器作为代码仓库(registry),在里面放所有需要被共享的代码

  2. 发邮件通知 jQuery、Bootstrap、Underscore 作者使用 npm publish 把代码提交到 registry 上,分别取名 jquery、bootstrap 和 underscore(注意大小写)

  3. 社区里的其他人如果想使用这些代码,就把 jquery、bootstrap 和 underscore 写到 package.json 里,然后运行 npm install ,npm 就会帮他们下载代码

  4. 下载完的代码出现在 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. 只对当前下载的包,指定下载的来源
1
npm --registry https://registry.npm.taobao.org install [name]
  1. 对配置文件进行更改,以后使用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)

yarn的安装和使用_yw00yw的博客-CSDN博客_yarn安装

yarn和npm的区别、–save和–save-dev的区别 - 简书 (jianshu.com)