Släpp ramverksstriden: Så bygger du en stack som håller ihop
Den osynliga skatten som alla utvecklare betalar
Du känner igen det. Du har valt ditt serverramverk, din ORM, ditt valideringsbibliotek, ditt frontend-ramverk och ditt byggverktyg. Allt ser utmärkt ut på pappret. Sedan börjar du bygga på riktigt och upptäcker att valideringsbiblioteket inte riktigt förstår strukturen din ORM returnerar. Din frontend-ramverks server-side rendering lirar inte med ditt serverramverks mellanprogramvara. Din sessionshantering förutsätter saker som går sönder så fort du försöker deploya till edge.
Varje enskilt verktyg är utmärkt. Fogarna är en mardröm.
Hur vi hamnade här
JavaScript-ekosystemet har alltid värderat komponérbarhet framför sammanhållning. Det är inte fel i sig — UNIX-filosofin har tjänat oss väl i decennier. Problemet är att webbapplikationer inte är rörledningar för isolerade datatransformationer. De är ihoptrasslade nätverk av delade antaganden: request-strukturer, valideringsgränser, autentiseringsflöden, rendering-kontexter, deployment-mål.
När Django dök upp 2005 satsade de på att utvecklare skulle byta lite flexibilitet mot ett sammanhängande system. Du kunde fortfarande nå utanför stacken när du behövde, men inuti den var allt designat för att fungera ihop. Det ägandet betydde färre överraskningar.
PHP-ramverk förstod detta också. Laravel, Symfony, Yii — de gav alla den där känslan av "ett sammanhängande system". Du visste vad som var officiellt territorium och vad som krävde att du vågade dig ut i vildmarken.
Sedan åt JavaScript servern, och vi förlorade mestadels det.
Meta-ramverksfällan
Moderna meta-ramverk förbättrade läget på vissa sätt. Next.js, Nuxt, SvelteKit — de gav dig en sammanhängande stack igen. Men de gjorde det genom att begränsa dina val snarare än att utöka dem.
Det jag menar: Next.js är en utmärkt React-stack. Men om du förälskar dig i Solids prestandaegenskaper eller Sveltes enkelhet byter du inte bara ut vy lagret. Du antar ett annat meta-ramverk med andra konventioner, andra routing-mönster, andra backend-antaganden. Du lär dig om samma problem du redan löst, fast med annan syntax.
Detta skapar en bisarr situation. Frontend-ekosystemet fortsätter att innovera, men att byta mellan tillvägagångssätt kräver nästan att du börjar om. React-utvecklare och Svelte-utvecklare löser samma backend-problem oberoende av varandra, på lite olika sätt, för alltid.
Körtidslotteriet
Och så har vi körtidsfragmenteringen. Node.js, Deno, Bun — det är alla kapabla plattformar, men de flesta ramverk är i praktiken körtidsspecifika. När ett ramverk påstår Deno-stöd betyder det ofta bara "Deno kan köra vår Node-kod." Det är inte samma sak som att ramverket är designat kring Deno:s egna API:er och exekveringsmodell.
Det här spelar större roll än det kanske verkar. Vilken runtime du väljer påverkar prestandaegenskaper, deployment-mål och säkerhetsmodeller. Att låsa in sig i ett ramverk som bara fungerar ordentligt på en runtime begränsar dina alternativ när ekosystemet utvecklas.
Vad vi faktiskt behöver
Här är grejen: webbapplikationer har naturliga lager som inte behöver vara kopplade.
Frontend beskriver browser-UI. Backend hanterar requests, data och applikationslogik. Runtimes är exekveringsmål. Dessa frågeställningar borde kunna variera oberoende av varandra.
Tänk dig att bygga en route med React för att du behöver dess ekosystem av komponenter. En annan route med Svelte för att prestanda är viktigare där. Köra dina Node.js-routes idag, men deploya dina TypeScript-routes till Bun när du behöver hastigheten. Allt i samma applikation, med samma backend-modell, samma validering, samma sessionshantering.
Det är inte magiskt tänkande. Det är att behandla frågeställningar som separata frågeställningar — så har bra mjukvara alltid byggts.
Ramverket borde äga fogarna
Jag argumenterar inte för att ett ramverk ska härska över allt. Jag argumenterar för att ett ramverk bör ta ansvar för att få sina delar att fungera ihop. Du borde fortfarande kunna nå utanför den officiella stacken när du behöver — ingen skeppar perfekta standardvärden för varje användningsfall. Men när du stannar inom ramverket ska fogarna vara ramverkets problem att lösa, inte ditt.
Ett ramverk som får dig att tänka på routing, validering, dataåtkomst och rendering som separata problem du måste limma ihop är inget ramverk. Det är ett förslag.
De bästa ramverken ger dig ägandeskap över din affärslogik samtidigt som de tar ägandeskap över allt annat.
På NameOcean har vi sett hur hosting-komplexitet kan mångfaldigas när din stack är fragmenterad. Att välja ett ramverk som respekterar separation av concerns — som låter dig byta ut delar utan att skriva om allt — gör deployment, skalning och underhåll dramatiskt enklare.
Frågan är inte om du ska använda ett ramverk. Det är om ditt ramverk arbetar för dig eller bara lägger till ytterligare ett lager av beslut du inte behövde göra.
Vad skulle det betyda att bygga din nästa applikation med ett verktyg som äger fogarna? Det är värt att fundera på innan du scaffolder ditt nästa projekt.