跳至主要內容

使用 pnpm 的 Node-Modules 組態選項

· 閱讀時間 2 分鐘

建立 node_modules 目錄的方法有很多。你的目標應該是建立最嚴格的目錄,但如果做不到,也有方法可以建立鬆散的 node_modules。

預設設定

預設情況下,pnpm v5 會建立一個半嚴格的 node_modules。半嚴格表示你的應用程式只能 require 新增至 package.json 的套件(有少數例外)。但是,你的相依套件將可以存取任何套件。

預設組態如下所示

; All packages are hoisted to node_modules/.pnpm/node_modules
hoist-pattern[]=*

; All types are hoisted to the root in order to make TypeScript happy
public-hoist-pattern[]=*types*

; All ESLint-related packages are hoisted to the root as well
public-hoist-pattern[]=*eslint*

Plug'n'Play。最嚴格的組態

pnpm 自 v5.9 起支援 Yarn 的 Plug'n'Play。透過 PnP,你的應用程式和應用程式的相依套件都只能存取它們宣告的相依套件。這比設定 hoist=false 還要嚴格,因為在 monorepo 內,你的應用程式甚至無法存取根專案的相依套件。

若要使用 Plug'n'Play,請設定下列設定

node-linker=pnp
symlink=false

嚴格的傳統模組目錄

如果您尚未準備好使用 PnP,您仍可嚴格執行,並僅允許套件存取其自己的相依性,方法是將 hoist 組態設定為 false

hoist=false

不過,如果您的某些相依性嘗試存取相依性中沒有的套件,您有兩個選項

  1. 建立一個 pnpmfile.js 並使用 hook 將遺失的相依性新增至套件的清單。

  2. 將模式新增至 hoist-pattern 設定。例如,如果找不到的模組是 babel-core,請將下列設定新增至 .npmrc

    hoist-pattern[]=babel-core

最糟的情況 - hoisting 至根目錄

有些工具可能無法使用 pnpm 的預設組態,而 pnpm 會將所有內容 hoist 至虛擬儲存體的根目錄,並將某些套件 hoist 至根目錄。在此情況下,您可以將所有內容或相依性的子集 hoist 至模組目錄的根目錄。

將所有內容 hoist 至 node_modules 的根目錄

shamefully-hoist=true

僅 hoist 與模式相符的套件

public-hoist-pattern[]=babel-*