W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
npm 使用的文件夾結(jié)構(gòu)
npm 將各種東西放在你的計(jì)算機(jī)上。這就是它的工作。
這份文件會(huì)告訴你它放在什么地方.
tl;dr
./node_modules
當(dāng)前包根目錄。-g
):將東西放在 /usr/local 或安裝節(jié)點(diǎn)的任何地方。require()
它。npm link
.
前綴配置
的prefix
配置默認(rèn)為在安裝節(jié)點(diǎn)的位置。在大多數(shù)系統(tǒng)上,這是/usr/local
.?在 Windows 上,它是%AppData%\npm
.?在 Unix 系統(tǒng)上,它是一個(gè)級(jí)別,因?yàn)楣?jié)點(diǎn)通常安裝在?{prefix}/bin/node
而不是{prefix}/node.exe
.
global
標(biāo)志設(shè)置,NPM安裝的東西到這個(gè)前綴。如果未設(shè)置,則使用當(dāng)前包的根目錄,如果不在包中,則使用當(dāng)前工作目錄。
節(jié)點(diǎn)模塊
包被丟棄到node_modules
文件夾下prefix
。在本地安裝時(shí),這意味著您可以?require("packagename")
加載其主模塊,也?require("packagename/lib/path/to/sub/module")
可以加載其他模塊。
Unix 系統(tǒng)上的全局安裝轉(zhuǎn)到{prefix}/lib/node_modules
.?Windows 上的全局安裝轉(zhuǎn)到{prefix}/node_modules
(即,沒有?lib
文件夾。)
作用域包的安裝方式相同,不同之處在于它們被組合在相關(guān)node_modules
文件夾的子文件夾中,該文件夾的名稱由 @ 符號(hào)組成,例如npm install @myorg/package
將包放在{prefix}/node_modules/@myorg/package
.?有關(guān)scope
更多詳細(xì)信息,請(qǐng)參閱?。
如果你想要require()
一個(gè)包,然后在本地安裝它。
可執(zhí)行文件
在全局模式下,可執(zhí)行文件{prefix}/bin
在 Unix上鏈接到,或{prefix}
在 Windows 上直接鏈接到。確保路徑在您的終端PATH
環(huán)境中以運(yùn)行它們。
在本地模式下,可執(zhí)行文件被鏈接,?./node_modules/.bin
以便它們可用于通過 npm 運(yùn)行的腳本。(例如,當(dāng)您運(yùn)行時(shí),測(cè)試運(yùn)行器將位于路徑中npm test
。)
手冊(cè)頁
在全局模式下,手冊(cè)頁鏈接到{prefix}/share/man
.
在本地模式下,不安裝手冊(cè)頁。
手冊(cè)頁未安裝在 Windows 系統(tǒng)上。
緩存
見npm cache
。緩存文件存儲(chǔ)在~/.npm
Posix 或?%AppData%/npm-cache
Windows 上。
這是由cache
配置參數(shù)控制的。
臨時(shí)文件
臨時(shí)文件默認(rèn)存儲(chǔ)在tmp
配置指定的文件夾中?,默認(rèn)為 TMPDIR、TMP 或 TEMP 環(huán)境變量,或者/tmp
在 Unix 和c:\windows\temp
Windows 上。
每次運(yùn)行程序時(shí),都會(huì)在此根目錄下為臨時(shí)文件指定一個(gè)唯一文件夾,并在成功退出后刪除。
更多信息
在本地安裝時(shí),npm 首先嘗試尋找合適的?prefix
文件夾。這樣npm install foo@1.2.3
即使您碰巧cd
進(jìn)入了其他文件夾,它也會(huì)安裝到您的軟件包的合理根目錄中。
從 $PWD 開始,npm 將沿著文件夾樹檢查包含package.json
文件或node_modules
?文件夾的文件夾。如果找到這樣的東西,那么為了運(yùn)行 npm 命令,它被視為有效的“當(dāng)前目錄”。(此行為的靈感來自并類似于在工作目錄中運(yùn)行 git 命令時(shí) git 的 .git-folder 查找邏輯。)
如果未找到包根目錄,則使用當(dāng)前文件夾。
當(dāng)你運(yùn)行時(shí)npm install foo@1.2.3
,包被加載到緩存中,然后解壓到./node_modules/foo
.?然后,任何 foo 的依賴項(xiàng)都類似地解壓到?./node_modules/foo/node_modules/...
.
任何 bin 文件都被符號(hào)鏈接到./node_modules/.bin/
,以便在必要時(shí)可以通過 npm 腳本找到它們。
全球安裝
如果global
配置設(shè)置為 true,則 npm 將“全局”安裝軟件包。
對(duì)于全局安裝,軟件包的安裝方式大致相同,但使用上述文件夾。
循環(huán)、沖突和文件夾簡約
循環(huán)使用節(jié)點(diǎn)的模塊系統(tǒng)的屬性處理,它會(huì)在目錄中查找node_modules
文件夾。因此,在每個(gè)階段,如果一個(gè)包已經(jīng)安裝在祖先node_modules
?文件夾中,那么它不會(huì)安裝在當(dāng)前位置。
考慮上面的情況,其中foo -> bar -> baz
。想象一下,除此之外,如果 baz 依賴于 bar,那么您將擁有:?foo -> bar -> baz -> bar -> baz ...
.?但是,由于文件夾結(jié)構(gòu)是:foo/node_modules/bar/node_modules/baz
,因此無需將 bar 的另一個(gè)副本放入.../baz/node_modules
,因?yàn)楫?dāng)它調(diào)用 require("bar") 時(shí),它將獲得安裝在?foo/node_modules/bar
.
僅當(dāng)在多個(gè)嵌套node_modules
文件夾中安裝完全相同的版本時(shí)才使用此快捷方式。a/node_modules/b/node_modules/a
如果兩個(gè)“a”包是不同的版本,仍然有可能。但是,如果不多次重復(fù)完全相同的包,將始終防止無限倒退。
另一種優(yōu)化可以通過在本地化的“目標(biāo)”文件夾下的最高級(jí)別安裝依賴項(xiàng)來進(jìn)行。
例子
考慮這個(gè)依賴圖:
+-- blerg@1.2.5
+-- bar@1.2.3
| +-- blerg@1.x (latest=1.3.7)
| +-- baz@2.x
| | `-- quux@3.x
| | `-- bar@1.2.3 (cycle)
| `-- asdf@*
`-- baz@1.2.3
`-- quux@3.x
`-- bar
在這種情況下,我們可能會(huì)期望這樣的文件夾結(jié)構(gòu):
foo
+-- node_modules
+-- blerg ( 1.2.5 ) < --- [ A ]
+-- bar ( 1.2.3 ) < --- [ B ]
| ` -- node_modules
| +-- baz ( 2.0.2 ) < --- [ C ]
| | ` -- node_modules
| | ` -- quux ( 3.2.0 )
| ` -- asdf ( 2.3.4 )
` -- baz ( 1.2.3 ) < --- [ D ]
` -- node_modules
`--quux ( 3.2.0 ) < --- [ E ]
由于 foo 直接依賴于bar@1.2.3
and?baz@1.2.3
,所以它們安裝在 foo 的node_modules
文件夾中。
盡管 bleger 的最新副本是 1.3.7,但 foo 對(duì)版本 1.2.5 有特定的依賴性。因此,它安裝在[A] 處。由于 blerg 的父安裝滿足 bar 對(duì) 的依賴blerg@1.x
,因此它不會(huì)在[B]下安裝另一個(gè)副本。
Bar?[B]還依賴于 baz 和 asdf,因此它們安裝在 bar 的node_modules
文件夾中。因?yàn)樗蕾囉?code>baz@2.x,它不能重復(fù)使用baz@1.2.3
父node_modules
文件夾中安裝的[D]?,而必須安裝自己的副本[C]?。
在 bar 下方,baz -> quux -> bar
依賴項(xiàng)創(chuàng)建了一個(gè)循環(huán)。但是,因?yàn)?bar 已經(jīng)在 quux 的祖先[B] 中,所以它不會(huì)將 bar 的另一個(gè)副本解壓縮到該文件夾??中。
在foo -> baz
?[D]下方,quux 的[E]文件夾樹是空的,因?yàn)樗鼘?duì) bar 的依賴由安裝在[B]的父文件夾副本滿足。
有關(guān)安裝位置的圖形細(xì)分,請(qǐng)使用npm ls
.
出版
發(fā)布后,npm 將在node_modules
文件夾中查找。如果bundledDependencies
數(shù)組中沒有任何項(xiàng)目,則它們將不會(huì)包含在包 tarball 中。
這允許包維護(hù)者在本地安裝他們的所有依賴項(xiàng)(和開發(fā)依賴項(xiàng)),但只重新發(fā)布那些在其他地方找不到的項(xiàng)目。有關(guān)package.json
更多信息,請(qǐng)參閱。foo
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: