npm使用什么协议和端口?

js81xvg6  于 2023-03-12  发布在  其他
关注(0)|答案(2)|浏览(277)

当我奔跑

npm install

它使用什么协议和端口来获取node_modules文件夹文件?
我在这里或Google上搜索都没有找到答案

p5cysglq

p5cysglq1#

当npm安装项目依赖项时,它会向其注册表发出请求,注册表位于https://registry.npmjs.org,因此,您问题的答案是HTTPS和443。HTTP未加密的Web流量是端口80,HTTPS加密流量是大多数信誉良好的站点和服务使用的,因此是端口443。

pqwbnv8z

pqwbnv8z2#

我对同样的事情也很好奇,就想到了你的问题。不幸的是,没有得到真正的答案(至少让我满意)。所以我做了更多的挖掘,发现了以下内容(如果有帮助的话)。

NPM维基百科

如果你读过NPM维基百科页面,它会说:
来源:https://en.wikipedia.org/wiki/Npm_(software)
npm完全是用JavaScript编写的,由Isaac Z. Schlueter开发,因为他“看到模块打包做得很糟糕”,并从其他类似的项目(如PEAR(PHP)和CPAN(Perl))中获得灵感。
npm由一个命令行客户端组成,它与远程注册中心交互。它允许用户使用和分发注册中心中可用的JavaScript模块。注册中心中的包是CommonJS格式的,并包含JSON格式的元数据文件。
如果你去CommonJS维基百科:
来源:https://en.wikipedia.org/wiki/CommonJS
CommonJS是一个旨在为Web浏览器之外的JavaScript建立模块生态系统约定的项目。

规格

规范列表包括

  • 模块/1.0(被模块/1.1取代)
  • 模块/1.1
  • 模块/1.1.1
  • Package /1.0
  • 系统/1.0

但是没有链接或引用每一个规范(不幸的是)。所以这里没有太多有价值的信息。
如果你谷歌'模块/1.1.1规范'你会得到这个Wiki页面:
https://wiki.commonjs.org/wiki/Modules/1.1.1
但它似乎更侧重于客户端,而不是服务器端(或注册表)。
谷歌搜索“System/1.0规范”一无所获。
另一方面,在Google上搜索'Packages/1.0 specifications'会福尔斯在这个Wiki页面上:
https://wiki.commonjs.org/wiki/Packages/1.1
现在我们似乎发现了一些有趣的事情(很快你就会知道为什么)!
根据@Ankur在帖子中的评论,如果您使用--verbose标志(我使用了),则会得到以下结果:
npm install --verbose express
下面是输出(部分):

npm info it worked if it ends with ok
npm verb cli [
npm verb cli   'C:\\Program Files\\nodejs\\node.exe',
npm verb cli   'C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js',
npm verb cli   'install',
npm verb cli   '--verbose',
npm verb cli   'express'
npm verb cli ]
npm info using npm@6.14.15
npm info using node@v14.18.1
npm verb npm-session 0c3dc38af8d96c85
npm http fetch GET 200 https://registry.npmjs.org/express 638ms
npm http fetch GET 200 https://registry.npmjs.org/express/-/express-4.18.2.tgz 15ms (from cache)
npm timing stage:loadCurrentTree Completed in 720ms
npm timing stage:loadIdealTree:cloneCurrentTree Completed in 0ms
npm timing stage:loadIdealTree:loadShrinkwrap Completed in 1ms
npm http fetch GET 304 https://registry.npmjs.org/accepts 334ms (from cache)
npm http fetch GET 304 https://registry.npmjs.org/array-flatten 354ms (from cache)
npm http fetch GET 304 https://registry.npmjs.org/content-disposition 385ms (from cache)
npm http fetch GET 200 https://registry.npmjs.org/content-type 412ms
npm http fetch GET 304 https://registry.npmjs.org/escape-html 89ms (from cache)
npm http fetch GET 304 https://registry.npmjs.org/etag 85ms (from cache)
npm http fetch GET 304 https://registry.npmjs.org/encodeurl 438ms (from cache)
npm http fetch GET 200 https://registry.npmjs.org/body-parser 454ms
npm http fetch GET 200 https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz 59ms
npm http fetch GET 304 https://registry.npmjs.org/finalhandler 89ms (from cache)
npm http fetch GET 304 https://registry.npmjs.org/debug 478ms (from cache)
npm http fetch GET 304 https://registry.npmjs.org/cookie 493ms (from cache)
  • 注意:输出会持续数百行(但这并不重要)。*

