NPM本地缓存方案

如果你被前一篇《centos下搭建npm镜像》搞晕了搞挫败了搞得萎了,毕竟完整镜像npm几十G的内容需要大量的时间,期间可能遇到各种网络问题(由于某些大家都知道的原因),或者像这位哥们吐槽官方教程不给力(https://github.com/npm/npmjs.org/issues/106),你只是想简单架个本地服务而不具备太多系统或程序相关的知识,无法一下子处理各种奇葩的异常,那么你应该继续看下去。

NPM本地缓存?

在天朝网络环境下做nodejs相关开发,在我看来最痛的点就是使用npm的时候各种依赖包下载超级慢和各种异常,所以我关注的几个点:

1,下载依赖速度要快
2,不会因为npm官方镜像挂掉而影响开发
3,私有模块管理

当然,你可以常年挂着VPN,你可以找几个国内靠谱的镜像出现问题的时候切换过去,你可以内部管理模块然后npm link,就可以解决上面的问题,在这之外不妨动手自己架设一个本地服务。

找了一圈,我发现了两个cache模块:https://github.com/mixu/npm_lazyhttps://github.com/rlidwka/sinopia,这两个模块的实现彻底消除了之前完整镜像npm官方的痛,几乎是零配置,他们基本的思路基本一致:在本地运行一个服务器实例,初始化一个空的“仓库”,我们无需关心它是什么样的仓库,当用户向本地服务器发起请求时,先检查本地是否有现成的已更新的包,有则从本地仓库返回,无则从官方或指定的镜像下载请求所需要的包缓存到本地并返回给用户。从某种程度上,该逻辑解决了我们前面提到的两个问题大多数情况,因为如果你使用一个从来没使用过的模块就还是有问题。关于私有模块,sinopia提供了自己的解决方案,私有模块都建议以“local-”开头进行发布,npm_lazy则没有提及。

npm_lazy的使用

作为演示,我们选择npm_lazy快速的架设一个本地npm cache服务。

测试环境:

和其他npm模块一样,你只需一条命令,全局安装即可:

然后在终端里执行npm_lazy服务就跑起来了,是不是很简单→_→,有一点需要注意,如果你是要在内网供大家使用的,而不是本地自己用,需要修改一下配置,让它监听所有ip的请求。

修改后的配置文件config.js如下:

你需要修改的配置就是把我示例里是x.x.x.x换成你的服务器的内网ip即可,注意externalUrl和port的端口保持一致,externalUrl最后不要以/结尾,其他字段根据自己的需求调整,比如缓存时间,失败重连次数和外网镜像等。服务跑起来后,你需要设置一下你工作机的npm,将它的镜像地址改成你自己的内网服务器就可以开始使用了。

正常使用npm intall安装

npm install

npm install

sinopia的安装过程也是一样的,顺便把配置晒一下:

上述配置config.yaml是通过config_def.yaml复制改名得到的,listen的值改为0.0.0.0:4873用于监听所有ip的请求,其他配置根据需求自己定制。

npm_lazy功能相对简单,关于sinopia更多的配置信息,注意事项,以及其他类似功能的包可以看https://github.com/rlidwka/sinopia

如需转载,请注明出处:https://i.wanz.im/2014/01/21/npm-local-cache-solution/