npm模块安装机制简介

正因为有了npm,我们只要一行命令,就能安装别人写好的模块。

$npminstall本文介绍npm模块安装机制的细节,以及如何解决安装速度慢的问题。

$npminstall安装之前,npminstall会先检查,node_modules目录之中是否已经存在指定模块。如果存在,就不再重新安装了,即使远程仓库已经有了一个新版本,也是如此。

如果你希望,一个模块不管是否安装过,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上面命令指定,只有超过999999分钟的模块,才从registry下载。实际上就是指定,所有模块都从缓存安装,这样就大大加快了下载速度。

它还有另一种写法。

不过,这些改进没有日程表。所以,当前使用--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命令时不生成吗?

THE END
1.steam离线模式怎么开steam离线模式开启方法steam的在线状态是可以由用户来进行设置切换的,使用steam的过程中,如果我们不想让好友看到自己在线,或者因为一些原因想要暂时下线的话,就可以设置开启离线模式。那么steam离线模式怎么开呢?下面小编就来为大家介绍一下steam离线模式的开启方法。 steam离线模式怎么开? https://shouyou.3dmgame.com/gl/404894.html
2.离线模式是什么意思?简单解释一下这个功能你的智能手机有离线模式,但很多人不太清楚它的含义以及何时使用。 离线模式:这个表达的意思是什么 如果你没有联网,就处于离线状态。这两个小词可以描述你的智能手机是否连接到互联网。但你的手机上还有一个特殊的离线模式,也称为飞行模式。 一般来说,当你在外出时关闭手机上的移动数据,就可以说处于离线模式。离线https://www.practical-tips.com/zh/%E4%BA%92%E8%81%94%E7%BD%91/%E7%A6%BB%E7%BA%BF%E6%A8%A1%E5%BC%8F%E6%98%AF%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D%EF%BC%9F%E7%AE%80%E5%8D%95%E8%A7%A3%E9%87%8A%E4%B8%80%E4%B8%8B%E8%BF%99%E4%B8%AA%E5%8A%9F%E8%83%BD/
3.服务器什么是离线模式?Worktile社区综上所述,离线模式是指服务器在没有互联网连接的情况下运行的模式,通过使用离线数据库和离线缓存等技术,服务器能够提供基本的功能,并在恢复网络连接时与在线数据库同步数据。离线模式在某些特殊场景下非常有用,但也需要克服一些限制和挑战。 离线模式是指Minecraft服务器的一种运行模式,该模式允许玩家在没有连接到Minehttps://worktile.com/kb/ask/1456862.html
4.toggleofflinemodetoggle offline mode是一个英文短语,指的是切换到离线模式。离线模式是指设备或应用程序在没有网络连接的情况下仍然能够正常工作。 通常,我们可以在设备或应用程序的设置中找到切换离线模式的选项。一旦启用离线模式,设备或应用程序将不再依赖于网络连接来获取数据或执行某些功能。 https://wenku.csdn.net/answer/5hzpqrnzbe
5.android离线模式mob64ca12eee07b的技术博客Android离线模式实现指南 1. 简介 在Android开发中,离线模式是指应用程序可以在没有网络连接的情况下继续正常运行,并提供必要的功能。本文将介绍如何实现Android离线模式,并提供详细的步骤和示例代码。 2. 实现步骤 以下是实现Android离线模式的基本步骤。可以使用表格展示这些步骤。 https://blog.51cto.com/u_16213425/8467970
6.Steam客服::离线模式大多数游戏都需要在连接至 Steam 网络时进行初始化启动才能在离线模式工作。 如果您的游戏状态为“100% - 准备就绪”,但是您在尝试离线游戏时仍收到“该游戏无法在离线模式启动”的消息,那么 Steam 客户端和/或游戏文件需要更新。 游戏需求 需要有效的网络连接或使用外部启动器的游戏不会在离线模式工作。https://help.steampowered.com/zh-cn/faqs/view/0E18-319B-E34B-B2C8
7.手机离线模式中文名 手机离线模式 作用 关闭所有网络功能 别称 飞行模式、航空模式 好处 手机耗电降到最低目录 1简介功能 模式 好处 提示 2相关损耗 3相关误区 4词条图册 1简介功能编辑模式 简单的说就是在飞机飞行时使用的模式.在飞机飞行时如果使用手机会有干扰信号,对航空安全造成危害!所以有关航空管理规定在飞机上是严禁使https://baike.sogou.com/v7885404.htm
8.什么是手机离线模式?相当于把手机卡拔出来一样,打不了电话,发不了信息 https://wenwen.soso.com/z/q393276591.htm
9.抖音离线模式什么意思抖音离线模式意思介绍抖音离线模式是抖音APP中的一种功能,它允许用户在没有网络连接的情况下观看已经下载的视频,这个功能对于那些经常在网络不稳定或者没有网络的地方使用抖音的用户来说非常有用,下面,我们将详细介绍抖音离线模式的使用方法和注意事项。 (图片来源网络,侵删) https://www.kdun.com/ask/430287.html
10.Steam离线模式怎么开Steam离线模式开启方法百战电竞Steam在离线模式下可以玩朋友共享库里的游戏,但不用担心朋友自己在游戏时被踢下线。那么Steam离线模式怎么开呢?下面带来了简单的介绍,有需要的玩家可以了解一下。 Steam离线模式开启方法 1、点击位于主页面左上角的“Steam”键,在下拉菜单中找到“进入离线模式”并单击该选项。 https://www.baizhan.net/a/1658374104775660.html
11.vivo听说vivo听说-离线模式如何使用?为了听障人士与其他人沟通能够顺畅且稳定,我们为“vivo听说”增加了离线模式。在无网情况下,“vivo听说”也能正常进行普通话、文字相互转换。 操作指引:进入【设置 > 快捷与辅助 > 无障碍 > (听觉辅助)vivo听说 > 右上角设置图标】即可开启“离线模式”。https://www.vivo.com/service/questions/all?categoryId=170&questionId=1825
12.逃离塔科夫离线模式怎么打开逃离塔科夫离线模式玩法介绍游戏中有离线模式可以体验,有些玩家不知道怎么进入这个模式,游侠网小编为大家整理了逃离塔科夫离线模式玩法介绍,一起来看下文中的具体的介绍吧。 逃离塔科夫离线模式玩法介绍 以PMC阵营进入地图选择界面后不断点击下一步就能看到开启离线模式。 勾选开启离线模式后就能自定义游戏内容,玩家可以选择是否放弃原来的天气和时间https://mip.ali213.net/gl/html/414733.html
13.steam如何离线电脑软件steam离线模式可在无网络的情况下玩游戏。步骤如下:1. 登录steam,点击“steam”菜单;2. 选择“离线”选项;3. 退出离线模式时,点击“steam”菜单,选择“在线”选项。 Steam离线模式 如何让Steam离线? 进入离线模式的步骤如下: 确保您已连接互联网并登录Steam。 https://m.php.cn/faq/960514.html
14.F12020steam离线正版自己买游戏不划算,挑一款游戏,几元钱买个离线版账号爽一爽毫无压力,它不香吗? 问:为什么一定要用离线模式? 答:离线模式账号也是正常账号,和你自己的账号没有功能上的区别。但账号可能同时被多个用户在激活,使用离线模式才不会被别的用户顶下线。 问:如何设置离线模式? 答:购买后获取账号信息,登录steam,在左上https://www.9891.com/product/1299870.html
15.IntelliJIDEA入门教程(十一):离线工作默认情况下,Gradle连接到远程存储库并在每次启动时检查更新。解决Gradle依赖性可能需要下载新的工件。如果希望Gradle仅使用本地可用的那些资源,则可以切换到离线模式。 将Gradle切换为离线模式? 在Gradle工具窗口中,单击 。 这会将--offline选项附加到IntelliJ IDEA运行的所有Gradle命令中。它还将报告在本地存储库中找不https://www.evget.com/doclib/s/122/14671
16.戴尔Win11跳过联网,轻松畅享离线体验电脑知识1、提升离线体验:未来可以进一步优化离线模式下的功能,提供更多离线使用的便利,满足用户的多样化需求。 2、增加离线应用支持:未来可以开发更多支持离线使用的应用程序,丰富离线模式下的应用生态。 总结:戴尔Win11系统提供了跳过联网的离线体验,用户可以在没有网络连接的情况下,轻松畅享电脑的功能。通过设置离线模式,用户可以https://www.163987.com/jiaocheng/73120.html
17.抖音怎么开启离线观看模式抖音可以开启离线观看模式,但是很多的小伙伴都不知道怎么才可以开启离线观看模式,于是我就做了这份教大家开启离线观看模式的教程,希望各位小伙伴看完这份教程之后都可以学会开启离线观看模式的方法。那么抖音怎么开启离线观看模式呢?这个问题就由我来为你解答。 https://m.yxwoo.com/article/59584.html
18.艾尔登法环在线和离线区别是什么在线模式和离线模式最大的区别,就在于交互性。在线模式中的交互性可以给玩家带来丰富的游戏体验。而离线模式则更像传统的角色扮演游戏,玩家更能够独自体验游戏的世界观和剧情。没有了其他玩家的干扰,游戏的进度完全在自己手中。这种孤独的体验使得艾尔登法环的死亡和探索更加有压力与紧张感。 https://www.52xz.com/information07/418002.html