NPM 3.0 要来了

jopen 9年前

原文  http://mp.weixin.qq.com/s?__biz=MzA3OTQwNTM2Ng==&mid=203444042&idx=1&sn=a7bb09bed40baed830f7893068db71c2

by @goddyzhao

本文先带大家回顾一点小历史,请看下面一张图:

NPM 3.0 要来了

这张图对于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到底有哪些亮点:

  1. CLI将拆分成多个小模块并以API的形式对外提供服务

  2. npm cache要重写,将支持离线模式

  3. npm install的具体内部实现逻辑将要改写

以上三点是笔者认为最大的亮点,除此之外,NPM 3.0还有很多改善,诸如: 更好的报错机制 更好的搜索模块体验 windows下路径的支持改善 等等,这里就不一一赘述了。下面就重点讲讲上面的三点吧。

CLI将拆分成多个小模块并以API的形式对外提供服务

首先官方指出这么做的原因主要是:社区很多人不断给NPM提出新的需求,一会儿要求NPM要支持 自定义脚本的hook 、一会儿又要 NPM CLI提供可定制化 等等。尽管这些需求确确实实是非常有价值的,但是官方不想给NPM无限制的加功能,让它变得很臃肿,背离了Issac心中小而美的初衷。于是呢,就将 NPM中不同的功能模块拆分出来,独立成一个个子项目,从而实现给NPM“瘦身”,然后不同的模块通过对外提供统一的API接口来实现互相的协作。

大家是不是想到了Unix哲学?没错,每个模块完成特定的任务,互相之间解耦。这种做法也属于非常常见的“瘦身”做法,connect 3.0就是最好的例子。这样做的好处也是显而易见的:

  1. NPM核心模块会变得非常轻量级

  2. 子模块变得更好维护

  3. 子模块测试起来更容易

  4. 模块之间可插拔,功能通过“搭积木式”的方式来组合

这种改变对于开发者来说,个人认为应当是透明的。NPM应该会将满足常规需求的子模块在你安装NPM的时候就自动安装好,如果需要额外扩展模块就单独安装。所以,基本不影响开发者。

npm cache要重写,将支持离线模式

npm cache目前的cache机制简单来说就是将下载下来的模块的tar包,默认放在 ~/.npm/{module}/{version} 目录中(其中 ~/.npm 是可以通过 npm config 来配置的),通过写入一个 .cache.json 文件来记录一些 meta 信息,如: etag 值等。这样就可以当你下次再安装这个模块的时候,检查是否缓存版本有效,有效则直接本地读取否则就再通过网络去请求。但是这种缓存机制不支持通过 githttp url 方式安装的模块。内部缓存模块实现机制有很多缺点(关于这部分,笔者以后会专门写文章介绍)。

那么对于NPM 3.0中这部分具体如何重写官方没有透露太多细节,只知道重写后:

  1. 让缓存的内容可访问,这样类似shrinkwrap这样的工具就不需要经常去访问网络

  2. 将缓存部分功能单独成独立的API

  3. 支持离线

以上几点的改进其实有点类似一个名为 npmd 的模块,它就是为了解决现有 npm cache 问题而生的,看来NPM 3.0借鉴了很多来自于它的idea。

对于开发者而言,特别是国内开发者而言,缓存机制的完善和离线模式的支持,多多少少对我们这种访问npm源如龟速的朋友是收益多多的。(当然,要单纯提高速度可以使用淘宝提供的镜像——CNPM)。

npm install的具体内部实现逻辑将要改写

目前大家通过 npm install 某个模块时,就会出现一个 loading 状态的指针,然后就长时间在那里转啊转,完全不知道干了什么。如果实在长时间不动呢,还可以通过 npm install --verbose 来看看日志。而且现阶段的 npm install 是将依赖分析和安装,这两个过程混在一起的。因此,NPM 3.0重写这部分实现后,将:

  1. 将这两部分分离,并且整体实现更加简化

  2. 同时会提供更好的依赖关系输出

其实这部分改写听起来还是和 npmd resolve 以及 npmd install 有点相似。不过这不重要,重要的是对于开发者而言安装将会更加友好。

总结下来,对于开发者(NPM使用者)来说,NPM 3.0 绝大部分的改进都是透明的,最终会带来更好的体验。但是对于NPM自身来说,意味是深远。这次改进正是为了更好地成为更通用的包管理器而迈出的一大步!

我们所有的文章均在https://github.com/jieio/du开源,欢迎提问和投稿