Configurare funcțională pentru monorepo pnpm cu TypeScript, Vite și Rollup


Construiesc un monorepo folosind spațiile de lucru pnpm și am probleme să-l fac să funcționeze. Folosește Typescript, Vite pe front-end-uri și Rollup la microserviciile din backend.

Iată setarea:

package.json                            <== all dependencies reside here
tsconfig.json
pnpm-workspaces.yaml
- commonlib/
  package.json, tsconfig.json, rollup.config.js
  src/
    ...interfaces, types etc---
- serverlib/
  package.json, tsconfig.json, rollup.config.js
  src/
    ...modules for common server/microservice funtionality---
- weblib/
  package.json, tsconfig.json, vite.config.js
  src/
    ...react etc components & functions---
- servers/
    srv-gateway/
      package.json, tsconfig.json, rollup.config.js
      src/
        ...server code...
    ms-xxx/                             <== Multiple REST microservices
      package.json, tsconfig.json, rollup.config.js
      src/
        ...microservice code...
- webapps/
    app/
      package.json, tsconfig.json, vite.config.js
      src/
        ...main application code---
    admin/
      package.json, tsconfig.json, vite.config.js
      src/
        ...application code---
    app-2/                              <== Other webapps / micro frontends
      ...

Cererea mea:

  • Păstrez toate dependențele pachetelor în fișierul package.json de la rădăcină
  • Vreau să accesez modulele mele precum @myapp/commonlib, @myapp/weblib, ...
  • Nu intenționez să public niciunul dintre acestea pe npmjs (nu sunt generice - așa că nu vreau să folosesc semver pentru biblioteci)
  • Vreau cele mai noi versiuni ale dependențelor (le actualizez zilnic). Vreau, de asemenea, mai multe tipuri pentru fiecare, cjs, es, esm etc., aici s-ar putea să fi greșit).

Problema(mele):

  • M-am pierdut în definițiile din package.json, tsconfig.json, rollup.config.json și vite.config.json - a devenit prea complex.
  • Trebuie să compilez/transpilez *lib și să le versionez sau doar să le includ cumva?
  • Include cum? Ca dependențe (@myapp/...)? Folosind „path” și „references” în servere/webapps reale? Dacă da, trebuie să fac vite/rollup la aceste *lib?
  • De exemplu, în weblib, îl compilez excluzând toate pachetele externe (vite.config.ts -> rollupOptions -> external), dar acum nu pot să fac aplicația web să funcționeze (ecran alb).

Întâi aveam un sistem funcțional, unde definisem @myapp/uilib, @myapp/graphlib etc. și foloseam "path" și "references". Dar pe măsură ce au crescut în număr, am vrut să le combin într-o singură bibliotecă. Aici am pierdut firul. Am făcut prea multe modificări pentru a reveni la o stare anterioară din git. Vinovatul este multitudinea de tutoriale contradictorii pe care le-am urmărit și ChatGPT, și desigur în principal eu însumi :/

Se pare că fac totul greșit, acum vreau să învăț modul corect.

Vă mulțumesc anticipat pentru ajutor.

Răspuns #1

După o lungă listă de încercări, lupte și teste de performanță, m-am decis asupra acestor:

  • A avea dependențe la rădăcina unui monorepo este o idee proastă. De fiecare dată când ajungeam la etapa de creare a Docker-ului, trebuia să mut dependențele în pachetele respective. Managerul de pachete (pnpm) le păstrează deja la cel mai înalt nivel și le leagă de la pachetele individuale.
  • Pe măsură ce lucrez cu microservicii, fiecare a devenit mic după refactorizare. Așadar, faza de împachetare a devenit inutilă, iar eu am renunțat la rollup pe partea de server și m-am orientat către esbuild. Acesta oferă pachete ESM (ES2020 deocamdată) frumoase și optimizate și respectă „referințele” din tsconfig.json. (tsup nu - încă, am încercat și l-am eliminat)
  • Ca rezultat al punctului anterior, am mutat fișierele statice în afara generării pachetului (aveam fișiere de date statice/json pe care le serveam cu express-static). Am mutat datele într-o instalare static.mydomain.com, așa că m-am eliberat de procesele lungi de copiere în timpul build-urilor.
  • Păstrez configurațiile vite/rollup pe aplicațiile frontend React pentru moment, funcționează ok - cu excepția problemei cu vite în modul de dezvoltare care pornește foarte lent.
  • În toate bibliotecile comune, frontend și server, am folosit din nou pachete esbuild (doar ES2020).
  • Am mutat, de asemenea, toate frontend-urile și serverele finale în „apps” și am mutat bibliotecile în directoarele „libs”.
  • Am continuat să folosesc structura multi-nivel a fișierului tsconfig.json.

Aceasta a fost o lecție lungă pentru mine în primul meu monorepo. Voi încerca să actualizez această postare cu structura mea.