Zum Inhalt springen
ausgeliefert

Universität Jena: Migration auf Vue 3

Neun Institutswebsites der Physikalisch-Astronomischen Fakultät von Vue 2 auf Vue 3 migriert und die gemeinsame Komponentenbibliothek wieder zum Standard gemacht.

Neun Institutswebsites liefen auf einer Vue-2-Codebasis kurz vor dem Ende ihres Supports, mit einer gemeinsamen Komponentenbibliothek, die in uneinheitliche, chaotische Nutzung abgedriftet war.

Rolle:
Frontend-Entwickler; Migrationsstrategie, Testing und Einführung der Komponentenbibliothek verantwortet
Stack:
Vue 3 · Vuex · Cypress · Webpack · Axios · SCSS · Tailwind CSS
Zeitraum:
2019–2022
veröffentlicht:
Universität Jena: Architektur und Migrationsweg Eine gemeinsame Komponentenbibliothek versorgt neun Institutswebsites, Multi-Page-Anwendungen mit Vue, gebaut mit Vuex und Webpack, die über Axios die REST-APIs eines Java-Backends aufrufen. Darunter die Migrationsspur: Die Vue-2-Codebasis in Produktion bleibt live, während ein separates Migrations-Repository sie schrittweise und unter Cypress-Tests auf Vue 3 umstellt; das Ergebnis geht erst nach bestandenen Tests in Produktion. Gemeinsame Komponentenbibliothek 9 Institutsseiten (PAF) Multi-Page-Apps mit Vue Vuex · Webpack Axios Java-Backend REST-APIs Migrationsspur Vue 2 in Produktion bleibt live Migrations-Repository schrittweise auf Vue 3 Cypress-Tests Freigabe nach den Tests
Neun Institutswebsites teilen sich eine Vue-Komponentenbibliothek und nutzen die REST-APIs eines Java-Backends. Die Migration auf Vue 3 lief in einem parallelen Repository und ersetzte die Produktion erst nach vollständigen Tests. · seitlich scrollen, um alles zu sehen

Problem und Rahmenbedingungen

Der Webauftritt der Friedrich-Schiller-Universität Jena umfasst mehr als hundert Einrichtungen. Mein Ausschnitt davon war die Physikalisch-Astronomische Fakultät: neun Institutswebsites, vom Astrophysikalischen Institut und der Universitätssternwarte bis zum Otto-Schott-Institut für Materialforschung und dem Fraunhofer-Institut für Angewandte Optik und Feinmechanik (IOF).

Die Websites liefen auf Vue 2, das sich dem Ende seines Supports näherte, und jedes Jahr Wachstum machte die Codebasis schwerer wartbar. Das Framework war nicht das einzige Problem: Es gab zwar eine gemeinsame Komponentenbibliothek, aber sie wurde über die Websites hinweg uneinheitlich genutzt (manche Teams setzten sie ein, andere nicht), und so war sie in einen veralteten, chaotischen Zustand abgedriftet, mit Varianten derselben Oberfläche auf jeder Website.

Zwei Rahmenbedingungen prägten alles. Die Websites mussten durchgehend online bleiben; eine Universität kann ihre Institute nicht für eine Neuentwicklung vom Netz nehmen. Und das Team war funktionsübergreifend aufgestellt (Backend-Entwickler, UI/UX-Designer, DevOps-Engineers), also musste die Migration vorankommen, ohne die Arbeit der anderen zu blockieren. Die Vue-Migration selbst, ihr Testing und die Komponentenbibliothek lagen in meiner Verantwortung.

Architektur

Das waren keine SPAs. Jede Institutswebsite war eine Multi-Page-Anwendung, in die Vue dort eingebunden war, wo Interaktivität gebraucht wurde, bei Dashboards und interaktiven Komponenten, gebaut mit Webpack. Der Zustand lag in Vuex, die Daten kamen über REST-APIs (per Axios) aus einem schlichten Java-Backend. Die gemeinsame Komponentenbibliothek reichte über alle neun Websites.

