跳至主要内容

使用 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

但是,如果你的某些依赖项试图访问它们在依赖项中没有的包,你有两种选择

  1. 创建一个 pnpmfile.js 文件,并使用 钩子 将缺失的依赖项添加到包的清单中。

  2. hoist-pattern 设置中添加一个模式。例如,如果未找到的模块是 babel-core,请将以下设置添加到 .npmrc 文件中

    hoist-pattern[]=babel-core

最坏的情况 - 提升到根目录

某些工具即使使用 pnpm 的默认配置(将所有内容提升到虚拟存储的根目录,并将某些包提升到根目录)也可能无法正常工作。在这种情况下,你可以将所有内容或一部分依赖项提升到模块目录的根目录。

将所有内容提升到 node_modules 目录的根目录

shamefully-hoist=true

仅提升与模式匹配的包

public-hoist-pattern[]=babel-*