Могу ли я использовать пользовательский путь node_modules с create-react-app

#node.js #create-react-app #yarnpkg

#node.js #create-react-app #yarnpkg

Вопрос:

Я работаю над проектом внутри виртуальной машины (на самом деле docker в Windows через vscode remote-containers). Я бы хотел избежать создания своего приложения react at $(pwd)/node_modules , потому что все, что находится под $(pwd) , синхронизируется с моей файловой системой Windows, что вызывает серьезные проблемы с производительностью.

Я довольно новичок в nodejs в целом, но я удивлен, насколько сложно это понять.

Я успешно начал с этого:

  • yarn --modules-folder /tmp/vendor

Это дало мне /tmp/vendor папку с перечисленными ожидаемыми зависимостями.

Для следующего шага я хочу запустить сервер разработки, поэтому я запускаю это:

  • yarn --modules-folder /tmp/vendor start

Я получаю /bin/sh: react-scripts: command not found . Я полагаю yarn , что s --modules-folder не перенастраивает информацию о ПУТИ при выполнении команд ( yarn start вызовов react-scripts start ). Поэтому я просто добавил свой собственный ПУТЬ в качестве обходного пути:

  • PATH=$PATH:/tmp/vendor/.bin/ yarn --modules-folder /tmp/vendor start

Но теперь я понимаю это:

 [root@352b76226b83 owio]# PATH=$PATH:/tmp/vendor/.bin/ yarn --modules-folder /tmp/vendor start
yarn run v1.22.5
$ react-scripts start
internal/modules/cjs/loader.js:965
  throw err;
  ^

Error: Cannot find module 'react-dev-utils/crossSpawn'
Require stack:
- /tmp/vendor/react-scripts/bin/react-scripts.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:962:15)
    at Function.Module._load (internal/modules/cjs/loader.js:838:27)
    at Module.require (internal/modules/cjs/loader.js:1022:19)
    at require (internal/modules/cjs/helpers.js:72:18)
    at Object.<anonymous> (/tmp/vendor/react-scripts/bin/react-scripts.js:18:15)
    at Module._compile (internal/modules/cjs/loader.js:1118:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1138:10)
    at Module.load (internal/modules/cjs/loader.js:982:32)
    at Function.Module._load (internal/modules/cjs/loader.js:875:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ '/tmp/vendor/react-scripts/bin/react-scripts.js' ]
}
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command
  

Поскольку он жалуется на отсутствующие модули, я также установил NODE_PATH (я думаю, yarn также не пересылает эту переменную):

  • NODE_PATH=/tmp/vendor PATH=$PATH:/tmp/vendor/.bin/ yarn --modules-folder /tmp/vendor start

При этом я получаю:

 ./src/index.jsx
Line 0:  Parsing error: Cannot find module 'eslint-scope' from '/tmp/vendor/eslint/lib/api.js'
  

Я застрял здесь, потому eslint-scope что он существует, и я уже сделал все возможное, чтобы обойти проблемы с путями.

Я испытываю желание попробовать другие инструменты за пределами CRA и yarn, но я еще недостаточно хорошо знаю экосистему, чтобы понять, как перенести мое приложение. Любые советы будут с благодарностью.

Редактировать:

Я стал ближе, изменив vendor на node_modules . Я думаю, это соглашение каким-то образом необходимо. Я также добавил NODE_PATH=/tmp/node_modules в .env файл и --modules-folder /tmp/node_modules в .yarnrc файл.

РЕДАКТИРОВАТЬ 2:

Я сделал символическую ссылку для $(pwd)/node_modules -> /tmp/node_modules , как было предложено, и, похоже, на этот раз это сработало, учитывая, что я добавил NODE_PATH .env .

Кажется, что все элементы react-script теперь работают, но при компиляции локальных исходных файлов src/components/ я получаю ошибки о том, что модули не разрешаются из /tmp/node_modules них, которые действительно существуют.

Комментарии:

1. Как насчет ссылки на пользовательскую папку? Это тоже вызывает проблемы?

2. Просто добавил EDIT 2 . Я пробовал это раньше, и у меня были проблемы, но на этот раз я вижу новую ошибку с помощью ссылки sym.

3. О, подождите, я сделал неправильную ссылку из моего предыдущего соглашения об именах.

4. Кажется, на этот раз потребовалось время, спасибо. Я думаю, что я пробовал это раньше, не NODE_PATH устанавливая, .env и у него были проблемы. Может быть, я сузю именно то, что мне нужно и не нужно, и опубликую последующий ответ.

Ответ №1:

После некоторой доработки и поддержки со стороны Estus я обнаружил, что для меня работает следующее:

  • .env файл с NODE_PATH=/tmp/node_modules
  • .yarnrc файл с --modules-folder /tmp/node_modules
  • символическая ссылка для $(pwd)/node_modules -> /tmp/node_modules

Я не уверен, зачем нужна символическая ссылка, и хотел бы знать, есть ли у кого-нибудь .env подобное решение. Кажется, мои локальные исходные файлы компилируются в эту папку независимо от того NODE_PATH , установлен ли он.

Другие странности, которые я не понимаю, но, возможно, кто-то будет:

  • Я не мог просто NODE_PATH использовать переменную в своей yarn команде. Кажется, что значение in .env изменило способ компиляции модулей внутри node_modules .

  • Я не мог использовать имя, отличное от node_modules . Понятия не имею, почему.

В качестве отступа:

Для тех, кто попадает сюда с той же проблемой (низкая производительность docker на Windows или Mac), вам может потребоваться убедиться, что ваш редактор не индексирует node_modules. Например, я установил files.watcherExclude в своем .vscode/settings.json , чтобы включить "**/node_modules": true," .