Как я могу правильно настроить 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, чтобы пост не был огромным:

  1. /package.json
  2. /tsconfig.json
  3. /client/package.json
  4. /client/tsconfig.json
  5. /global/package.json
  6. /global/tsconfig.json
  7. /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)?

Если я могу предоставить более конкретную информацию или лучше отформатировать этот вопрос, пожалуйста, также прокомментируйте это.

Спасибо!

0 ответов

Другие вопросы по тегам