npm из портативного Node падает с MODULE_NOT_FOUND
npm -v → Error: Cannot find module '...\node_modules\npm\bin\npm-cli.js'
node 22windows
Ставил Astro 7 на портативный Node 22. node -v отвечает бодро, npm -v — падает:
Error: Cannot find module 'D:\...\node-v22.13.0-win-x64\node_modules\npm\bin\npm-cli.js'
at Function._resolveFilename (node:internal/modules/cjs/loader:1244:15)
Причина
В папке с Node лежат npm.cmd, npx.cmd, corepack.cmd — и нет node_modules/.
Это не «npm сломался». Обёртки .cmd — тонкие батники на три строки, вся логика
лежит в node_modules/npm/. Если архив распаковали частично или выборочно, обёртки
остаются (они в корне), а код исчезает. Симптом выглядит как поломка npm,
хотя npm там просто никогда не было.
Тот же механизм убивает npx и corepack — они устроены одинаково.
Решение
Проверить, что пропало именно тело:
ls "$NODE_DIR/node_modules/npm/bin/npm-cli.js"
Если файла нет — взять node_modules из любой рабочей установки Node. npm — обычный
JavaScript, он не привязан к мажору движка: npm 10.8.2 от Node 20 нормально работает
под Node 22.
robocopy "<рабочий-node>/node_modules" "<битый-node>/node_modules" /E
Проверка:
export PATH="/d/путь/node-v22.13.0-win-x64:$PATH"
node -v # v22.13.0
npm -v # 10.8.2
Правильнее, конечно, перекачать дистрибутив целиком. Но если интернет медленный, а собрать нужно сейчас — копирование чинит за секунды.
Как не наступить снова
Портативный Node после распаковки проверяется одной командой — npm -v. Если она
молчит про версию, дистрибутив битый, и лучше узнать об этом до того, как начнёшь
ставить зависимости проекта.