正因为有了npm,我们只要一行命令,就能安装别人写好的模块。
$npminstall本文介绍npm模块安装机制的细节,以及如何解决安装速度慢的问题。
$npminstall
如果你希望,一个模块不管是否安装过,npm都要强制重新安装,可以使用-f或--force参数。
$npmupdate
npmupdate命令怎么知道每个模块的最新版本呢?
它跟下面命令的效果是一样的。
返回的JSON对象里面,有一个dist.tarball属性,是该版本压缩包的网址。
npminstall或npmupdate命令,从registry下载压缩包之后,都存放在本地的缓存目录。
这个缓存目录,在Linux或Mac默认是用户主目录下的.npm目录,在Windows默认是%AppData%/npm-cache。通过配置命令,可以查看这个目录的具体位置。
$npmconfiggetcache$HOME/.npm你最好浏览一下这个目录。
$ls~/.npm#或者$npmcachels你会看到里面存放着大量的模块,储存结构是{cache}/{name}/{version}。
$npmcachelsreact~/.npm/react/react/0.14.6/~/.npm/react/react/0.14.6/package.tgz~/.npm/react/react/0.14.6/package/~/.npm/react/react/0.14.6/package/package.json每个模块的每个版本,都有一个自己的子目录,里面是代码的压缩包package.tgz文件,以及一个描述文件package/package.json。
除此之外,还会生成一个{cache}/{hostname}/{path}/.cache.json文件。比如,从npm官方仓库下载react模块的时候,就会生成registry.npmjs.org/react/.cache.json文件。
.npm目录保存着大量文件,清空它的命令如下。
$rm-rf~/.npm/*#或者$npmcacheclean五、模块的安装过程总结一下,Node模块的安装过程是这样的。
注意,一个模块安装以后,本地其实保存了两份。一份是~/.npm目录下的压缩包,另一份是node_modules目录下解压后的代码。
但是,运行npminstall的时候,只会检查node_modules目录,而不会检查~/.npm目录。也就是说,如果一个模块在~/.npm下有压缩包,但是没有安装在node_modules目录中,npm依然会从远程仓库下载一次新的压缩包。
这种行为固然可以保证总是取得最新的代码,但有时并不是我们想要的。最大的问题是,它会极大地影响安装速度。即使某个模块的压缩包就在缓存目录中,也要去远程仓库下载,这怎么可能不慢呢?
另外,有些场合没有网络(比如飞机上),但是你想安装的模块,明明就在缓存目录之中,这时也无法安装。
为了解决这些问题,npm提供了一个--cache-min参数,用于从缓存目录安装模块。
$npminstall--cache-min9999999
它还有另一种写法。
不过,这些改进没有日程表。所以,当前使用--cache-min改进安装速度,是有问题的。
社区已经为npm的离线使用,提出了几种解决方案。它们可以大大加快模块安装的速度。
解决方案大致分成三类。
第一类,Registry代理。
上面三个模块的用法很类似,都是在本机起一个Registry服务,所有npminstall命令都要通过这个服务代理。
第二类,npminstall替代。
$npm-cacheinstall第三类,node_modules作为缓存目录。
这个方案的思路是,不使用.npm缓存,而是使用项目的node_modules目录作为缓存。
上面两个工具,都能将项目的node_modules目录打成一个压缩包,以后安装的时候,就从这个压缩包之中取出文件。
(完)
snowdream说:
Pindola说:
对npm相当清析了
(--;)说:
好!镜像什么的,我倒是更建议大家学会国际加速
石樱灯笼说:
可惜win的文件系统(确切地说是系统api)对长路径支持太差了,node维护起来很吃力
WUYIM说:
npm真的很好用
Loyalsoldier说:
还有一个npm插件:node-gyp-install可以大大降低国内用npminstall命令安装一些需要C++编译器编译的插件的安装速度。
当然,首先得要学会科学上网
铁锚说:
迹忆说:
UneeWang说:
这几天是想装ghost,可是总不成功。还是先静下心学习下再说
对于在GFW内的朋友,可以试一试使用nrm这个插件,来快速切换npm的镜像,例如淘宝的npm镜像。这样npminstall时候成功率高一些。
andyyou说:
有些問題想請教,關於`{cache}/{hostname}/{path}/.cache.json`的部分有些不太明白,這份文件是存放在本機的嗎?
另外不太確定--cache-min單位是分鐘?這指的是cache到期時間嗎?
阮一峰说:
@andyyou:是的,存在本机。cache-min指缓存多少分钟。
感謝您快速的回覆,那關於檔案路徑位置該如何尋找,我在`~/.npm`下怎麼都找不著。還是觀念上有錯誤呢?
李锋说:
npminstall是不是完全不依赖node也可以单独执行?谢谢。
ZhuangSirui说:
我想问一下,通过npm安装的包,如果是需要在HTML里包含使用,路径怎么找呢?是需要手动复制出来用么?
叶婧说:
您好,我现在遇到一个问题:用npminstall指令下载modules的时候,只有~/.npm里面下载到了包,我当前项目所在的根目录根本没有node_modules。我是升级了node之后才出现这个问题的。您知道怎么解决吗?
上面这个问题我解决了,手动初始化npminit建了一个node_modules后就好了。另外有一个问题我是真的完全不知道怎么解决。我用npminstall-g想全局安装,同样,只有~/.npm里面有,全局安装却不成。我也不知道全局安装的包是放在哪里。terminal里面总是说commandnotfound。(MacOS)
cordova和ionic直接就下载不下来。
kylixs说:
本想放弃的一刻,--cache-min拯救了我,npm还不至于那么糟糕。react编译环境折腾了2天,每次安装都在中途卡住,ctrl+c重新安装,重复了几十次……最后用--cache-min分段安装,终于成功了!谢谢!
seven说:
Johnson说:
阮哥,你的一手资料都是从哪得来的,这么系统和详细啊
zhenglin说:
阮哥,我安装pm2的时候发现无论是卸载还是安装都会提示成功可是使用的时候还是很久以前安装的pm20.15的版本!
王朋说:
苹果下也可以这么使用吗?
sxy说:
阮哥新手看了教程对比发现node_modules目录下的解压过的东西和~./npm的东西并不一样,_./npm中的一些东西都没有解压.想请问机器怎么知道我要用的那些modules
stone说:
%AppData%/npm-cache应该是%AppData%/Roaming/npm-cache
dcf说:
现在npm请求得到304状态码,是不是直接从缓存中复制到当前node_modules了,不再下载了
王彭彭说:
为什么每次使用npmi指令都会删除若干node文件夹下已有依赖包。。。。?
666说:
引用石樱灯笼的发言:可惜win的文件系统(确切地说是系统api)对长路径支持太差了,node维护起来很吃力
taobao的cnpm就ok,安装包平级的,包和包之间的引用使用快捷方式
sugang说:
方大凯说:
npmnvm下不下来
belizer说:
引用王彭彭的发言:为什么每次使用npmi指令都会删除若干node文件夹下已有依赖包。。。。?
同问,这个问题有解决办法么?
漫步说:
npm_cache_share,缓存安装产物
471501748说:
local-npm也要npminstall啊???我的情况是:1.有npm,本机无网络权限,无法npminstall2.只能从远程连接的电脑下载github的代码复制粘贴回本机3.但是像webpack这样的源码,我粘贴到node_modules也好像不行啊
wbpmrck说:
阮老师你好,请教一个问题。从2013年开始使用node.js,一直被他的包管理机制所困惑,就是磁盘的占用问题:现在随随便便建一个项目,npminstall之后,node_modules就几百M.
1.Node默认从项目的node_modules里查找模块,这没问题,但是是否有必要为每一个项目的依赖包,保留他的副本在node_modules里?2.能否学习java里的gradle/Maven的方式,在.npm里缓存模块,然后项目的node_modules里放的只是一个文件夹Link到.npm里?
感谢
goodGoodSir说:
dkvirus说:
xyz说:
有个疑问,dist.tarball中的压缩文件为什么解压后会没有.gitignore文件。有什么讲究吗
panx说:
有个疑问,npminstall打包后,从私服上拉取的模块的package.json文件,包含了私服地址和该模块的存放地址"_resolved"和"_where",这两个数据能在执行inatall命令时不生成吗?