npm 文件夾

2021-10-29 10:52 更新

npm 使用的文件夾結構

描述

npm 將各種東西放在你的計算機上。這就是它的工作。

這份文件會告訴你它放在什么地方.

tl;dr

  • 安裝(默認):將東西放入./node_modules當前包根目錄。
  • 安裝(帶-g):將東西放在 /usr/local 或安裝節(jié)點的任何地方。
  • 您要使用它,請在本地安裝require()它。
  • 要在命令行上運行它,請全局安裝它。
  • 兩者都需要,則在兩個地方都安裝它,或者使用npm link. 前綴配置 的prefix配置默認為在安裝節(jié)點的位置。在大多數系統上,這是/usr/local.?在 Windows 上,它是%AppData%\npm.?在 Unix 系統上,它是一個級別,因為節(jié)點通常安裝在?{prefix}/bin/node而不是{prefix}/node.exe.

global標志設置,NPM安裝的東西到這個前綴。如果未設置,則使用當前包的根目錄,如果不在包中,則使用當前工作目錄。

節(jié)點模塊 包被丟棄到node_modules文件夾下prefix。在本地安裝時,這意味著您可以?require("packagename")加載其主模塊,也?require("packagename/lib/path/to/sub/module")可以加載其他模塊。

Unix 系統上的全局安裝轉到{prefix}/lib/node_modules.?Windows 上的全局安裝轉到{prefix}/node_modules(即,沒有?lib文件夾。)

作用域包的安裝方式相同,不同之處在于它們被組合在相關node_modules文件夾的子文件夾中,該文件夾的名稱由 @ 符號組成,例如npm install @myorg/package將包放在{prefix}/node_modules/@myorg/package.?有關scope更多詳細信息,請參閱?。

如果你想要require()一個包,然后在本地安裝它。

可執(zhí)行文件 在全局模式下,可執(zhí)行文件{prefix}/bin在 Unix上鏈接到,或{prefix}在 Windows 上直接鏈接到。確保路徑在您的終端PATH環(huán)境中以運行它們。

在本地模式下,可執(zhí)行文件被鏈接,?./node_modules/.bin以便它們可用于通過 npm 運行的腳本。(例如,當您運行時,測試運行器將位于路徑中npm test。)

手冊頁 在全局模式下,手冊頁鏈接到{prefix}/share/man.

在本地模式下,不安裝手冊頁。

手冊頁未安裝在 Windows 系統上。

緩存 見npm cache。緩存文件存儲在~/.npmPosix 或?%AppData%/npm-cacheWindows 上。

這是由cache配置參數控制的。

臨時文件 臨時文件默認存儲在tmp配置指定的文件夾中?,默認為 TMPDIR、TMP 或 TEMP 環(huán)境變量,或者/tmp在 Unix 和c:\windows\tempWindows 上。

每次運行程序時,都會在此根目錄下為臨時文件指定一個唯一文件夾,并在成功退出后刪除。

更多信息 在本地安裝時,npm 首先嘗試尋找合適的?prefix文件夾。這樣npm install foo@1.2.3即使您碰巧cd進入了其他文件夾,它也會安裝到您的軟件包的合理根目錄中。

從 $PWD 開始,npm 將沿著文件夾樹檢查包含package.json文件或node_modules?文件夾的文件夾。如果找到這樣的東西,那么為了運行 npm 命令,它被視為有效的“當前目錄”。(此行為的靈感來自并類似于在工作目錄中運行 git 命令時 git 的 .git-folder 查找邏輯。)

如果未找到包根目錄,則使用當前文件夾。

當你運行時npm install foo@1.2.3,包被加載到緩存中,然后解壓到./node_modules/foo.?然后,任何 foo 的依賴項都類似地解壓到?./node_modules/foo/node_modules/....

任何 bin 文件都被符號鏈接到./node_modules/.bin/,以便在必要時可以通過 npm 腳本找到它們。

全球安裝 如果global配置設置為 true,則 npm 將“全局”安裝軟件包。

對于全局安裝,軟件包的安裝方式大致相同,但使用上述文件夾。

循環(huán)、沖突和文件夾簡約

循環(huán)使用節(jié)點的模塊系統的屬性處理,它會在目錄中查找node_modules文件夾。因此,在每個階段,如果一個包已經安裝在祖先node_modules?文件夾中,那么它不會安裝在當前位置。

考慮上面的情況,其中foo -> bar -> baz。想象一下,除此之外,如果 baz 依賴于 bar,那么您將擁有:?foo -> bar -> baz -> bar -> baz ....?但是,由于文件夾結構是:foo/node_modules/bar/node_modules/baz,因此無需將 bar 的另一個副本放入.../baz/node_modules,因為當它調用 require("bar") 時,它將獲得安裝在?foo/node_modules/bar.

僅當在多個嵌套node_modules文件夾中安裝完全相同的版本時才使用此快捷方式。a/node_modules/b/node_modules/a如果兩個“a”包是不同的版本,仍然有可能。但是,如果不多次重復完全相同的包,將始終防止無限倒退。

另一種優(yōu)化可以通過在本地化的“目標”文件夾下的最高級別安裝依賴項來進行。

例子

考慮這個依賴圖:

+-- 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

在這種情況下,我們可能會期望這樣的文件夾結構:

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.3and?baz@1.2.3,所以它們安裝在 foo 的node_modules文件夾中。

盡管 bleger 的最新副本是 1.3.7,但 foo 對版本 1.2.5 有特定的依賴性。因此,它安裝在[A] 處。由于 blerg 的父安裝滿足 bar 對 的依賴blerg@1.x,因此它不會在[B]下安裝另一個副本。

Bar?[B]還依賴于 baz 和 asdf,因此它們安裝在 bar 的node_modules文件夾中。因為它依賴于baz@2.x,它不能重復使用baz@1.2.3node_modules文件夾中安裝的[D]?,而必須安裝自己的副本[C]?。

在 bar 下方,baz -> quux -> bar依賴項創(chuàng)建了一個循環(huán)。但是,因為 bar 已經在 quux 的祖先[B] 中,所以它不會將 bar 的另一個副本解壓縮到該文件夾??中。 在foo -> baz?[D]下方,quux 的[E]文件夾樹是空的,因為它對 bar 的依賴由安裝在[B]的父文件夾副本滿足。

有關安裝位置的圖形細分,請使用npm ls.

出版 發(fā)布后,npm 將在node_modules文件夾中查找。如果bundledDependencies數組中沒有任何項目,則它們將不會包含在包 tarball 中。

這允許包維護者在本地安裝他們的所有依賴項(和開發(fā)依賴項),但只重新發(fā)布那些在其他地方找不到的項目。有關package.json更多信息,請參閱。foo

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號