PNPM - запуск нового проекта не работает должным образом
Я пытаюсь использовать централизованный менеджер пакетов (pnpm
) вместо ванили npm
, потому что мне нравится иметь место на моем жестком диске. Я просто пытаюсь запустить проект и столкнуться с трудностями, и в Интернете очень мало того, что могло бы помочь мне начать проект с этим менеджером пакетов. У кого-нибудь есть опыт заставить это работать на React/React Native?
Любые идеи будут очень приветствоваться.
Я пробовал два разных способа настройки:
Создан новый проект с
pnpx create-react-app my-app
, Это просто сделал именно то, чтоnpx create-react-app
будет делать, что включает в себя установку более 200 МБ модулей, которые я уже имел в моей системе миллион раз. Я проверилnode_modules
папка и ни один из файлов не являются жесткими ссылками, это сами модули.Создайте новый проект без вспомогательных команд (т. Е. Коснитесь 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), в моей системе все еще есть дубликаты пакетов. Кто-нибудь может подтвердить, так ли это?
0 ответов
Теперь я понимаю, что это старый вопрос... но он все еще не решен должным образом (в идеале приложение create-response-app должно иметь переключатель, который позволяет ему использовать pnpm изначально... но это на другой день).
Мое решение немного утомительно, но работает. Сначала создайте свое приложение для реагирования как обычно:
pnpx create-react-app my-app --template typescript
Подождите необходимое время, пока npm загрузит ~350 МБ материала, который у вас уже есть. Затем запустите следующее (при условии, что Linux):
cd my-app
rm -rf node_modules/
pnpm i
В зависимости от того, сколько модулей было повторно использовано, вы сэкономите до 350 МБ дискового пространства.
По поводу использования дискового пространства. Пакеты внутри node_modules - это жесткие ссылки. У pnpm есть раздел об этом в FAQ:
pnpm создает жесткие ссылки из глобального хранилища на папки проекта node_modules. Жесткие ссылки указывают на то же место на диске, где находятся исходные файлы. Так, например, если у вас есть foo в вашем проекте в качестве зависимости и он занимает 1 МБ пространства, то это будет выглядеть так, как будто он занимает 1 МБ пространства в папке node_modules проекта и такое же количество места в глобальном хранилище. Однако этот 1 МБ - это одно и то же пространство на диске, адресованное из двух разных мест. Таким образом, всего foo занимает 1 МБ, а не 2 МБ.
Для получения дополнительной информации по этой теме:
Что касается скрытой папки внутри node_modules, вы можете прочитать в этой статье: Flat node_modules - не единственный способ.
У pnpm раньше были проблемы с React Native. pnpm много использует символические ссылки, а React Native не любит символические ссылки.
PS, если вы не получите помощи по SO, вы всегда можете написать в наш чат Gitter