Как я могу правильно настроить Yarn 2 PnP на монорепозитории с настроенными ссылками на TS?
Вкратце: для проекта, описанного ниже, как мне лучше всего настроить так, чтобы два приложения (клиент + сервер) работали?
Я работаю над более продолжительным проектом, который со временем превратился в монорепозиторий. Я не могу поделиться полным кодом, поскольку проект является частным, но проект имеет примерно следующую структуру, помеченную числами, чтобы я мог легко ссылаться на определенные файлы в этом примере:
<repo-root> / 1 package.json 2 tsconfig.json клиент / 3 package.json 4 tsconfig.json страницы / index.tsx Глобальный/ 5 package.json 6 tsconfig.json src / 9 index.ts строить/ index.js index.d.ts сервер / 7 package.json 8 tsconfig.json src / index.ts bin / index.js
В частности, клиент содержит проект NextJS , сервер содержит сервер NodeJS Express , а глобальный каталог содержит некоторые общие функции и интерфейсы, которые используют как клиент, так и сервер.
Клиент и сервер могут получить доступ к глобальным через ссылки на проекты машинописного текста, а также использовать псевдоним машинописного текста для отображения
@global/
в глобальный каталог / src на клиенте и в глобальный каталог / build на сервере, как показано в файлах tsconfig ниже. Причина того, что каталог сборки вообще является глобальным, заключается в том, что у нас есть скомпилированная среда на сервере; серверное приложение строится с
tsc
и работает с
node server.js
(грубо). Вот пронумерованные файлы, помещенные в pastebin, чтобы пост не был огромным:
- /package.json
- /tsconfig.json
- /client/package.json
- /client/tsconfig.json
- /global/package.json
- /global/tsconfig.json
- /server/package.json
8 - это фрагмент кода, потому что у меня закончились гостевые пасты на день:
{
"compilerOptions": {
"module": "commonjs",
"removeComments": true,
"lib": ["es2015", "dom"],
"sourceMap": true,
"esModuleInterop": true,
"target": "es5",
"declaration": false,
"forceConsistentCasingInFileNames": true,
"isolatedModules": false,
"strict": false,
"noImplicitAny": false,
"noImplicitThis": false,
"baseUrl": "./src",
"rootDir": "./src",
"types": ["node", "jest"],
"paths": {
"global/*": ["../../global/build/*"]
},
"outDir": "bin",
"plugins": [
{ "transform": "typescript-transform-paths" },
{ "transform": "typescript-transform-paths", "afterDeclarations": true }
]
},
"include": ["./src/**/*.ts"],
"exclude": ["*.d.ts", "**/*.spec.ts", "../global/**/*.ts"],
"references": [{ "path": "../global" }]
}
Это лучшее, что мы могли сделать для настройки. Однако до того, как наш код снова заработает, остается несколько проблем.
Мы решили перенести наше моно-репо на yarn pnp, потому что мы столкнулись с этой проблемой во время выполнения, после того как я включил общую зависимость между клиентом и глобальным (
draft-js
). В связанной статье о носителе в этом комментарии на github было указано несколько возможных решений, но мы не использовали lerna, и все наше приложение не использовало веб-пакет (только клиент, поскольку NextJS использует его внутри). Итак, наше решение, похоже, было в сноске, пряжа pnp.
Однако я не смог найти никакой документации о том, как правильно преобразовать ссылки на проекты из ts в зависимости yarn PnP или, по крайней мере, как заставить все снова работать в среде yarn pnp.
При такой настройке мы впервые столкнулись с проблемой, которую не создает global. Он выводит ошибку: «Не удается найти модуль firebase или соответствующие объявления типа», хотя firebase явно указана как зависимость в файле 5, и я вижу zip-файл в каталоге .yarn / cache для нужной версии. базы огня. Я также подтвердил, что он использует файл .pnp.cjs, и я запускаю
yarn build
там (
yarn tsc --build
), а также
yarn -v
печатает, что я использую канареечную версию v3, как и ожидалось; Я не могу понять, почему он все еще не может найти модуль firebase.
Однако после этой проблемы другая проблема заключается в том, что псевдонимы машинописного текста, кажется, теперь должны быть заменены на
portal:
или
link:
зависимости, как описано в их документации здесь . У нас это не сработало, это не могло разрешить зависимости при попытке создать сервер специально. Затем мы попытались использовать вместо этого рабочие области, поскольку это также обещало предоставить клиенту и серверу доступ друг к другу. Это конфигурация, которую вы сейчас видите в пастах. Однако теперь при попытке скомпилировать global с этой конфигурацией рабочего пространства я получаю сообщение об ошибке, аналогичное второму фрагменту здесь , о «Невозможно найти pnpapi», в котором говорится, что глобальный / .pnp.cjs контролируется корневым .pnp.cjs
Кто-нибудь может посоветовать, как мне лучше всего организовать такой проект? Какой вид рефакторинга требуется, чтобы у меня был один репозиторий, содержащий клиент NextJS TS, сервер NodeJS и общий глобальный каталог для общих интерфейсов TS и некоторых функций (таким образом, также некоторые общие зависимости для получения типов / функций, например как draft-js и firebase)?
Если я могу предоставить более конкретную информацию или лучше отформатировать этот вопрос, пожалуйста, также прокомментируйте это.
Спасибо!