Vue.JS (Vue)

Eintrag zuletzt aktualisiert am: 24.05.2022

Vue.js ist ein JavaScript-basiertes Webframework für den Webbrowser zur Erstellung von Single-Page-Webanwendungen (SPA). Der Einsatz von TypeScript ist möglich.

Die erste Version von Vue.js ist 2014 erschienen. uch ein serverseitiges Rendern ist seit Version 2.0 möglich. Die aktuelle, unter dem Codenamen "One Piece" entwickelte Version 3.0 wurde im September 2020 veröffentlicht.

Anders als bei Angular (von Google) und React (von Facebook) steht hinter Vue.js keine große Firma, sondern lediglich eine Community auf GitHub [https://github.com/vuejs/vue] mit Elan You als Chefentwickler. Dennoch nutzen große Unternehmen wie BMW, Adobe, Nintendo, Alibaba, GitLab dieses Webframework (siehe [https://www.google.com/search?q=who+is+using+vuejs]).

Open Source auf Github: https://github.com/vuejs

Vue.js - "Das progressive JavaScript Framework"

Vue.js definiert sich in seiner Unterzeile als "The Progressive JavaScript Framework". Der Begriff "Progressive" spielt hierbei aber nicht auf Progressive Web Apps (PWA) an (wenn gleich sie auch möglich sind mit Vue.js), sondern auf die Tatsache, dass man Vue.js sowohl sehr niedrigen Einstiegshürden in kleinen Szenarien, als auch in mittleren und großen Projekten mit deutlich höheren Architekturanforderungen einsetzen kann:
 Vue.js kann man in einzelne statische HTML-Seiten oder serverseitige gerenderte Dateien per <script>-Tag direkt einbinden. Vue.js steht hier in den Fußtapfen von jQuery.
 Für eine Single-Page-Web-Application inkl. Progressive-Web-App (PWA) kann man Vue.js mit clientseitigem Router und einem Build-System verwenden. Als Werkzeuge verwendet man dann die Vue CLI [https://cli.vuejs.org] oder Vite [https://vitejs.dev].
 Mit Vue.js kann man Web Components / Custom Elements erstellen [https://vue-docs-preview.netlify.app/guide/extras/web-components.html#web-components-vs-vue-components].
 Das serverseitige Prerendering ist möglich [https://vue-docs-preview.netlify.app/guide/scaling-up/ssr.html].
 Auch Static-Site Generationing (SSG), alias "JAMStack" ist möglich, siehe VitePress [https://vitepress.vuejs.org] und Nuxt [https://v3.nuxtjs.org]
 Vue.js kann in hybriden Apps verwendet werden, z.B. bei Electron [https://www.electronjs.org] und dem neueren Tauri [https://tauri.studio] für Desktop App. Ansätze mit spezielle Vue.js-Unterstützung sind Ionic Vue [https://ionicframework.com/docs/vue/overview] für mobile Apps bzw. Quasar [https://quasar.dev] für Desktop, Mobile und als Browser-Erweiterung.

Beispiel

Listing 1 zeigt, wie man Vue.js in jede beliebige HTML-Seite einbetten kann: Einfach über eine <script>-Tag mit Verweis auf die Bibliotheksdatei Vue.js, die man lokal haben kann oder – wie in Listing 1 gezeigt – per CDN beziehen kann. So eignet sich Vue.js, um statische HTML-Seiten oder serverseitige gerenderte Dateien auf einfache Weise anzureichern. Vue.js steht hier in den Fußtapfen von jQuery. Listing 1 zeigt bereits Einiges mehr als ein einfaches Hello World:
 Erstellung einer Vue-Instanz mit Bezug auf ein HTML-Element mit id="app"
Variablen der Seite in dem Attribut data
 Berechnete Werte im Attribut Computed
 Eigene Methoden (methods:), die Variablen ändern
 Behandlung des Lebenszyklus-Ereignisses mounted
 Ausgabe von Variablen und berechneten Werte mit {{ xy }}
 Bedingte Ausgabe mit v-if
 Iteration mit v-for="x in menge"
 Bedingte Anwendung von CSS-Klassen und CSS-Styles

Die Sprachsyntax in Listing 1 ist JavaScript. Die in Listing 1 gezeigte Trennung von Variablen und Methoden in verschiedene Sektionen im Programmcode ist charakteristisch für das sogenannte Options API von Vue.js und auch der Hauptkritikpunkt am Options API: Der Entwickler kann den Code nicht nach logischen Gesichtspunkten anordnen, sondern muss ich den Regeln von Vue.js unterwerfen. In größeren Komponenten wird es dann schnell unübersichtlich. Wenn man viele kleine Komponenten erstellt, stört einen schnell die zusätzliche Tipparbeit für das Options API. Das Options API hat viel störenden Boilerplate-Code [https://de.wikipedia.org/wiki/Boilerplate-Code].

Listing 1: Quadratwurzelrechner als Beispiel für die einfache Einbettung von Vue.js in beliebige HTML-Seiten

<html>
<head>
<!-- development version, includes helpful console warnings -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<!-- production version, optimized for size and speed -->
<!-- <script src="https://cdn.jsdelivr.net/npm/vue@2"></script> -->
<style>
li { margin: 2px; }
li::marker { color:red; }
.even { color: green}
.odd { color: blue}
</style>
</head>

<div id="app">
<h2>{{this.$options.name }}</h2>
<h4>{{author}}</h4>
<div>Counter: {{ count }}
<button @click="increment">+1</button> Quadratwurzel: {{result.toFixed(2)}}
</div>
<hr>
<h3 v-if="all.size > 0">{{all.size}} Ergebnisse:</h3>
<ul>
<li v-for="[key,value] in all"
v-bind:class="{'even': key%2==0, 'odd': key%2!=0}">
<!-- or: v-bind:style="{color: (key%2==0 ? 'red' : 'green')}"> -->
{{key}} = {{value.toFixed(2)}}
</li>
</ul>
</div>

<script>
var app = new Vue({
name: "Quadratwurzelrechner in Vue.js",
el: '#app',
data: {
count: 0,
author: '© Dr. Holger Schwichtenberg',
all: new Map()
},
computed:
{
result: function () {
return Math.sqrt(this.count)
}
},
methods: {
increment: function () {
this.count++;
this.all.set(this.count, this.result);
}
},
mounted: function () {
console.log(this.$options.name + ": mounted!");
this.author += " " + new Date().getFullYear();
}
})
</script>
</html>