这里有几件事很有趣:
在第12行,您会注意到它建立了与注册表的https连接(在https://registry.npmjs.org/express),其中要安装的模块(express)是第一个路径项。
您可以使用浏览器亲自尝试:
https://registry.npmjs.org/express
您将获得JSON输出!

  • 提示:如果您希望以结构化方式查看浏览器,并选择颜色编码,请为浏览器安装JSON扩展。*

下面是我的输出的屏幕截图:

你会注意到一些明显重要的模块属性,但有趣的是dist-tags属性,它似乎指示了latestnext的版本号。
为什么latest很重要?因为如果您返回到上面的npm输出,您会注意到对NPM存储库所做的下一个https GET是:
https://registry.npmjs.org/express/-/express-4.18.2.tgz
其中您有4.18.2版本号(由latest属性建议)。
从浏览器调用上述URL实际上会从NPM存储库下载express模块(tgz)。
您会注意到它后面是一系列附加的HTTPS调用:

npm http fetch GET 304 https://registry.npmjs.org/accepts 334ms (from cache)
npm http fetch GET 304 https://registry.npmjs.org/array-flatten 354ms (from cache)
npm http fetch GET 304 https://registry.npmjs.org/content-disposition 385ms (from cache)
npm http fetch GET 200 https://registry.npmjs.org/content-type 412ms
npm http fetch GET 304 https://registry.npmjs.org/escape-html 89ms (from cache)
npm http fetch GET 304 https://registry.npmjs.org/etag 85ms (from cache)
npm http fetch GET 304 https://registry.npmjs.org/encodeurl 438ms (from cache)
npm http fetch GET 200 https://registry.npmjs.org/body-parser 454ms
npm http fetch GET 200 https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz 59ms
npm http fetch GET 304 https://registry.npmjs.org/finalhandler 89ms (from cache)
npm http fetch GET 304 https://registry.npmjs.org/debug 478ms (from cache)

这些似乎是express模块的依赖项。(目前,我还需要做更多的研究),就是这个列表是否从tgz模块包本身获得(在package.json文件中),或者从原始HTTPS调用(从versions > 4.18.2 > dependencies列表中。我猜它们应该是相同的,所以理论上你用哪个列表都无所谓。但实际上...
最后,您会注意到,我得到的大多数响应都是GET 304,这是“Not Modified”的HTTP状态代码。

304未修改

指示自请求标头If-Modified-Since或If-None-Match指定的版本以来未修改资源。在这种情况下,由于客户端仍具有以前下载的副本,因此无需重新传输资源。
来源:https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
或者换句话说,我已经有了那个依赖项,所以包(tgz)不是为我下载的,对您来说可能会有所不同。
您会注意到,对于content-type模块,我以前在本地系统上没有这种依赖关系,所以下载它是为了确保满足所有列出的依赖关系。

npm http fetch GET 200 https://registry.npmjs.org/content-type 412ms
npm http fetch GET 200 https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz 59ms

npm可确保在使用express模块之前,所有依赖项均已正确下载并可用。
所以你有它!请让我知道,如果我错过了什么。显然我只是总结了我的快速研究/调查,但我肯定会进入一个更深入的调查所有这一切。我有兴趣为自己创建自己的私人注册表。

相关问题