Statligt ägt energibolag · Digital försäljning · Solution Designer & Senior Developer
Enterprise CMS-migrering: EPiServer 11 → Optimizely CMS 12
Ledde migreringen av en omfattande CMS-plattform som är navet för bolagets digitala försäljning: kundportalen MyPages, flödet för kontraktssignering och de publika webbsidorna. Plattformen flyttades från EPiServer CMS 11 på .NET Framework till Optimizely CMS 12 på .NET 8, vilket gav en modern, molnanpassad arkitektur som är enkel att förvalta. Migreringen skedde stegvis med parallelldrift, så att slutanvändarna aldrig påverkades under övergången.
Nyckelbeslut
- Feature Folder Structure — Koden organiserades utifrån affärsdomän (MyPages, ContractSigning, OpenPages) i stället för efter tekniskt lager. Varje mapp är helt fristående och innehåller sina egna controllers, vyer, modeller och block.
- Stegvis migrering, prioriterad efter risk — CMS 11 var i drift under hela processen. Open Pages migrerades först (lägst affärsrisk), därefter Contract Signing och sist MyPages. En domän i taget – aldrig allt på en gång.
- Content Delivery API + Content Graph — Ersatte gammal, manuell egenskapshämtning (property traversal) med Optimizelys GraphQL-baserade innehållshämtning. Resultatet blev frikopplad innehållsleverans, effektivare siduppbyggnad och inga N+1-anrop.
- Visual Builder för ett självständigt marknadsteam — Marknadsteamet kunde nu bygga och ändra sidlayouter på egen hand, utan att blanda in utvecklare. Det minskade kraftigt antalet ändringsärenden som tidigare hamnade hos utvecklingsteamet.
- .NET Framework → .NET 6 — StructureMap byttes ut mot .NET:s inbyggda beroendeinjektion. En renare konfiguration utan tredjepartsberoende, samordnad med själva CMS-uppgraderingen.
- AngularJS → Angular Elements — MyPages interaktiva widgetar migrerades från AngularJS till Angular Elements (webbkomponenter). Varje element bootstrappas oberoende, laddas vid behov och är helt fristående, vilket gör att Angular och den omgivande webbsidan är fullständigt frikopplade.
ArkitekturbeslutMindreLäs mer
Varför Feature Folder Structure?
Den befintliga kodbasen var organiserad efter tekniskt lager — alla kontroller i en katalog, alla modeller i en annan. Att förstå en enda funktion krävde navigering i flera kataloger och att hålla ihop sambanden i minnet. Ägandeskapet var oklart. Omorganisering efter affärsfunktion (MyPages, ContractSigning, OpenPages) gjorde varje område självständigt: en utvecklare kunde förstå MyPages genom att läsa en mapp. Det tydliggjorde också teamägarskapet — varje produktområde fick ett otvetydigt hem. Onboardningstiden för nya utvecklare minskade påtagligt.
Fasad migrering, inte big bang
En helhetsövergång av plattformen hade krävt månader av parallellt arbete utan något användarvärde, och hög samordningsrisk vid övergången. Den fasade metoden levererade fungerande mjukvara i varje steg. Open Pages gick först — tillståndslöst, publikt och med lägst affärsrisk. Contract Signing följde; dess väldefinierade in/ut-gräns gjorde det till en ren extraktion. MyPages, med den mest komplexa autentiserade tillståndshanteringen, kom sist. Anpassade migreringsscript hanterade innehållstypmappningen mellan CMS 11:s propertymodell och CMS 12:s innehållsmodell.
CMS 12-funktioner som kraftmultiplikatorer
Content Graph (GraphQL) ersatte långsam property traversal på innehållstunga sidor. Visitor Groups och Personalization möjliggjorde kontextanpassat innehåll för autentiserade MyPages-användare utan skräddarsydd routingkod. Optimizely Forms återskapade kundvända formulär med validering och backendintegration, och ersatte handrullad kod. Schemalagda jobb automatiserade innehållssynkronisering. Dessa funktioner ersatte skräddarsydd kod som teamet hade underhållit — varje funktion minskade underhållsytan.
CI/CD-pipeline som leveransförutsättning
Den befintliga driftsättningsprocessen var manuell och felbenägen. En fasad migrering över flera månader kräver tillförlitliga, repeterbara releaser — manuell driftsättning var inte förenligt med det tempot. En Azure DevOps-pipeline med automatiserad staging-befordran och bevakat produktionssläpp byggdes tidigt i projektet. Det blev grunden som gjorde inkrementell migrering hållbar.
AngularJS → Angular Elements: migrering med best practices
MyPages hade interaktiva widgets (kontraktsstatus, kontouppgifter, förbrukningsgrafer) byggda i AngularJS. Istället för en fullständig omskrivning eller en utdragen hybridperiod valdes Angular Elements (webbkomponenter via @angular/elements): varje widget kompileras till ett självständigt custom element, bootstrappas oberoende och bäddas in i Razor-vyer med en enda HTML-tagg. Best practices tillämpades: OnPush change detection för att undvika onödiga renderingscykler; explicita @Input- och EventEmitter-kontrakt så att värdsidan saknar Angular-beroende; lazy loading per element så att bara widgets som finns på en given sida laddas ned. AngularJS togs bort helt från MyPages i samma release — ingen dubbelframework-överlappning kvar i kodbasen.