#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,"
.