<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de-x-formal">
	<id>https://glossar.hs-augsburg.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rosaresa</id>
	<title>GlossarWiki - Benutzerbeiträge [de-formal]</title>
	<link rel="self" type="application/atom+xml" href="https://glossar.hs-augsburg.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rosaresa"/>
	<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/Spezial:Beitr%C3%A4ge/Rosaresa"/>
	<updated>2026-07-17T19:18:08Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=HTML5-Tutorium:_JavaScript:_Hello_World_04&amp;diff=41184</id>
		<title>HTML5-Tutorium: JavaScript: Hello World 04</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=HTML5-Tutorium:_JavaScript:_Hello_World_04&amp;diff=41184"/>
		<updated>2016-10-14T11:34:28Z</updated>

		<summary type="html">&lt;p&gt;Rosaresa: /* Node.js */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{HTML5-Tutorium:JavaScript:HelloWorld:Menü}}&lt;br /&gt;
&#039;&#039;&#039;Musterlösung&#039;&#039;&#039;: [https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld04/index.html &amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;]&lt;br /&gt;
([https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld04/ SVN-Repository])&lt;br /&gt;
==Anwendungsfälle (Use Cases)==&lt;br /&gt;
Gegenüber dem [[HTML5-Tutorium:_JavaScript:_Hello_World_03|dritten Teil des Tutoriums]]&lt;br /&gt;
ändern sich die die Anwendungsfälle nicht. Die Anwendung leistet also genau dasselbe wie zuvor.&lt;br /&gt;
&lt;br /&gt;
In diesem Teil des Tutoriums geht es darum, die Anwendung zu verbessern, so dass sie schneller ausgeliefert werden kann.&lt;br /&gt;
Außerdem wird die Entwicklungsarbeit mit Hilfe von Automatisierungstools erleichtert.&lt;br /&gt;
&lt;br /&gt;
==Erstellen eines neuen Projektes==&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie ein neues Projekt  „&amp;lt;code&amp;gt;HelloWorld04&amp;lt;/code&amp;gt;“ und legen Sie dieses in Ihrem Repository ab.&lt;br /&gt;
Kopieren Sie anschließend alle Dateien aus dem dritten Teil des Tutoriums, passen Sie den Titel in der HTML-Datei an und committen Sie abermals.&lt;br /&gt;
&lt;br /&gt;
==Erstellen einer Ordnerstruktur==&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich gilt auch bei der Programmierung: Ordnung ist das halbe Leben.&lt;br /&gt;
&lt;br /&gt;
Web-Anwendungen werden sehr schnell sehr groß. Also sollte man sich eine geeignete Ordnerstruktur überlegen.&lt;br /&gt;
Üblicherweise legt man CSS-Dateien in einen Ordner namens  „&amp;lt;code&amp;gt;css&amp;lt;/code&amp;gt;“ und JavaScript-Dateien in einen Ordner namens&lt;br /&gt;
„&amp;lt;code&amp;gt;js&amp;lt;/code&amp;gt;“ oder  „&amp;lt;code&amp;gt;lib&amp;lt;/code&amp;gt;“. Sollten es viele CSS- und/oder JavaScript-Dateien werden, &lt;br /&gt;
legt man im entsprechenden Ordner geeignete Unterordner an.&lt;br /&gt;
&lt;br /&gt;
Legen Sie im Root-Verzeichnis Ihres Projektes folgende Ordner an:&lt;br /&gt;
* &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;: Der Inhalt dieses Ordners kommt später auf einen echten Web-Server.&lt;br /&gt;
* &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;: Dieser Ordner enthält die unkomprimierten CSS- und JavaScript-Dateien.&lt;br /&gt;
* &amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;: Dieser Ordner enthält die Projektdokumentation.&lt;br /&gt;
* &amp;lt;code&amp;gt;conf&amp;lt;/code&amp;gt;: Dieser Ordner enthält Projektkonfigurationsdateien mit Ausnahme zweier zentraler Node.js-Dateien.&lt;br /&gt;
Legen Sie innerhalb der Ordner „&amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;“ und „&amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;“ jeweils zwei weitere Ordner an:  „&amp;lt;code&amp;gt;css&amp;lt;/code&amp;gt;“ sowie „&amp;lt;code&amp;gt;js&amp;lt;/code&amp;gt;“ .&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie im Editorbereich die Datei  „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ und verschieben sie in den Ordner „&amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;“.&lt;br /&gt;
Verschieben sie anschließend die Dateien „&amp;lt;code&amp;gt;main.css&amp;lt;/code&amp;gt;“ und „&amp;lt;code&amp;gt;main.js&amp;lt;/code&amp;gt;“&lt;br /&gt;
in die passenden Ordner „&amp;lt;code&amp;gt;src/css&amp;lt;/code&amp;gt;“ bzw. „&amp;lt;code&amp;gt;src/js&amp;lt;/code&amp;gt;“. Sie werden feststellen, dass die Verweise in den Link- und Script-Elementen der&lt;br /&gt;
Datei „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ automatisch angepasst werden. Verschieben Sie nun die Datei „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ in den Ordner „&amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;“.&lt;br /&gt;
&lt;br /&gt;
Das Ergebnis dieser Aktion ist, dass Ihre Web-Anwendung nicht mehr im Root-Verzeichnis des Projektes liegt, sondern (sauber strukturiert) in zwei Unterordnern.&lt;br /&gt;
Daher ist es möglich, im Root-Verzeichnis des Projektes weitere projektspezifische Ordner und Dateien anzulegen wie „&amp;lt;code&amp;gt;conf&amp;lt;/code&amp;gt;“ und „&amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;“,&lt;br /&gt;
die später nicht auf den Web-Server, auf dem die Anwendung schließlich laufen soll, kopiert werden. Auch der Ordner „&amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;“ existiert nur&lt;br /&gt;
in der Entwicklungsumgebung, lediglich der Inhalt des Web-Ordners ist für den Liveserver bestimmt.&lt;br /&gt;
&lt;br /&gt;
==Laden der CSS- und der JavaScript-Dateien==&lt;br /&gt;
&lt;br /&gt;
Eine Web-Anwendung funktioniert nur – wie Sie bereits erfahren haben –, wenn nicht nur die HTML-Datei, sondern auch die zugehörigen&lt;br /&gt;
CSS- und JavaScript-Dateien geladen werden. Allerdings gibt es dabei ein Problem: Die CSS- und JavaScript-Dateien werden im Laufe der&lt;br /&gt;
Zeit immer zahlreicher und/oder größer. Diese Dateien zu laden, dauert seine Zeit. &lt;br /&gt;
&lt;br /&gt;
In der aktuellen Version der Web-Anwendung stehen diese Verweise auf diese Dateien im &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;-Bereich des Dokuments.&lt;br /&gt;
Dieser wird vollständig geladen, bevor der &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;-Bereich eingelesen wird. Das heißt aber, dass der Browser keine Inhalte des HTML-Dokuments&lt;br /&gt;
darstellen kann, solange er die JavaScript- und CSS-Dateien lädt. Wenn dies zu lange dauert, verliert der Besucher die Geduld und verlässt die Seite &lt;br /&gt;
vorzeitig.&lt;br /&gt;
&lt;br /&gt;
Besser wäre es daher andersherum vorzugehen: Es wird zuerst der &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;-Bereich geladen und dann die JavaScript- und die CSS-Dateien.&lt;br /&gt;
Im Falle von JavaScript ist das durchaus sinnvoll, aber im Falle von CSS hat das den Effekt, dass der Browser keine Layout-Vorgaben erhalten hat,&lt;br /&gt;
wenn er mit dem [[Rendern]] der Seite beginnt. Also verwendet er die browserspezifischen Defaultwerte. Das heißt, die Seite sieht zunächst&lt;br /&gt;
ganz anders aus, als vom Designer geplant. Wenn dann die CSS-Dateien geladen wurden, wird die Seite erneut gerendert und verändert ihr Aussehen.&lt;br /&gt;
Auch das ist verwirrend und wirkt unprofessionell.&lt;br /&gt;
&lt;br /&gt;
Was also machen?&lt;br /&gt;
&lt;br /&gt;
===CSS-Dateien===&lt;br /&gt;
Für CSS-Dateien empfiehlt Google ernsthaft, die Link-Element ganz ans Ende der HTML-Datei  zu stellen, also &#039;&#039;&#039;nach&#039;&#039;&#039; dem &lt;br /&gt;
schließenden &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;-Tag.&lt;br /&gt;
Damit das Problem mit dem falschen Layout nicht auftritt, sollen wichtige CSS-Befehle direkt – {{dh}} als CSS-Befehle innerhalb eines&lt;br /&gt;
&amp;lt;code&amp;gt;style&amp;lt;/code&amp;gt;-Elements – in die HTML-Datei eingefügt &lt;br /&gt;
werden.&amp;lt;ref&amp;gt;{{Quelle|Google (Web)}}, Kapitel „CSS-Bereitstellung optimieren“, https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Von beiden Vorschlägen rate ich dringend ab. Der erste Vorschlag ist nicht [[HTML]]-konform, ja noch nicht einmal [[SGML]]-konform. Es mag sein,&lt;br /&gt;
dass diverse Browser diese Syntax verstehen, korrekt ist sie trotzdem nicht. Der zweite Vorschlag hat zur Folge, dass Struktur (HTML) und Layout (CSS)&lt;br /&gt;
vermischt werden. Dies war einer der Kardinalfehler von frühen HTML-Versionen aus der Zeit, bevor es das CSS-Format gab. &#039;&#039;&#039;Tun Sie das nicht.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Gehen Sie so vor, wie es unter [[Multimedia-Programmierung: Best Practices#CSS|Multimedia-Programmierung: Best Practices]] beschrieben ist.&lt;br /&gt;
&lt;br /&gt;
In unserer Anwendung haben wir bislang alles richtig gemacht, bis auf die fehlende automatische Komprimierung.&lt;br /&gt;
Diese wird weiter unten beschrieben.&lt;br /&gt;
&lt;br /&gt;
===JavaScript-Dateien===&lt;br /&gt;
&lt;br /&gt;
Für JavaScript-Dateien empfiehlt Google ebenfalls, diese nicht schon zu Beginn zu laden.&amp;lt;ref&amp;gt;{{Quelle|Google (Web)}}, Kapitel „CSS-Bereitstellung optimieren“, https://developers.google.com/speed/docs/insights/BlockingJS&amp;lt;/ref&amp;gt; Dieser Vorschlag ist sehr sinnvoll.&lt;br /&gt;
&lt;br /&gt;
Entfernen Sie das &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;-Element aus dem HTML-Header-Bereich und fügen Sie es vor dem schließenden &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;-Tag  ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;../src/js/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Node.js===&lt;br /&gt;
&lt;br /&gt;
Dieses Tutorium befasst sich zwar nicht mit der Erstellung von Node.js-Anwendungen, aber trotzdem benötigen wir&lt;br /&gt;
Node, da für die Komprimierung von Dateien und das automatische Erstellen von JavaScript-Dokumentationen&lt;br /&gt;
derartige Anwendungen zum Einsatz kommen.&lt;br /&gt;
&lt;br /&gt;
Installieren Sie zunächst Node.js: &amp;lt;code&amp;gt;https://nodejs.org/en/&amp;lt;/code&amp;gt;, Version 6.x. Diverse Versionen finden Sie unter https://nodejs.org/en/download/.&lt;br /&gt;
Achten Sie darauf, dass die Option „&amp;lt;code&amp;gt;Add to PATH&amp;lt;/code&amp;gt;“ ausgewählt wurde.&lt;br /&gt;
&lt;br /&gt;
Starten Sie WebStorm neu und öffnen Sie das Terminal, um zu testen, ob &amp;lt;code&amp;gt;node&amp;lt;/code&amp;gt; funktioniert:&lt;br /&gt;
&lt;br /&gt;
* Klick auf Icon in der linken unteren Ecke → &amp;lt;code&amp;gt;Terminal&amp;lt;/code&amp;gt;&lt;br /&gt;
* Geben Sie Folgendes ins Terminal ein: &amp;lt;code&amp;gt;node --version&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn Node.js korrekt installiert und der Pfad mit den &amp;lt;code&amp;gt;node&amp;lt;/code&amp;gt;-Binaries in die Systemvariable &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt; eingetragen wurde,&lt;br /&gt;
sollte die Versionsnummer von &amp;lt;code&amp;gt;node&amp;lt;/code&amp;gt; ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
Sie werden feststellen, das Node.js zum Großteil über Konsolbefehle gesteuert wird. &lt;br /&gt;
Zu Beginn mag das für eingefleischte [[Klickibunti]]-Fans ungewohnt sein, aber Sie werden sich schnell daran gewöhnen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipp&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Profis verwenden unter Windows lieber ein Terminal, dass eine [[Unix]]-[[Shell]] simuliert.&lt;br /&gt;
(Unter Linux und Mac OS X ist das nicht notwendig. Dort läuft sowieso schon eine UNIX-Shell.)&lt;br /&gt;
&lt;br /&gt;
Installieren Sie  „Git for Windows“ (https://git-for-windows.github.io/). In diesem Paket ist die „Git BASH“ enthalten.&lt;br /&gt;
Das ist eine Terminal-Anwendung, die eine Linux-Bash emuliert und zahlreiche nützliche Befehle wie „&amp;lt;code&amp;gt;which&amp;lt;/code&amp;gt;“, „&amp;lt;code&amp;gt;[[vi]]&amp;lt;/code&amp;gt;“ ( :-) ) etc. zur&lt;br /&gt;
Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie im Wurzel-Verzeichnis Ihres Projektes einen Ordner namens „&amp;lt;code&amp;gt;node-modules&amp;lt;/code&amp;gt;“.&lt;br /&gt;
Wenn die Frage „&#039;&#039;Do you want to schedule the following directory for addition tu Subversion?&#039;&#039;“&lt;br /&gt;
aufpoppt, antworten Sie unbedingt mit &#039;&#039;&#039;„&amp;lt;code&amp;gt;No&amp;lt;/code&amp;gt;“&#039;&#039;&#039;, anderenfalls werden Hunderte von Node.js-Dateien ins Repository geschrieben,&lt;br /&gt;
obwohl das überflüssig ist und &#039;&#039;&#039;sehr viel&#039;&#039;&#039; Zeit in Anspruch nimmt.&lt;br /&gt;
Anschließend führen Sie folgende Befehle aus:&lt;br /&gt;
&lt;br /&gt;
* Rechtsklick auf den neu erstellten Ordner → &amp;lt;code&amp;gt;Subversion&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Ignore&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;node-modules&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie nun ein beliebiges Terminal (WebStorm-Terminal, Git Bash, Mac-OS-X-Terminal ...)&lt;br /&gt;
und geben Sie folgenden Befehl ein (npm = node package manager, https://www.npmjs.com/)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
npm install -g bower grunt-cli jsdoc ink-docstrap yuglify mincss coffee-script jshint&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit werden die wichtigsten Node.js-Pakete &#039;&#039;global&#039;&#039;  (Option „&amp;lt;code&amp;gt;-g&amp;lt;/code&amp;gt;“) installiert, die wir im Folgenden noch benötigen, evtl. implizit. &lt;br /&gt;
Die globale Installation hat zur Folge, dass jedes Projekt auf diese Pakete zugreifen kann, Pakete also nicht mehrfach installiert werden.&lt;br /&gt;
&lt;br /&gt;
* Rechtsklick im Dateibaum auf  „&amp;lt;code&amp;gt;node-modules&amp;lt;/code&amp;gt;“ → &amp;lt;code&amp;gt;Mark Directory as&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;excluded&amp;lt;/code&amp;gt;&lt;br /&gt;
* Rechtsklick im Dateibaum auf  „&amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;“ → &amp;lt;code&amp;gt;Mark Directory as&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;excluded&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beide Ordner enthalten Dateien, die nicht von Ihnen stammen. Diese Dateien können Fehler und Hinweise enthalten, &lt;br /&gt;
veraltete (“deprecated”) Schnittstellen verwenden etc. (Oh ja, auch andere Programmierer machen Fehler. :-) )&lt;br /&gt;
Und wenn Sie diese beiden Ordner nicht als „&amp;lt;code&amp;gt;excluded markieren&amp;lt;/code&amp;gt;“, prüft WebStorm bei jedem Commit die&lt;br /&gt;
darin enthaltenen Dateien und weist Sie auf jedes Problem hin. Das können so viele Probleme sein, dass Sie die&lt;br /&gt;
Probleme in Ihren eigenen Dateien vollkommen übersehen.&lt;br /&gt;
&lt;br /&gt;
Nun müssen wir den Node-Paket-Manager „&amp;lt;code&amp;gt;npm&amp;lt;/code&amp;gt;“ (https://docs.npmjs.com/) sowie Grunt (http://gruntjs.com/) initialisieren.&lt;br /&gt;
Grunt ist &#039;&#039;&#039;der&#039;&#039;&#039; “JavaScript Task Runner”, also ein Programm, das Aufgaben (&#039;&#039;tasks&#039;&#039;) wie {{zB}} das Komprimieren von Programmdateien&lt;br /&gt;
durchführt. &lt;br /&gt;
&lt;br /&gt;
Die Initialisierung erfolgt durch die Bereitstellung von zwei Dateien „&amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt;“&lt;br /&gt;
und „&amp;lt;code&amp;gt;gruntfile.json&amp;lt;/code&amp;gt;“ im Root-Verzeichnis der Web-Anwendung. Eine initiale Version der &amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt; könnten Sie theoretisch mit&lt;br /&gt;
&amp;lt;code&amp;gt;npm init&amp;lt;/code&amp;gt; erstellen. Einfacher ist es jedoch, wenn Sie die beiden Dateien von Hand erstellen und folgenden Code einfügen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt;&#039;&#039;&#039; (https://docs.npmjs.com/files/package.json)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;hello_world_04&amp;quot;,&lt;br /&gt;
  &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;Hello World Tutorium&amp;quot;,&lt;br /&gt;
  &amp;quot;main&amp;quot;: &amp;quot;gruntfile.js&amp;quot;,&lt;br /&gt;
  &amp;quot;directories&amp;quot;: {&lt;br /&gt;
    &amp;quot;doc&amp;quot;: &amp;quot;./doc&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;dependencies&amp;quot;: {},&lt;br /&gt;
  &amp;quot;devDependencies&amp;quot;: {&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;scripts&amp;quot;: {&lt;br /&gt;
    &amp;quot;test&amp;quot;: &amp;quot;echo \&amp;quot;Error: no test specified\&amp;quot; &amp;amp;&amp;amp; exit 1&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;repository&amp;quot;: {&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;svn&amp;quot;,&lt;br /&gt;
    &amp;quot;url&amp;quot;: &amp;quot;https://glossar.hs-augsburg.de/kowa/tutorium/es5/hello_world/WK_HelloWorld04&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;author&amp;quot;: &amp;quot;Wolfgang Kowarschick&amp;quot;,&lt;br /&gt;
  &amp;quot;license&amp;quot;: &amp;quot;CC-BY-NC-SA-4.0&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Diese Datei wird durch &amp;lt;code&amp;gt;npm&amp;lt;/code&amp;gt; automatisch erstellt und geändert. Daher ist das Layout (welches mir nicht gefällt) vorgegeben.&lt;br /&gt;
&lt;br /&gt;
Hier sollten Sie natürlich nicht meinen Repositorypfad und meinen Namen einfügen, sondern jeweils Ihren. Sie können außerdem die&lt;br /&gt;
Lizenz anpassen (https://spdx.org/licenses/), unter die Sie Ihre Software stellen, wenn Sie das möchten.&lt;br /&gt;
&lt;br /&gt;
Die meisten Attribute sind selbsterklärend. Wichtig sind für uns vor allem zwei Attribute: „&amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;“ und&lt;br /&gt;
„&amp;lt;code&amp;gt;devDependencies&amp;lt;/code&amp;gt;“. Das erste enthält den Namen der Konfigurationsdatei von Grunt. Diese fehlt noch. Also: Legen Sie sie an&lt;br /&gt;
(und vergessen Sie nicht, Ihren Namen anstelle meines Namens einzufügen):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;gruntfile.js&amp;lt;/code&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * @author Wolfgang Kowarschick &amp;lt;kowa@hs-augsburg.de&amp;gt;&lt;br /&gt;
 * @see http://gruntjs.com/getting-started&lt;br /&gt;
 *&lt;br /&gt;
 * Created on 2016/09/28.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
module.exports = function(grunt)&lt;br /&gt;
{&lt;br /&gt;
  // Project configuration.&lt;br /&gt;
  grunt.initConfig&lt;br /&gt;
  ({&lt;br /&gt;
    pkg: grunt.file.readJSON(&#039;package.json&#039;),&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Load the plugin that provides the &amp;quot;uglify&amp;quot; task.&lt;br /&gt;
&lt;br /&gt;
  // Default task(s).&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Datei ist noch ziemlich leer, aber das wird sich ändern.&lt;br /&gt;
&lt;br /&gt;
Vorausschauend sollten Sie eine überflüssige WebStorm-Fehlerprüfung deaktivieren, da anderenfalls künftige Versionen&lt;br /&gt;
Versionen der Datei „&amp;lt;code&amp;gt;gruntfile.js&amp;lt;/code&amp;gt;“ jedes Mal eine Fehlermeldung zur Folge haben, wenn die&lt;br /&gt;
Datei ins SVN-Repository geschrieben werden soll:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;WebStorm&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Settings&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;Preferences&amp;lt;/code&amp;gt;  → &amp;lt;code&amp;gt;Editor&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Inspections&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;JavaScript&amp;lt;/code&amp;gt; aufklappen → &amp;lt;code&amp;gt;General&amp;lt;/code&amp;gt; aufklappen → &amp;lt;code&amp;gt;Unsued JavaScript / ActionScript global symbol&amp;lt;/code&amp;gt; deselektieren&lt;br /&gt;
* &amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Spannender ist in der Datei „&amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt;“ das Attribut „&amp;lt;code&amp;gt;devDependencies&amp;lt;/code&amp;gt;“ (dev = developer).&lt;br /&gt;
Diese enthält eine Liste von von NodeJS-Paketen, die für die Entwicklung der Web-Anwendung benötigt werden. &lt;br /&gt;
Fügen wir einmal das Paket „&amp;lt;code&amp;gt;ink-docstrap&amp;lt;/code&amp;gt;“ in diese Liste ein. &lt;br /&gt;
(Diese Pakte wird nachfolgend für die Erstellung der JavaScript-Dokumentation mittels JSDoc verwendet. Es enthält ein Theme, welches deutlich schöner ist als das Standard-JSDoc-Theme.)&lt;br /&gt;
&lt;br /&gt;
Führen Sie folgenden Befehl im WebStorm-Terminal (oder mittels eine beliebigen anderen Shell im Wurzelverzeichnis Ihrer Web-Anwendung) aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
npm install ink-docstrap --save-dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies bewirkt zweierlei:&lt;br /&gt;
&lt;br /&gt;
# Das Node.js-Paket „&amp;lt;code&amp;gt; ink-docstrap&amp;lt;/code&amp;gt;“ sowie diverse weitere Node.js-Pakete, die diese Paket benötigt, werden einem Projektordner namens „&amp;lt;code&amp;gt;node_modules&amp;lt;/code&amp;gt;“ abgelegt. &lt;br /&gt;
# Das Name und die Versionsnummer des Paketes werden in das Attribut „&amp;lt;code&amp;gt;devDependencies&amp;lt;/code&amp;gt;“ in der  Datei „&amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt;“ eingefügt (wegen der Option „&amp;lt;code&amp;gt;--save-dev&amp;lt;/code&amp;gt;“).&lt;br /&gt;
&lt;br /&gt;
Nun steht Ihnen der Befehl&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
npm update&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
zur Verfügung. Mit diesem können Sie die lokal gespeicherte Versionen der im Attribut „&amp;lt;code&amp;gt;devDependencies&amp;lt;/code&amp;gt;“ aufgeführte Node.js-Pakete&lt;br /&gt;
jederzeit auf die neueste Version aktualisieren. Sie können ein Paket auch löschen und dann mittels &amp;lt;code&amp;gt;npm update&amp;lt;/code&amp;gt; (https://docs.npmjs.com/cli/update) wieder herstellen.&lt;br /&gt;
Versuchen Sie es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
npm remove ink-docstrap&lt;br /&gt;
npm list&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt ist der Ordner „&amp;lt;code&amp;gt;node_modules&amp;lt;/code&amp;gt;“  wieder leer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
npm update&lt;br /&gt;
npm list&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und jetzt enthält der wieder „&amp;lt;code&amp;gt;ink-docstrap&amp;lt;/code&amp;gt;“ sowie andere dafür notwendige Pakete.&lt;br /&gt;
&lt;br /&gt;
Sie können auch überprüfen, ob Sie in Ihrem Projekt irgendwelche veralteten Pakete benutzen (https://docs.npmjs.com/cli/outdated):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
npm outdated&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kein Ergebnis ist hier ein gutes Ergebnis!&lt;br /&gt;
&lt;br /&gt;
Und natürlich funktioniert das Ganze auch für global gespeicherte Pakete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
npm -g outdated&lt;br /&gt;
npm -g list&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allerdings muss man veraltete globale Pakete erneut installieren. Zum Beispiel muss &amp;lt;code&amp;gt;npm&amp;lt;/code&amp;gt;&lt;br /&gt;
relativ häufig aktualisiert werden (sobald  „&amp;lt;code&amp;gt;npm -g outdated&amp;lt;/code&amp;gt;“ das Paket als veraltet meldet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
npm install -g npm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Automatische Generierung der Schnittstellenbeschreibung==&lt;br /&gt;
&lt;br /&gt;
Installieren Sie zunächst JSDoc:&lt;br /&gt;
&lt;br /&gt;
* Öffnen Sie das WebStorm-Terminal.&lt;br /&gt;
* &amp;lt;code&amp;gt;npm install -g jsdoc&amp;lt;/code&amp;gt; (installiert JSDoc als Node.js-Anwendung; das haben Sie eigentlich schon gemacht, aber das macht nix :-) )&lt;br /&gt;
* &amp;lt;code&amp;gt;npm install ink-docstrap&amp;lt;/code&amp;gt; (installiert ein JSDoc-Theme namens „&amp;lt;code&amp;gt;docstrap&amp;lt;/code&amp;gt;“ ([https://docstrap.github.io/docstrap/]); das haben Sie auch schon gemacht, aber das macht auch nix.)&lt;br /&gt;
&lt;br /&gt;
Übrigens: Es gibt auch noch andere Themes für JSDoc.&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie im Projektordner  „&amp;lt;code&amp;gt;conf&amp;lt;/code&amp;gt;“ eine JSON-Datei namens „&amp;lt;code&amp;gt;jsdoc.json&amp;lt;/code&amp;gt;“.&lt;br /&gt;
Fügen Sie in diese Datei folgenden Code ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;tags&amp;quot;:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;allowUnknownTags&amp;quot;: true&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;source&amp;quot;:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;include&amp;quot;:        [&amp;quot;./src/js&amp;quot;],&lt;br /&gt;
    &amp;quot;includePattern&amp;quot;: &amp;quot;.+\\.js$&amp;quot;,&lt;br /&gt;
    &amp;quot;excludePattern&amp;quot;: &amp;quot;doc&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;plugins&amp;quot;:&lt;br /&gt;
  [],&lt;br /&gt;
  &amp;quot;templates&amp;quot;:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;systemName&amp;quot;:      &amp;quot;WK_HelloWorld04&amp;quot;,&lt;br /&gt;
    &amp;quot;footer&amp;quot;:          &amp;quot;&amp;quot;,&lt;br /&gt;
    &amp;quot;copyright&amp;quot;:       &amp;quot;Copyright © 2016 by Wolfgang Kowarschick, License &amp;lt;a href=\&amp;quot;https://creativecommons.org/licenses/by-nc-sa/4.0/\&amp;quot;&amp;gt;CC-BY-NC-SA-4.0&amp;lt;/a&amp;gt;&amp;quot;,&amp;quot;,&lt;br /&gt;
    &amp;quot;navType&amp;quot;:         &amp;quot;vertical&amp;quot;,&lt;br /&gt;
    &amp;quot;theme&amp;quot;:           &amp;quot;cerulean&amp;quot;,&lt;br /&gt;
    &amp;quot;linenums&amp;quot;:        true,&lt;br /&gt;
    &amp;quot;cleverLinks&amp;quot;:     false,&lt;br /&gt;
    &amp;quot;monospaceLinks&amp;quot;:  true,&lt;br /&gt;
    &amp;quot;collapseSymbols&amp;quot;: true,&lt;br /&gt;
    &amp;quot;inverseNav&amp;quot;:      false&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;opts&amp;quot;:&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;template&amp;quot;:    &amp;quot;node_modules/ink-docstrap/template&amp;quot;,&lt;br /&gt;
    &amp;quot;encoding&amp;quot;:    &amp;quot;utf8&amp;quot;,&lt;br /&gt;
    &amp;quot;destination&amp;quot;: &amp;quot;doc/jsdoc&amp;quot;,&lt;br /&gt;
    &amp;quot;recurse&amp;quot;:     true,&lt;br /&gt;
    &amp;quot;private&amp;quot;:     true&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Ersetzen Sie im Attribut „&amp;lt;code&amp;gt;footer&amp;lt;/code&amp;gt;“ meinen Namen durch Ihren, denn es ist Ihr Projekt, nicht meines. :-)&lt;br /&gt;
&lt;br /&gt;
In dieser Datei wird festgelegt, wie die HTML-Dokumentation des Codes, die JSDoc erstellt, aussehen soll.&lt;br /&gt;
Insbesondere ist das Template angegeben, das zur Erstellung dieser HTML-Dokumente verwendet werden soll.&lt;br /&gt;
Es handelt sich um „&amp;lt;code&amp;gt;docstrap&amp;lt;/code&amp;gt;“, welches wir zuvor heruntergeladen haben. Von der&lt;br /&gt;
Projektroot aus gesehen, befinden sich die Template-Dateien im Ordner&lt;br /&gt;
„&amp;lt;code&amp;gt;node_modules/ink-docstrap/template&amp;lt;/code&amp;gt;“.&lt;br /&gt;
&lt;br /&gt;
Weitere Konfigurationsparameter werden unter http://usejsdoc.org/about-configuring-jsdoc.html beschrieben.&lt;br /&gt;
&lt;br /&gt;
Sie können nun eine Dokumentation für Ihr Projekt erstellen:&lt;br /&gt;
&lt;br /&gt;
* Öffnen Sie das WebStorm-Terminal.&lt;br /&gt;
* &amp;lt;code&amp;gt;jsdoc -c conf/jsdoc.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach kurzer Zeit sollte der Ordner „&amp;lt;code&amp;gt;doc/jsdoc&amp;lt;/code&amp;gt;“ erstellt und mit Inhalten gefüllt worden sein.&lt;br /&gt;
Sehen Sie sich die Datei „&amp;lt;code&amp;gt;doc/jsdoc/index.html&amp;lt;/code&amp;gt;“ im Browser an. Diese enthält nicht viel,&lt;br /&gt;
außer einem Drop-Down-Menü „&amp;lt;code&amp;gt;global&amp;lt;/code&amp;gt;“, in dem die drei von Ihnen erstellen globalen Funktionen&lt;br /&gt;
„&amp;lt;code&amp;gt;greet&amp;lt;/code&amp;gt;“, „&amp;lt;code&amp;gt;greet_on_enter&amp;lt;/code&amp;gt;“ und „&amp;lt;code&amp;gt;init&amp;lt;/code&amp;gt;“ enthalten sind.&lt;br /&gt;
Klicken Sie auf eine dieser Funktionen.&lt;br /&gt;
&lt;br /&gt;
===Globale Speicherung der JSDoc-Templates===&lt;br /&gt;
&lt;br /&gt;
Wenn Sie  „&amp;lt;code&amp;gt;ink-docstrap&amp;lt;/code&amp;gt;“ nicht mittels &lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;npm install ink-docstrap&amp;lt;/source&amp;gt; &lt;br /&gt;
sondern global mittels &lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;npm install -g ink-docstrap&amp;lt;/source&amp;gt;&lt;br /&gt;
installieren (so wie Sie das auch schon bereits getan haben), werden die Template-Dateien nicht im Projektordner, sondern im globalen &amp;lt;code&amp;gt;npm&amp;lt;/code&amp;gt;-Ordner abgelegt.&lt;br /&gt;
Das hat den Vorteil, dass Sie dieses Template für viele Projekte einsetzen können und es nicht bei jedem Projekt separat speichern müssen.&lt;br /&gt;
Der Nachteil ist, dass in der Datei „&amp;lt;code&amp;gt;conf/jsdoc.json&amp;lt;/code&amp;gt;“ den absoluten Pfad des globalen Ordners angeben müssen.&lt;br /&gt;
Dieser Pfad sieht auf jedem Rechner anders aus. Bei mir lautet er beispielsweise:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;c:/Users/kowa/AppData/Roaming/npm/node_modules/ink-docstrap/template&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das heißt, wenn man im Team an einem Projekt arbeitet, müsste man für jedes Teammitglied eine eigene&lt;br /&gt;
JSDoc-Konfigurationsdatei anlegen, was nicht wirklich schön, aber doch machbar ist.&lt;br /&gt;
&lt;br /&gt;
In der [https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld04/ Musterlösung] verwende ich die lokale Version „&amp;lt;code&amp;gt;docstrap&amp;lt;/code&amp;gt;“&lt;br /&gt;
(es gibt allerdings auch eine Datei namens  „&amp;lt;code&amp;gt;conf/jsdoc_wk.json&amp;lt;/code&amp;gt;“, die speziell für meinen Rechner erstellt wurde).&lt;br /&gt;
Die lokale Version von „&amp;lt;code&amp;gt;docstrap&amp;lt;/code&amp;gt;“ ist allerdings nicht im Repository enthalten. Nachdem Sie die Musterlösung auf Ihren Rechner kopiert haben&lt;br /&gt;
(vergessen, wie&#039;s geht? → [[HTML5-Tutorium:_JavaScript:_Hello_World_01#Projekte_aus_einem_Subversion-Repository_laden|HTML5-Tutorium: JavaScript: Hello World 04]]),&lt;br /&gt;
müssen Sie im WebStorm-Terminal der Musterlösung noch folgenden Befehl ausführe:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
npm update&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und schon sollten Sie die Dokumentation wie gewohnt erstellen können.&lt;br /&gt;
&lt;br /&gt;
Sobald Sie „&amp;lt;code&amp;gt;grunt&amp;lt;/code&amp;gt;“ konfiguriert haben, sollte „&amp;lt;code&amp;gt;conf/jsdoc.json&amp;lt;/code&amp;gt;“  auch in Ihrem Projekt fehlende Node.js-PAkete nachinstallieren.&lt;br /&gt;
&lt;br /&gt;
===Erstellung der JSDoc-Dokumentation mittels Klickibunti===&lt;br /&gt;
&lt;br /&gt;
Falls Sie die Dokumentation nicht immer über das Terminal erstellen möchten, können Sie &lt;br /&gt;
in WebStorm einen neuen Menüeintrag erstellen, über den Sie die Erzeugung der HTML-Dokumentation starten können.&lt;br /&gt;
&lt;br /&gt;
Sie müssen dazu den Pfad ermitteln, unter dem Ihre &amp;lt;code&amp;gt;jsdoc&amp;lt;/code&amp;gt;-Datei zu finden ist.&lt;br /&gt;
Unter Unix (Mac OS X, Linux, FreeBSD ...) lautet der Befehl, den Sie in ein Terminal eingeben müssen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
which jsdoc&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Unter &#039;&#039;&#039;Windows&#039;&#039;&#039; funktioniert dieser Befehl nur in der &#039;&#039;&#039;Git BASH&#039;&#039;&#039;. &lt;br /&gt;
Außerdem müssen Sie unter Windows den Bash-Pfad modifizieren, damit auch Windows etwas damit anfangen kann.&lt;br /&gt;
Bei mir gibt dieser Befehl Folgendes aus:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/c/Users/kowa/AppData/Roaming/npm/jsdoc&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Um &amp;lt;code&amp;gt;jsdoc&amp;lt;/code&amp;gt; in WebStorm aufrufen zu können, müssen Sie in diesem Pfad „&amp;lt;code&amp;gt;/c&amp;lt;/code&amp;gt;“ durch&lt;br /&gt;
„&amp;lt;code&amp;gt;c:&amp;lt;/code&amp;gt;“ und  „&amp;lt;code&amp;gt;jsdoc&amp;lt;/code&amp;gt;“ durch „&amp;lt;code&amp;gt;jsdoc.cmd&amp;lt;/code&amp;gt;“ ersetzen.&lt;br /&gt;
(Mac-User brauchen nichts zu ändern. :-) )&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie nun den neuen WebStorm-Menü-Eintrag:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Settings&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Tools&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;External Tools&amp;lt;/code&amp;gt;&lt;br /&gt;
* Klick auf das Plus-Icon&lt;br /&gt;
** &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;JSDoc&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;Group&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;Documentation&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;Description&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;Generates JavaScript documentation&amp;lt;/code&amp;gt;&lt;br /&gt;
** Hacken bei allen Optionen (&amp;lt;code&amp;gt;Options&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Hacken bei allen Show-in-Optionen (&amp;lt;code&amp;gt;Show i&amp;lt;/code&amp;gt;) mit Ausnahme von „&amp;lt;code&amp;gt;Search results&amp;lt;/code&amp;gt;“&lt;br /&gt;
* &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;c:/Users/kowa/AppData/Roaming/npm/jsdoc.cmd&amp;lt;/code&amp;gt; (hier kommt Ihr zuvor ermittelter Pfad hinein)&lt;br /&gt;
* &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;-c $ProjectFileDir$/conf/jsdoc.json&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;$ProjectFileDir$&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun finden Sie an mehreren Stellen in WebStorm einen neuens Menüpunkt  &amp;lt;code&amp;gt;Documentation&amp;lt;/code&amp;gt; mit einem Unterpunkt &amp;lt;code&amp;gt;JSDoc&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* Hauptmenü : &amp;lt;code&amp;gt;Tools&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Documentation&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;JSDoc&amp;lt;/code&amp;gt;&lt;br /&gt;
* Rechtsklick auf Datei im Projekt-Dateibaum → &amp;lt;code&amp;gt;Documentation&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;JSDoc&amp;lt;/code&amp;gt;&lt;br /&gt;
* Rechtsklick auf Datei im Editor-Tab-Menü → &amp;lt;code&amp;gt;Documentation&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;JSDoc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn Sie auf einen dieser Unterpunkte  „&amp;lt;code&amp;gt;JSDoc&amp;lt;/code&amp;gt;“ klicken, erhalten Sie entweder eine Fehlermeldung ( :-( ) oder es wird eine neue Dokumentation erstellt&lt;br /&gt;
({{dh}}, Sie haben alles richtig gemacht :-) ).&lt;br /&gt;
&lt;br /&gt;
Um sicher zu gehen, können Sie versuchsweise den Ordner „&amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;“ gemeinsam mit seinem gesamten Inhalt löschen und &lt;br /&gt;
&amp;lt;code&amp;gt;JSDoc&amp;lt;/code&amp;gt; nochmals aufrufen.&lt;br /&gt;
&lt;br /&gt;
===Sicherung im Repository===&lt;br /&gt;
&lt;br /&gt;
Bevor Sie weitermachen: Haben Sie Ihre aktuelle Version von &amp;lt;code&amp;gt;Hello World 04&amp;lt;/code&amp;gt; schon im Repository gesichert?&lt;br /&gt;
&lt;br /&gt;
Bevor Sie die Projekt-Dateien per &#039;&#039;Commit&#039;&#039; ins Repository übertragen, sollten Sie überprüfen,&lt;br /&gt;
dass der Ordner „&amp;lt;code&amp;gt;node_modules&amp;lt;/code&amp;gt;“ auf der sogenannten „Ignore List“ steht (und damit nicht&lt;br /&gt;
ins Repository eingespielt wird):&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Files&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;WebStorm&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Settings&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;Preferences&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Ignored Files&amp;lt;/code&amp;gt;&lt;br /&gt;
* Wenn in dieser Liste der Ordner „&amp;lt;code&amp;gt;node_modules&amp;lt;/code&amp;gt;“ nicht aufgeführt wird, fügen Sie ihn mittels des Plus-Icons ein.&lt;br /&gt;
&lt;br /&gt;
Sie sollten allerdings den Ordner „&amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;“ zu Ihrem&lt;br /&gt;
Repository hinzufügen:&lt;br /&gt;
&lt;br /&gt;
* Klick auf „&amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;“ im Dateibaum → &amp;lt;code&amp;gt;Subversion&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Add to VCS&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun können Sie Ihr Projekt committen.&lt;br /&gt;
&lt;br /&gt;
==Automatische Komprimierung von CSS- und Javascript-Dateien==&lt;br /&gt;
&lt;br /&gt;
Nun folgt die letzte Optimierung der Anwendung. Die von Ihnen erstellten CSS- und Javascript-Dateien&lt;br /&gt;
enthalten viele Leerzeichen, Kommentare, „sprechende“ anstelle von kurzen Variablenbezeichnern etc.&lt;br /&gt;
Das ist für Sie und alle anderen Entwickler von Vorteil. Für die Übertragung der Daten zu einem&lt;br /&gt;
Client (Browser) bedeutet das nur unnötiges Datenvolumen. Gerade für mobile Tarife mit Volumenbegrenzung&lt;br /&gt;
sollten so wenig Daten wie möglich übertragen werden.&lt;br /&gt;
&lt;br /&gt;
Glücklicherweise gibt es Tools, die bestehende CSS- oder Javascript-Dateien komprimieren (meist sogar so, dass&lt;br /&gt;
sich die [[Semantik]] der Dateien nicht ändert; aber wie gesagt: Auch andere Programmierer machen hin und wieder Fehler).&lt;br /&gt;
&lt;br /&gt;
Wir verwenden die Node.js-Tools „&amp;lt;code&amp;gt;cssmin&amp;lt;/code&amp;gt;“ für CSS-Dateien (https://www.npmjs.com/package/cssmin) und&lt;br /&gt;
„&amp;lt;code&amp;gt;UglifyJS2&amp;lt;/code&amp;gt;“ für JavaScript-Dateien (https://github.com/mishoo/UglifyJS2). Gesteuert werden diese  “minimizer”&lt;br /&gt;
oder  “minifier” mittels dem bereits installierten &#039;&#039;JavaScript Task Runner&#039;&#039; &amp;lt;code&amp;gt;grunt&amp;lt;/code&amp;gt;“.&lt;br /&gt;
&lt;br /&gt;
Die für das Minimieren mittels Grunt notwendige Pakete wurden ebenfalls bereits installiert: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
npm install grunt grunt-contrib-watch grunt-contrib-cssmin grunt-contrib-uglify --save-dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun müssen die Aufgaben zu Komprimieren der JavaScript- und CSS-Dateien in die Konfigurationsdatei&lt;br /&gt;
eingefügt werden:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;gruntfile.js&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * @author Wolfgang Kowarschick &amp;lt;kowa@hs-augsburg.de&amp;gt;&lt;br /&gt;
 * @see http://gruntjs.com/getting-started&lt;br /&gt;
 *&lt;br /&gt;
 * Created on 2016/09/28.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
module.exports = function(grunt)&lt;br /&gt;
{&lt;br /&gt;
  // Project configuration.&lt;br /&gt;
  grunt.initConfig&lt;br /&gt;
  ({&lt;br /&gt;
    pkg: grunt.file.readJSON(&#039;package.json&#039;),&lt;br /&gt;
&lt;br /&gt;
    cssmin:&lt;br /&gt;
    { options: /* https://github.com/jakubpawlowicz/clean-css */&lt;br /&gt;
      { roundingPrecision:   -1&lt;br /&gt;
      },&lt;br /&gt;
      minimize: &lt;br /&gt;
      { files:&lt;br /&gt;
        { &#039;web/css/main.css&#039;:  [&#039;src/css/main.css&#039;],&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    &lt;br /&gt;
    uglify:&lt;br /&gt;
    { options:&lt;br /&gt;
      { mangle: true&lt;br /&gt;
      },&lt;br /&gt;
      minimize:&lt;br /&gt;
      { files:&lt;br /&gt;
        { &#039;web/js/main.js&#039;: [&#039;src/js/main.js&#039;]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Load the plugin that provides the &amp;quot;uglify&amp;quot; task.&lt;br /&gt;
  grunt.loadNpmTasks(&#039;grunt-contrib-uglify&#039;);&lt;br /&gt;
  grunt.loadNpmTasks(&#039;grunt-contrib-cssmin&#039;);&lt;br /&gt;
&lt;br /&gt;
  // Default task(s).&lt;br /&gt;
  grunt.registerTask(&#039;default&#039;, [&#039;uglify&#039;, &#039;cssmin&#039;]);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion  „&amp;lt;code&amp;gt;grunt.initConfig&amp;lt;/code&amp;gt;“ aufgerufen und es wird ihr ein [[JavaScript-Objekt]] übergeben.&lt;br /&gt;
Im Attribut „&amp;lt;code&amp;gt;pkg&amp;lt;/code&amp;gt;“ wird grund der Inhalt der Datei  „&amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt;“ übergeben, damit Grunt ermitteln kann, welche Pakete verfügbar sind.&lt;br /&gt;
Die beiden anderen Attribute „&amp;lt;code&amp;gt;cssmin&amp;lt;/code&amp;gt;“ und „&amp;lt;code&amp;gt;uglify&amp;lt;/code&amp;gt;“ (deren Namen frei wählbar sind), werden die beiden Minifier konfiguriert.&lt;br /&gt;
&lt;br /&gt;
In beiden Fällen können Optionen angegeben werden, wie {{zB}}, dass CSS-Maß-Angaben nicht gerundet werden sollen (es gibt Designer, die bestehen&lt;br /&gt;
beim Pixelmaß auf vier Nachkommastellen) oder dass geeignete JavaScript-Variablen-Namen „durch die Mangel gedreht“ (&#039;&#039;mangle&#039;&#039;), also durch kürze Namen ersetzt werden sollen.&lt;br /&gt;
Wichtiger ist jedoch die Angabe, welche Dateien überhaupt erstellt werden und was für Sourcedaten dafür verwendet werden solle.&lt;br /&gt;
&lt;br /&gt;
Zu jeder Datei, die erstellt wird, kann man eine ganze Liste von Sourcedateien angeben. Das hat zur Folge, dass alle  diese Sourcedateien nacheinander&lt;br /&gt;
komprimiert und dann in die Zieldatei eingefügt werden. Auch das ist eine Optimierung, um das Laden einer Web-Anwendung zu beschleunigen.&lt;br /&gt;
Eine große Datei wird per HTTP schneller übertragen als viele kleine. Künftig werden wir daher möglichst wenige komprimierte Dateien verwenden&lt;br /&gt;
und möglichst viele nicht-komprimierte JavaScript-Dateien in komprimierter Form nacheinander in nur eine einzige JavaScript-Datei einfügen.&lt;br /&gt;
&lt;br /&gt;
Nach der Initialisierungsfunktion werden noch zwei weitere Funktionen aufgerufen. Mit &amp;lt;code&amp;gt;grunt.loadNpmTasks&amp;lt;/code&amp;gt; &lt;br /&gt;
werden die Grunt-Plugins geladen, die die eigentliche Komprimierung vornehmen. Und mittels &amp;lt;code&amp;gt;grunt.loadNpmTasks&amp;lt;/code&amp;gt; &lt;br /&gt;
wird festgelegt, welche Aufgaben standardmäßig ausgeführt werden, sobald der Befehl „&amp;lt;code&amp;gt;grunt&amp;lt;/code&amp;gt;“ ausgeführt wird.&lt;br /&gt;
&lt;br /&gt;
So, nun sollte alles funktionieren. Öffnen Sie das Web-Storm-Terminal und tippen Sie nacheinander folgende Befehle ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grunt cssmin&lt;br /&gt;
grunt uglify&lt;br /&gt;
grunt&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sie werden feststellen, das jedes mal bestimmte Dateien in den Ordnern „&amp;lt;code&amp;gt;web/css&amp;lt;/code&amp;gt;“ oder/und „&amp;lt;code&amp;gt;web/js&amp;lt;/code&amp;gt;“&lt;br /&gt;
erstellt werden, die mit dem Namensbestandteil „&amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;“ beginnen. Sehen Sie sich die erzeugten Dateien an.&lt;br /&gt;
Sie enthalten denselben Code wie die Original-Dateien, nur in komprimierter (und daher für den Menschen schwer lesbarer) Form.&lt;br /&gt;
&lt;br /&gt;
Als nächstes muss die Datei „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ angepasst werden. Diese lädt noch die unkomprimierten Dateien aus dem &lt;br /&gt;
Sourceverzeichnis. Künftig soll sie die komprimierten Dateien aus dem eigentlichen Web-Ordner laden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;css/main.css&amp;quot;/&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;js/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ab sofort werden nicht mehr die Sourcedateien geladen, sondern die komprimierten, durch die Minifier erstellten Dateien.&lt;br /&gt;
Das heißt aber für uns, dass wir bei jeder Änderung an den Sourcedateien den Befehl „&amp;lt;code&amp;gt;grunt&amp;lt;/code&amp;gt;“&lt;br /&gt;
ausführen müssen, um die Aktualisierungen in die komprimierten Versionen der JavaScript bzw. CSS-Dateien zu übertragen.&lt;br /&gt;
&lt;br /&gt;
Das ist lästig und geht besser.&lt;br /&gt;
&lt;br /&gt;
==Automatische Aktualisierung der komprimierten Dateien==&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe des Node.js-Paketes „&amp;lt;code&amp;gt;grunt-contrib-watch&amp;lt;/code&amp;gt;“ kann man beliebige Dateibäume überwachen,&lt;br /&gt;
ob sich darin bestimmte Dateien ändern. In einem derartigen Fall kann man automatisch andere Grunt Tasks ausführen lassen.&lt;br /&gt;
Das lässt sich ausnutzen, um nach Änderungen einer CSS-Datei oder einer JavaScript-Datei die zugehörige komprimierte&lt;br /&gt;
Datei automatisch neu zu erstellen.&lt;br /&gt;
&lt;br /&gt;
Öffnen Sie das WebStorm-Terminal und laden Sie das besagte Paket:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
npm install grunt-contrib-watch --save-dev&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Erweitern Sie nun die Datei „&amp;lt;code&amp;gt;gruntfile.js&amp;lt;/code&amp;gt;“ um einen Watch-Task:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
watch:&lt;br /&gt;
{ css:&lt;br /&gt;
  { files:   [&#039;src/css/**/*.css&#039;],&lt;br /&gt;
    tasks:   [&#039;cssmin&#039;]&lt;br /&gt;
  },&lt;br /&gt;
  js:&lt;br /&gt;
  { files:   [&#039;src/js/**/*.js&#039;],&lt;br /&gt;
    tasks:   [&#039;uglify&#039;]&lt;br /&gt;
  },&lt;br /&gt;
  web:&lt;br /&gt;
  { files:   [&#039;web/**/*&#039;],&lt;br /&gt;
    options: { livereload: true,&lt;br /&gt;
               spawn:      false&lt;br /&gt;
             }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Vergessen Sie nicht, das Plugin zu laden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
grunt.loadNpmTasks(&#039;grunt-contrib-watch&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Der Watch-Task überwacht drei verschiedene Ordner:&lt;br /&gt;
&lt;br /&gt;
* Wann immer sich eine CSS-Datei im Ordner „&amp;lt;code&amp;gt;src/css&amp;lt;/code&amp;gt;“ oder einem darin enthaltenen Unterordner ändert, wird der Task  „&amp;lt;code&amp;gt;cssmin&amp;lt;/code&amp;gt;“ ausgeführt.&lt;br /&gt;
* Wann immer sich eine JavaScript-Datei im Ordner „&amp;lt;code&amp;gt;src/js&amp;lt;/code&amp;gt;“ oder einem darin enthaltenen Unterordner ändert, wird der Task  „&amp;lt;code&amp;gt;uglify&amp;lt;/code&amp;gt;“ ausgeführt.&lt;br /&gt;
* Wann immer sich irgendeine Datei im Web-Ordner ändert, wird eine &amp;lt;code&amp;gt;livereload&amp;lt;/code&amp;gt;-Nachricht (http://livereload.com/) an einen lokalen Node-Server mit der Portnummer 35729 geschickt. (Keine Angst: Sie brauchen diesen Server nicht zu starten oder zu stoppen.) &lt;br /&gt;
&lt;br /&gt;
Damit kann man Browser anweisen, die HTML-Dateien neu zu laden, wann immer sich etwas ändert. &lt;br /&gt;
Dies erfolgt entweder mit speziellen Browser-Plugins (http://livereload.com/extensions/) oder mit einem kleinen JavaScript-Hack:&lt;br /&gt;
Fügen Sie ans Ende der Datei „&amp;lt;code&amp;gt;main.js&amp;lt;/code&amp;gt;“ folgenden Code ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Enable live reloading for the WebStorm web server.&lt;br /&gt;
if (location.port === &#039;63342&#039;)  // WebStorm server port&lt;br /&gt;
{&lt;br /&gt;
  var l_script = document.createElement(&#039;script&#039;);&lt;br /&gt;
  l_script.src = &#039;http://&#039;+(location.host||&#039;localhost&#039;).split(&#039;:&#039;)[0]+&#039;:35729/livereload.js&#039;;&lt;br /&gt;
  document.body.appendChild(l_script);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Dieser Code sorgt dafür, dass in eine HTML-Datei, die die Datei „&amp;lt;code&amp;gt;main.js&amp;lt;/code&amp;gt;“ einbindet,&lt;br /&gt;
ein zusätzliches &amp;lt;code&amp;gt;script&amp;lt;/code&amp;gt;-Element&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://localhost:35729/livereload.js&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
erstellt und in jede HTML-Datei eingefügt wird, die von einem WebStorm-Test-Server ausgeliefert wird.&lt;br /&gt;
(Der URI kann anstelle des Servernamens „&amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt;“ auf den echten Namen des Entwicklungsrechners enthalten, sofern &lt;br /&gt;
der Entwicklungsrechner einen derartigen Namen hat.)&lt;br /&gt;
&lt;br /&gt;
Unter Port 35729 wird auf dem Entwicklungsrechner von &amp;lt;code&amp;gt;grunt-contrib-watch&amp;lt;/code&amp;gt; der bereits erwähnte Livereload-Server gestartet und&lt;br /&gt;
die JavaScript-Datei „&amp;lt;code&amp;gt;livereload.js&amp;lt;/code&amp;gt;“ zur Verfügung gestellt. Wenn man diese Datei in seine HTML-Datei einbindet,&lt;br /&gt;
aktualisiert sich die HTML-Datei fortan automatisch, sobald &amp;lt;code&amp;gt;grunt-contrib-watch&amp;lt;/code&amp;gt; eine Änderung, wie {{zB}} &lt;br /&gt;
die Aktualisierung einer CSS-Datei, einer JavaScript-Datei, der HTML-Datei selbst oder einer anderen Datei, die von der HTML-Datei eingebunden wird,&lt;br /&gt;
meldet.&lt;br /&gt;
&lt;br /&gt;
Allerdings wäre es falsch, &amp;lt;code&amp;gt;livereload.js&amp;lt;/code&amp;gt; auf einem Live-Server ohne Testumgebung einzubinden. Dort läuft der Livereload-Server überhaupt nicht.&lt;br /&gt;
Daher wird zunächst ermittelt, über welchen Port die aktuelle HTML-Datei von Server ausgeliefert wurde.&lt;br /&gt;
Üblicherweise ist dies 80, 443, 8080, 8888 oder 8443. Andere Ports werden selten verwendet. &lt;br /&gt;
Der Port 63342 wird mit fast absoluter Sicherheit nicht von irgendeinem realen Server verwendet. Daher verwendet ihn WebStorm.&lt;br /&gt;
Und daher kann mit dem Test &amp;lt;code&amp;gt;if (location.port == 63342)&amp;lt;/code&amp;gt; ermittelt werden, ob die aktuelle HTML-Datei von einem WebStorm-Server&lt;br /&gt;
ausgeliefert wurde oder von einem anderen Server. (Die globale JavaScript-Variable „&amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt;“ enthält den URI, über den die HTML-Datei&lt;br /&gt;
vom Browser geladen wurde.)&lt;br /&gt;
&lt;br /&gt;
Nun ist es an der Zeit, den &amp;lt;code&amp;gt;grunt-contrib-watch&amp;lt;/code&amp;gt; zu testen. Öffnen Sie „&amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;“ im Browser&lt;br /&gt;
(Rechtsklick auf &amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Run &#039;index.html&#039;&amp;lt;/code&amp;gt;) und tippen Sie dann &lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grunt watch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
ins WebStorm-Terminal.&lt;br /&gt;
Ändern Sie nun einen Eintrag in der Datei „&amp;lt;code&amp;gt;main.css&amp;lt;/code&amp;gt;“ ({{zB}} &amp;lt;code&amp;gt;font-family: &amp;quot;Comic Sans MS&amp;quot;;&amp;lt;/code&amp;gt; :-) ).&lt;br /&gt;
Wenn Sie diese Änderungen speichern (Strg-S, Apfel-S), sollten Sie zweierlei Reaktionen bemerken.&lt;br /&gt;
Zum einem wird ins Terminal die Meldung&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; File &amp;quot;web/css/main.css&amp;quot; changed.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
geschrieben und zum anderen ändert sich das Layout der HTML-Datei im Browser, da die aktualisierte CSS-Datei&lt;br /&gt;
automatisch vom Browser nachgeladen wurde.&lt;br /&gt;
&lt;br /&gt;
Wenn Sie die Designsünde  „Comic Sans MS“ rückgängig machen, ändert sich die Datei kurz darauf auch im Browser wieder.&lt;br /&gt;
&lt;br /&gt;
Das ist schon ziemlich „cool“, hat aber noch einen Schönheitsfehler: Das WebStorm-Terminal kann nicht anderweitig genutzt werden, solange &lt;br /&gt;
der Grunt-Watcher läuft. Um dieses Problem zu beheben, wird ein WebStorm-Startup-Task definiert, der den Watcher bei jedem&lt;br /&gt;
Programmstart von WebStorm automatisch in einem eigenständigen [[Task]] startet. Der Watcher läuft dann, solange WebStorm geöffnet ist. &lt;br /&gt;
Für seine Ausgaben steht im ein eigenes Ausgabefenster zur Verfügung. Was will man mehr? &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Settings&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Tools&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Startup Tasks&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Klick auf grünes Plus-Icon → &amp;lt;code&amp;gt;Add New Configuration&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Grunt.js&amp;lt;/code&amp;gt;&lt;br /&gt;
** Name: &amp;lt;code&amp;gt;Watch&amp;lt;/code&amp;gt;&lt;br /&gt;
** Gruntfile: &amp;lt;code&amp;gt;.../HelloWorld04/gruntfile.js&amp;lt;/code&amp;gt; (sollte bereits korrekt eingetragen sein)&lt;br /&gt;
** Tasks: &amp;lt;code&amp;gt;watch&amp;lt;/code&amp;gt;&lt;br /&gt;
** Der Node-Interpreter und das Node.js-Paket &amp;lt;code&amp;gt;grunt-cli&amp;lt;/code&amp;gt; sollten ebenfalls bereits korrekt eingetragen sein.&lt;br /&gt;
* &amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt; (Unter „&amp;lt;code&amp;gt;Run configuration&amp;lt;/code&amp;gt;“ sollte jetzt „&amp;lt;code&amp;gt;Watch&amp;lt;/code&amp;gt;“ stehen.)&lt;br /&gt;
* &amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn Sie nun WebStorm neu starten, sollte und der Menüzeile am unteren Fensterrand ein Tabulator mit dem Namen „&amp;lt;code&amp;gt;Run&amp;lt;/code&amp;gt;“ vorhanden sein.&lt;br /&gt;
Wenn Sie das zugehörige Fenster öffnen sollte dort Folgendes stehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grunt watch&lt;br /&gt;
Running &amp;quot;watch&amp;quot; task&lt;br /&gt;
Waiting...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sobald Sie irgendeine Änderung an eine &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;- oder &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;-Datei der Web-App vornehmen, werden alle im Watcher definierten Aktionen&lt;br /&gt;
(automatische Komprimierung bzw. Neuladen des HTML-Datei im Browser) automatisch ausgeführt. Der Watcher läuft solange, bis Sie WebStorm beenden.&lt;br /&gt;
Es erfolgt dabei sogar noch eine Sicherheitsabfrage, on Sie den Prozess „&amp;lt;code&amp;gt;Watch&amp;lt;/code&amp;gt;“ beenden wollen.&lt;br /&gt;
&amp;lt;!-- „&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;“ npm install grunt-contrib-watch --save-dev--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==JSHint==&lt;br /&gt;
&lt;br /&gt;
Ein weiteres sehr interessantes Tool, das den JavaScript-Entwickler unterstützt, ist JSHint (http://jshint.com/).&lt;br /&gt;
JSHint analysiert vorhandenen JavaScript-Code und weist auf Fehler und Strukturprobleme hin.&lt;br /&gt;
&lt;br /&gt;
Installieren Sie zunächst die zugehörigen Node.js-Pakete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
npm install grunt-contrib-jshint jshint-stylish --save-dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend fügen Sie einen JSHit-Task in die Datei „&amp;lt;code&amp;gt;gruntfile.js&amp;lt;/code&amp;gt;“ ein.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jshint:&lt;br /&gt;
{&lt;br /&gt;
  all: [&#039;gruntfile.js&#039;, &#039;src/**/*.js&#039;],&lt;br /&gt;
&lt;br /&gt;
  options:&lt;br /&gt;
  {&lt;br /&gt;
    esversion: 5,&lt;br /&gt;
    eqeqeq:    true,&lt;br /&gt;
    eqnull:    true,&lt;br /&gt;
    browser:   true,&lt;br /&gt;
    reporter:  require(&#039;jshint-stylish&#039;)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nun können alle vom Entwickler erstellten JavaScript-Dateien analysiert werden. Geben Sie dazu im &lt;br /&gt;
WebStorm-Terminal einfach folgenden Befehl ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grunt jshint&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gut ist es, wenn JSHint mit der Meldung &amp;lt;code&amp;gt;v No problems&amp;lt;/code&amp;gt; antwortet.&lt;br /&gt;
Ansonsten sollten Sie in Ihrem Code die von JSHint gemeldeten Probleme beheben.&lt;br /&gt;
&lt;br /&gt;
Machen Sie ruhig mal die Probe auf&#039;s Exempel: Ersetzen Sie „&amp;lt;code&amp;gt;===&amp;lt;/code&amp;gt;“&lt;br /&gt;
in der Datei „&amp;lt;code&amp;gt;main.js&amp;lt;/code&amp;gt;“ durch „&amp;lt;code&amp;gt;==&amp;lt;/code&amp;gt;“ und lassen Sie&lt;br /&gt;
danach JSHint laufen. Dann sollte JSHint Folgendes melden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Expected &#039;===&#039; and instead saw &#039;==&#039;.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit wird ausgedrückt, dass ein nicht-strikter Gleichheitstest verwendet wurde,&lt;br /&gt;
aber ein strikter Gleichheitstest verwendet werden sollte. Der Grund ist, dass&lt;br /&gt;
nicht-strikte Fehlertests manchmal subtile Fehler zur Folge haben, die &lt;br /&gt;
nur sehr schwer zu entdecken sind.&lt;br /&gt;
&lt;br /&gt;
JSHint kennt zahlreiche Optionen, die festlegen, welche Fehler und Probleme gemeldet&lt;br /&gt;
werden sollen und welche nicht: http://jshint.com/docs/options/.&lt;br /&gt;
Hier muss jeder Programmierer seinen eigenen Stil finden.&lt;br /&gt;
&lt;br /&gt;
Folgende Optionen wurden im obigen Beispiel verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&lt;br /&gt;
&amp;lt;/dt&amp;gt;&amp;lt;code&amp;gt;esversion: 5&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
&amp;lt;dd&amp;gt;Des sollen die Regeln von [[EcmaScript 5]] beachtet werden.&amp;lt;/dd&amp;gt;&lt;br /&gt;
&amp;lt;/dt&amp;gt;&amp;lt;code&amp;gt;eqeqeq: true&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
&amp;lt;dd&amp;gt;Es sollt stets ein strikter Gleichheitstest verwendet werden.&amp;lt;/dd&amp;gt;&lt;br /&gt;
&amp;lt;/dt&amp;gt;&amp;lt;code&amp;gt;eqnull&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
&amp;lt;dd&amp;gt;Der nicht-strikte Gleichheitstest &amp;lt;code&amp;gt;... == null&amp;lt;/code&amp;gt; ist allerdings erlaubt. &lt;br /&gt;
&amp;lt;/dd&amp;gt;&lt;br /&gt;
&amp;lt;/dt&amp;gt;&amp;lt;code&amp;gt;browser: true&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
&amp;lt;dd&amp;gt;Globale Variable sollte man eigentlich grundsätzlich nicht verwenden. &lt;br /&gt;
Mit dieser Option werden für die globalen Variablen, die die Browser bereitgestellt werden &lt;br /&gt;
(&amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;console&amp;lt;/code&amp;gt; etc) Ausnahmen definiert.&amp;lt;/dd&amp;gt;&lt;br /&gt;
&amp;lt;/dl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Anmerkung&#039;&#039;&#039;: Wäre der nicht-strikte Gleichheitstest auf „&amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;“ nicht erlaubt, müsste man in viele Fällen&lt;br /&gt;
„&amp;lt;code&amp;gt;... === null || ...=== undefined&amp;lt;/code&amp;gt;“ schreiben. Geben Sie folgende Befehle einfach mal &lt;br /&gt;
in die Konsole Ihres Web-Browsers ein (Firefox: Strg-Shift-K, Opera und Chrome: Strg-Shift-I -&amp;gt; &amp;lt;code&amp;gt;Console&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var a;&lt;br /&gt;
var b = null;&lt;br /&gt;
&lt;br /&gt;
// Strikte Gleichheitstests&lt;br /&gt;
console.log(a === null);                     /* -&amp;gt; false */&lt;br /&gt;
console.log(a === undefined);                /* -&amp;gt; true  */&lt;br /&gt;
console.log(b === null);                     /* -&amp;gt; true  */&lt;br /&gt;
console.log(b === undefined);                /* -&amp;gt; false */&lt;br /&gt;
console.log(a === null || a === undefined);  /* -&amp;gt; true  */&lt;br /&gt;
console.log(b === null || b === undefined);  /* -&amp;gt; true  */&lt;br /&gt;
&lt;br /&gt;
// Nicht-strikte Gleichheitstests&lt;br /&gt;
console.log(a == null);                      /* -&amp;gt; true  */&lt;br /&gt;
console.log(a == undefined);                 /* -&amp;gt; true  */&lt;br /&gt;
console.log(b == null);                      /* -&amp;gt; true  */&lt;br /&gt;
console.log(b == undefined);                 /* -&amp;gt; true  */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Abschluss können Sie entweder einen WebStorm-Menü-Eintrag hinzufügen, um den JSHint jederzeit per Klickibunti starten zu können.&lt;br /&gt;
Oder Sie fügen gleich „&amp;lt;code&amp;gt;jslint&amp;lt;/code&amp;gt;“ in die Watch-Liste ein, damit jede Änderung sofort analysiert und Fehler sofort angezeigt werden:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;gruntfile.js&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
watch:&lt;br /&gt;
{ ...&lt;br /&gt;
  js:&lt;br /&gt;
  { files:   [&#039;src/js/**/*.js&#039;],&lt;br /&gt;
    tasks:   [&#039;uglify&#039;, &#039;jshint&#039;]&lt;br /&gt;
  },&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Allerdings kann JSHint manchmal nerven. :-) Dagegen helfen dann spezielle Kommentare im JavaScript-Code, die &lt;br /&gt;
JSHint anweisen für die Prüfung des nachfolgenden Codes spezielle Optionen zu benutzen, die dann {{iAllg}}&lt;br /&gt;
eine etwas weniger strenge Überprüfung des Codes zur Folge haben (http://jshint.com/docs/).&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li value=&amp;quot;3&amp;quot;&amp;gt; {{Quelle|Kowarschick, W.: Multimedia-Programmierung}}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Kategorie: HTML5-Tutorium: JavaScript: Hello World]][[Kategorie: HTML5-Beispiel]][[Kategorie:Kapitel:Multimedia-Programmierung:Beispiele]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
→ &amp;lt;code&amp;gt;&amp;lt;/code&amp;gt; „&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;“&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rosaresa</name></author>
	</entry>
</feed>