NPM 3.0 要来了
by @goddyzhao
本文先带大家回顾一点小历史,请看下面一张图:
这张图对于Node开发者来说应该是再熟悉不过了,是当年Node之父Ryan Dahl“退位让贤”给 Isaac Schlueter 时的一张漫画图,那年是 2012年1月
。就在两年后,也就是 2014年1月
,Issac又“让贤”给了当时Joyent的一个名叫 TJ Fontaine (此TJ非彼TJ,请务必淡定)的工程师,自己转而专门为NPM成立了一家公司—— npm, Inc ,大家现在用的NPM公共仓库就是该公司一项免费服务,除此之外,它还为企业提供了私有NPM仓库等增值付费服务。
现在时间到了2015年,如今的NPM已经不再单单是为Node提供包管理的服务了,正如它官网所提到的,它的目标是成为更General的包管理器。截止到本文撰写时,NPM已有 131430
个模块了,可谓体量巨大。同时就在前几天,NPM官方宣布 NPM 3.0就要来了 。
那么下面,我们就来看看NPM 3.0到底有哪些亮点:
-
CLI将拆分成多个小模块并以API的形式对外提供服务
-
npm cache要重写,将支持离线模式
-
npm install的具体内部实现逻辑将要改写
以上三点是笔者认为最大的亮点,除此之外,NPM 3.0还有很多改善,诸如: 更好的报错机制
、 更好的搜索模块体验
、 windows下路径的支持改善
等等,这里就不一一赘述了。下面就重点讲讲上面的三点吧。
CLI将拆分成多个小模块并以API的形式对外提供服务
首先官方指出这么做的原因主要是:社区很多人不断给NPM提出新的需求,一会儿要求NPM要支持 自定义脚本的hook
、一会儿又要 NPM CLI提供可定制化
等等。尽管这些需求确确实实是非常有价值的,但是官方不想给NPM无限制的加功能,让它变得很臃肿,背离了Issac心中小而美的初衷。于是呢,就将 NPM中不同的功能模块拆分出来,独立成一个个子项目,从而实现给NPM“瘦身”,然后不同的模块通过对外提供统一的API接口来实现互相的协作。
大家是不是想到了Unix哲学?没错,每个模块完成特定的任务,互相之间解耦。这种做法也属于非常常见的“瘦身”做法,connect 3.0就是最好的例子。这样做的好处也是显而易见的:
-
NPM核心模块会变得非常轻量级
-
子模块变得更好维护
-
子模块测试起来更容易
-
模块之间可插拔,功能通过“搭积木式”的方式来组合
这种改变对于开发者来说,个人认为应当是透明的。NPM应该会将满足常规需求的子模块在你安装NPM的时候就自动安装好,如果需要额外扩展模块就单独安装。所以,基本不影响开发者。
npm cache要重写,将支持离线模式
npm cache目前的cache机制简单来说就是将下载下来的模块的tar包,默认放在 ~/.npm/{module}/{version}
目录中(其中 ~/.npm
是可以通过 npm config
来配置的),通过写入一个 .cache.json
文件来记录一些 meta
信息,如: etag
值等。这样就可以当你下次再安装这个模块的时候,检查是否缓存版本有效,有效则直接本地读取否则就再通过网络去请求。但是这种缓存机制不支持通过 git
和 http url
方式安装的模块。内部缓存模块实现机制有很多缺点(关于这部分,笔者以后会专门写文章介绍)。
那么对于NPM 3.0中这部分具体如何重写官方没有透露太多细节,只知道重写后:
-
让缓存的内容可访问,这样类似shrinkwrap这样的工具就不需要经常去访问网络
-
将缓存部分功能单独成独立的API
-
支持离线
以上几点的改进其实有点类似一个名为 npmd
的模块,它就是为了解决现有 npm cache
问题而生的,看来NPM 3.0借鉴了很多来自于它的idea。
对于开发者而言,特别是国内开发者而言,缓存机制的完善和离线模式的支持,多多少少对我们这种访问npm源如龟速的朋友是收益多多的。(当然,要单纯提高速度可以使用淘宝提供的镜像——CNPM)。
npm install的具体内部实现逻辑将要改写
目前大家通过 npm install
某个模块时,就会出现一个 loading
状态的指针,然后就长时间在那里转啊转,完全不知道干了什么。如果实在长时间不动呢,还可以通过 npm install --verbose
来看看日志。而且现阶段的 npm install
是将依赖分析和安装,这两个过程混在一起的。因此,NPM 3.0重写这部分实现后,将:
-
将这两部分分离,并且整体实现更加简化
-
同时会提供更好的依赖关系输出
其实这部分改写听起来还是和 npmd resolve
以及 npmd install
有点相似。不过这不重要,重要的是对于开发者而言安装将会更加友好。
总结下来,对于开发者(NPM使用者)来说,NPM 3.0 绝大部分的改进都是透明的,最终会带来更好的体验。但是对于NPM自身来说,意味是深远。这次改进正是为了更好地成为更通用的包管理器而迈出的一大步!
我们所有的文章均在https://github.com/jieio/du开源,欢迎提问和投稿