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.