当我奔跑
npm install
它使用什么协议和端口来获取node_modules文件夹文件?我在这里或Google上搜索都没有找到答案
p5cysglq1#
当npm安装项目依赖项时,它会向其注册表发出请求,注册表位于https://registry.npmjs.org,因此,您问题的答案是HTTPS和443。HTTP未加密的Web流量是端口80,HTTPS加密流量是大多数信誉良好的站点和服务使用的,因此是端口443。
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/CommonJSCommonJS是一个旨在为Web浏览器之外的JavaScript建立模块生态系统约定的项目。
规格
规范列表包括
但是没有链接或引用每一个规范(不幸的是)。所以这里没有太多有价值的信息。如果你谷歌'模块/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下面是输出(部分):
--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输出!
https
https://registry.npmjs.org/express
express
下面是我的输出的屏幕截图:
你会注意到一些明显重要的模块属性,但有趣的是dist-tags属性,它似乎指示了latest和next的版本号。为什么latest很重要?因为如果您返回到上面的npm输出,您会注意到对NPM存储库所做的下一个https GET是:https://registry.npmjs.org/express/-/express-4.18.2.tgz其中您有4.18.2版本号(由latest属性建议)。从浏览器调用上述URL实际上会从NPM存储库下载express模块(tgz)。您会注意到它后面是一系列附加的HTTPS调用:
dist-tags
latest
next
npm
4.18.2
tgz
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状态代码。
package.json
versions > 4.18.2 > dependencies
GET 304
304未修改
指示自请求标头If-Modified-Since或If-None-Match指定的版本以来未修改资源。在这种情况下,由于客户端仍具有以前下载的副本,因此无需重新传输资源。来源:https://en.wikipedia.org/wiki/List_of_HTTP_status_codes或者换句话说,我已经有了那个依赖项,所以包(tgz)不是为我下载的,对您来说可能会有所不同。您会注意到,对于content-type模块,我以前在本地系统上没有这种依赖关系,所以下载它是为了确保满足所有列出的依赖关系。
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模块之前,所有依赖项均已正确下载并可用。所以你有它!请让我知道,如果我错过了什么。显然我只是总结了我的快速研究/调查,但我肯定会进入一个更深入的调查所有这一切。我有兴趣为自己创建自己的私人注册表。
2条答案
按热度按时间p5cysglq1#
当npm安装项目依赖项时,它会向其注册表发出请求,注册表位于https://registry.npmjs.org,因此,您问题的答案是HTTPS和443。HTTP未加密的Web流量是端口80,HTTPS加密流量是大多数信誉良好的站点和服务使用的,因此是端口443。
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.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
下面是输出(部分):
这里有几件事很有趣:
在第12行,您会注意到它建立了与注册表的
https
连接(在https://registry.npmjs.org/express
),其中要安装的模块(express
)是第一个路径项。您可以使用浏览器亲自尝试:
https://registry.npmjs.org/express
您将获得JSON输出!
下面是我的输出的屏幕截图:
你会注意到一些明显重要的模块属性,但有趣的是
dist-tags
属性,它似乎指示了latest
和next
的版本号。为什么
latest
很重要?因为如果您返回到上面的npm
输出,您会注意到对NPM存储库所做的下一个https GET是:https://registry.npmjs.org/express/-/express-4.18.2.tgz
其中您有
4.18.2
版本号(由latest
属性建议)。从浏览器调用上述URL实际上会从NPM存储库下载
express
模块(tgz
)。您会注意到它后面是一系列附加的HTTPS调用:
这些似乎是
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
可确保在使用express
模块之前,所有依赖项均已正确下载并可用。所以你有它!请让我知道,如果我错过了什么。显然我只是总结了我的快速研究/调查,但我肯定会进入一个更深入的调查所有这一切。我有兴趣为自己创建自己的私人注册表。