使用 pnpm 配置 Node-Modules 选项
·阅读时长 2 分钟
创建 node_modules 目录有很多方法。你的目标应该是创建最严格的目录,但如果无法做到,也可以选择创建松散的 node_modules 目录。
默认设置
默认情况下,pnpm v5 将创建一个半严格的 node_modules 目录。半严格意味着你的应用程序只能引用在 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*
即插即用。最严格的配置
pnpm 从 v5.9 版本开始支持 Yarn 的即插即用。使用 PnP,你的应用程序和应用程序依赖项都只能访问其声明的依赖项。这甚至比设置 hoist=false
更严格,因为在单仓库中,你的应用程序甚至无法访问根项目的依赖项。
要使用即插即用,请设置以下设置
node-linker=pnp
symlink=false
严格的传统模块目录
如果你还没有准备好使用 PnP,你仍然可以通过将 hoist 配置设置为 false 来保持严格,并且只允许包访问其自己的依赖项
hoist=false
但是,如果你的某些依赖项试图访问它们在依赖项中没有的包,你有两种选择
-
创建一个
pnpmfile.js
文件,并使用 钩子 将缺失的依赖项添加到包的清单中。 -
在
hoist-pattern
设置中添加一个模式。例如,如果未找到的模块是babel-core
,请将以下设置添加到.npmrc
文件中hoist-pattern[]=babel-core
最坏的情况 - 提升到根目录
某些工具即使使用 pnpm 的默认配置(将所有内容提升到虚拟存储的根目录,并将某些包提升到根目录)也可能无法正常工作。在这种情况下,你可以将所有内容或一部分依赖项提升到模块目录的根目录。
将所有内容提升到 node_modules 目录的根目录
shamefully-hoist=true
仅提升与模式匹配的包
public-hoist-pattern[]=babel-*