1

我正在尝试使用集中式包管理器 ( pnpm) 而不是 vanilla npm,因为我喜欢在硬盘驱动器上留出空间。我只是想让项目启动并遇到困难,并且几乎没有在线指导我通过这个包管理器启动项目。有没有人有经验让它为 React/React Native 工作?

任何想法都会非常受欢迎。

我尝试了两种不同的设置方式:

  • 用 . 创建了一个新项目pnpx create-react-app my-app。这正是我npx create-react-app要做的,其中包括安装超过 200MB 的模块,我已经在我的系统上安装了一百万次。我检查了node_modules文件夹,没有一个文件是硬链接,它们是模块本身。

  • 创建了一个没有辅助命令的新项目(即 touch App.js、index.js、index.html 等)然后pnpm i react...等等。这以某种方式工作,所有节点包都是指向我的全局存储的链接(在 ~/ 中),但是当我尝试pnpm start让我的服务器运行时,我得到了错误:Cannot find module ... /my-project/server.js. 我没有 server.js 文件,但话又说回来,使用常规的 npm 和 npx 命令,我从来不需要一个。

我曾经pnpm i server看看我是否可以让它这样工作。没有什么。我对 React 比较陌生,所以我确信我做了一些荒谬的事情,但是无论我多么初级,我都遵循了官方的说明(https://pnpm.js.org/docs/en/motivation。 html ) 并且他们没有为我工作。

pnpm 调试文件显示以下内容:

{
  "0 debug pnpm:scope": {
    "selected": 1,
    "workspacePrefix": null
  },
  "1 error pnpm": {
    "message": {
      "errno": 1,
      "code": "ELIFECYCLE",
      "pkgid": "my-cv@1.0.0",
      "stage": "start",
      "script": "node server.js",
      "pkgname": "my-cv"
    },
    "err": {
      "name": "Error",
      "message": "my-cv@1.0.0 start: `node server.js`\nExit status 1",
      "code": "ELIFECYCLE",
      "stack": "Error: my-cv@1.0.0 start: `node server.js`\nExit status 1\n    at EventEmitter.<anonymous> (/usr/local/lib/node_modules/pnpm/lib/node_modules/@zkochan/npm-lifecycle/index.js:302:16)\n    at EventEmitter.emit (events.js:200:13)\n    at ChildProcess.<anonymous> (/usr/local/lib/node_modules/pnpm/lib/node_modules/@zkochan/npm-lifecycle/lib/spawn.js:55:14)\n    at ChildProcess.emit (events.js:200:13)\n    at maybeClose (internal/child_process.js:1021:16)\n    at Process.ChildProcess._handle.onexit (internal/child_process.js:283:5)"
    }
  }
}

更新:所以我设法让它工作,我想......我掌握了所有使用的必需包,npx create-react-app并在执行之前将它们放在 package.json 中pnpm i。但是,除了想知道这是否可能不费这么多麻烦之外,查看文件结构,除了我在 node_modules 文件夹中的别名之外,我似乎还有一个隐藏文件夹.registry.npmjs.org。这与我在系统根目录中的那个完全相同,我认为它是中央存储。

TLDR:看起来尽管 pnpm 似乎可以工作(别名是在 node_modules 文件夹中创建的),但我的系统上仍然有重复的包。任何人都可以确认是否是这种情况?

4

2 回答 2

2

我现在意识到这是一个老问题......但它仍然没有得到充分解决(理想情况下,create-react-app 应该有一个允许它在本地使用 pnpm 的开关......但那是另一天)。

我的解决方案有点乏味,但有效。首先,像往常一样创建您的 React 应用程序:

pnpx create-react-app my-app --template typescript

等待 npm 下载您已经拥有的大约 350mb 内容的必要时间。接下来,运行以下命令(假设是 Linux):

cd my-app
rm -rf node_modules/
pnpm i

根据重复使用的模块数量,您将节省多达 350mb 的磁盘空间。

于 2020-09-16T12:15:52.557 回答
1

关于磁盘空间使用情况。node_modules 中的包硬链接。pnpm 在常见问题解答中有一个关于此的部分:

pnpm 创建从全局存储到项目的 node_modules 文件夹的硬链接。硬链接指向磁盘上原始文件所在的相同位置。因此,例如,如果您的项目中有 foo 作为依赖项并且它占用 1MB 的空间,那么它看起来会在项目的 node_modules 文件夹中占用 1MB 的空间,并且在全局存储中占用相同数量的空间。但是,这 1MB 是从两个不同位置寻址的磁盘上的相同空间。所以 foo 总共占用 1MB,而不是 2MB。

有关此主题的更多信息:

关于 node_modules 里面的隐藏文件夹,可以看这篇文章:Flat node_modules is not the only way


pnpm 曾经遇到过 React Native 的问题。pnpm 大量使用符号链接,而 React Native 不喜欢符号链接。

PS 如果你没有得到关于 SO 的帮助,你可以随时发布到我们的Gitter 聊天中

于 2019-09-01T14:27:21.397 回答