Kamil Owczarek
Opublikowano

Konfiguracja środowiska Turborepo + Prisma + Nuxt bez problemów z importami na Vercelu

Autorzy

Konfiguracja środowiska Turborepo + Prisma + Nuxt pod moje projekty wyglądała na zadanie, które powinno być proste, ale po drodze trafiłem na kilka problemów — zwłaszcza przy próbie deployu na Vercelu. Oto co próbowałem, co poszło nie tak i jakie rozwiązanie w końcu zadziałało.

Wyzwanie: współdzielony Prisma Client

Zacząłem od szukania sposobu na skonfigurowanie współdzielonego Prisma Clienta w wielu aplikacjach wewnątrz Turborepo. Nie chciałem powielać tej samej konfiguracji Prismy w każdej aplikacji, więc szukałem rozwiązania, w którym mógłbym wyeksportować Prisma Clienta ze wspólnego pakietu i uniknąć duplikacji.

Znalazłem pomocny przykład na GitHubie, który sugerował eksportowanie client/index.js i client/index.d.ts oraz zadbanie o to, żeby zarówno prisma, jak i @prisma/client były zainstalowane w aplikacji, w której współdzielony klient miał być używany. Takie podejście dawało dostęp do PrismaClienta bez problemów z importami, przy zachowaniu poprawnych typów.

Co poszło nie tak

I tu zaczęły się schody:

  1. Powielanie ustawień Prisma Clienta: największym problemem okazało się to, że i tak musiałem powielać te same ustawienia Prisma Clienta w każdym projekcie. Każda aplikacja musiała konfigurować swojego PrismaClienta osobno, mimo że celem była centralizacja klienta. Wydawało się to zbędne i prowadziło do powtarzalnej konfiguracji rozsianej po aplikacjach.

  2. Problemy z deployem na Vercelu: nawet gdy wszystko działało lokalnie, deploy na Vercelu ciągle się wywalał. Szybko zorientowałem się, że Vercel nie obsługuje współdzielonego Prisma Clienta tak, jak się tego spodziewałem. Nawet po zastosowaniu instrukcji i ustawieniu komend builda Vercel nie potrafił poprawnie wygenerować Prisma Clienta po stronie serwera, co kończyło się nieudanym deployem.

Ostateczne rozwiązanie: centralizacja schematu Prismy

Po przetestowaniu różnych podejść znalazłem rozwiązanie, które działa, choć nie jest idealne. Zamiast współdzielonego Prisma Clienta zdecydowałem się scentralizować schemat Prismy w jednej aplikacji. Oznacza to trzymanie schematu Prismy w jednym miejscu i uruchamianie stamtąd komendy generującej Prisma Clienta.

Rozwiązanie sprowadza się do:

  1. Trzymania schematu Prismy w jednej aplikacji.
  2. Generowania Prisma Clienta z centralnej aplikacji przy użyciu poniższej komendy w pozostałych aplikacjach:
prisma generate --schema=../app1/prisma/schema.prisma

To podejście rozwiązało problem bez konieczności duplikowania konfiguracji Prismy we wszystkich projektach i pozbyło się kłopotów z tym, że Vercel nie generował klienta poprawnie. Deploye na Vercelu zaczęły działać bez zarzutu i przestałem się przejmować problemami z importem Prisma Clienta.

Dodatkowo mogłem ponownie wykorzystać klienta Prismy wyeksportowanego z app1, gdzie ustawienia były już zadeklarowane, dzięki czemu cała konfiguracja została w jednym miejscu.

Podsumowanie

Choć nie było to najczystsze rozwiązanie, centralizacja schematu Prismy i generowanie klienta z jednej aplikacji pozwoliły mi w końcu uniknąć problemów z importami i rozwiązać kłopoty z deployem na Vercelu — a w międzyczasie czekamy, aż Prisma naprawi to u siebie, miejmy nadzieję, że w nadchodzącej wersji V7.

Jeśli pracujesz z Turborepo + Prisma + Nuxt i deployujesz na Vercelu, a mierzysz się z problemami przy imporcie Prisma Clienta albo z powielaniem konfiguracji w wielu projektach, polecam scentralizować schemat Prismy i generować klienta z jednej aplikacji. To podejście nie jest doskonałe, ale u mnie zadziałało i może oszczędzić ci sporo czasu i nerwów.

Mam nadzieję, że komuś jeszcze oszczędzi to kilku straconych wieczorów.