Die Migration selbst lief in einem separaten Repository: Dort wurde die Codebasis schrittweise und unter Tests umgestellt, während die Produktion unberührt blieb. Erst als der umgestellte Code gründlich getestet war, ersetzte er die Live-Websites; einen Wechsel auf eine halb migrierte Codebasis gab es nie. Die Entscheidungen dahinter stehen im Entscheidungsprotokoll unten, jede mit der Alternative, gegen die sie sich durchgesetzt hat.

Ergebnisse

Tree-Shaking und die kleinere Laufzeitumgebung von Vue 3 machten das JavaScript-Bundle um 40 % kleiner. Die Barrierefreiheit wurde über ARIA-Attribute und semantisches HTML auf WCAG-Konformität gebracht, und Cypress-basierte Integrationstests, gemeinsam mit dem Team eingeführt, gaben der Migration eine End-to-End-Abdeckung.

Genauso wichtig waren die strukturellen Gewinne: Die Plattform konnte wieder mit aktuellen Vue-Funktionen Schritt halten, alte selbst geschriebene Logik wurde durch gut gepflegte Erweiterungen aus dem Vue-Ökosystem ersetzt, die Komponentenbibliothek war über alle neun Websites hinweg einheitlich und aktuell, und die Codebasis kam aus der Migration spürbar sauberer heraus, als sie hineingegangen war.

Lehren

Würde ich es noch einmal machen, würde ich alles auf die Composition API umstellen und keine Options API zurücklassen. Die stabilen Abschnitte zu behalten wirkte damals pragmatisch, aber eine Codebasis in zwei Stilen hat leise Kosten: Jedes künftige Upgrade und jede neue Person im Team muss mit zwei Denkmodellen umgehen, und der übrig gebliebene Options-Code ist genau die Stelle, an der künftige Reibung auftauchen wird. Die schrittweise Strategie mit separatem Repository würde ich dagegen ohne Zögern wiederholen: Sie hat neun Live-Websites einer Universität ohne Drama das Framework wechseln lassen.

Zentrale Entscheidungen

  1. 01 Migrationsstrategie

    Schrittweise Umstellung in einem separaten Repository.

    Neun öffentliche Institutswebsites mussten online bleiben; ein paralleles Repository ließ sich Stück für Stück umstellen und testen und ersetzte die Produktion erst, als es sich bewährt hatte.

    Die Live-Websites lieferten nie halb migrierten Code aus; der Wechsel erfolgte ein einziges Mal, nachdem die umgestellte Codebasis gründlich getestet war.

    verworfen: Ein Big-Bang-Rewrite auf der Live-Codebasis

  2. 02 Options API oder Composition API

    Composition API als Standard, Options API dort, wo sie weiterhin gut funktionierte.

    Der Großteil der Logik gewann durch die Neuschreibung echte Modularität, aber stabile Abschnitte in der Options API waren den zusätzlichen Aufwand im Rahmen der Migration nicht wert.

    Das ist zugleich meine wichtigste Lehre aus dem Projekt; siehe „Lehren“ oben.

    verworfen: Eine vollständige Umstellung aller Komponenten erzwingen

  3. 03 State-Management

    Die bestehende Vuex-Implementierung reparieren.

    Vuex war bereits eingebunden, aber falsch eingesetzt; korrigierte Store-Muster holten seinen Nutzen zurück, ohne der Framework-Migration eine zweite Migration aufzusatteln.

    verworfen: Vuex durch einen anderen Store ersetzen

  4. 04 Gemeinsame Komponentenbibliothek

    Die gemeinsame Bibliothek wiederbeleben und zum Standard für alle neun Websites machen.

    Gerade die uneinheitliche Nutzung hatte die Bibliothek veralten und verwildern lassen; die Konsolidierung bedeutete einen einzigen Ort für Änderungen und eine einheitliche Oberfläche überall.

    verworfen: Jede Website ihre lokalen Komponentenvarianten behalten lassen

Kennzahlen

Kennzahlen (eigene Angaben)
KennzahlWertStatus
Migrierte Institutswebsites9eigene Angabe
Größe des JS-Bundles−40 %eigene Angabe

Eigene Angaben: Die Institutswebsites der Fakultät im Umfang der Migration, 2019–2022 · Produktions-JS-Bundle aus dem Build-Output, vor und nach der Umstellung auf Vue 3