Zum Inhalt springen
aviral gupta

// B1.2 · ca. 32 Min. · Einstieg

Der Befehl node, die REPL und --watch

Nach dieser Lektion führen Sie JavaScript mit node als Datei, als String oder in der REPL aus, wissen, welche Node.js-Version es ausführt, und starten Ihr Programm bei jedem Speichern neu.

Lektion 2 von 5 in B1 Node ausführen und Projektgrundlagen

Danach können Sie

  • Code mit node main.js, node -e und node -p ausführen und die Version mit node --version oder process.version ablesen
  • Die REPL nutzen: Werte ohne console.log sehen, _ weiterverwenden, mehrzeiligen Code eingeben und sie wieder verlassen
  • Ein Programm mit --watch bei jedem Speichern neu starten und vorhersagen, was --watch-path beobachtet
  1. Aufwärmen · Aufgabe 1 von 7

    Aufwärmen: Welche dieser Befehle öffnen die REPL, in der Sie JavaScript Zeile für Zeile eingeben? Wählen Sie alle zutreffenden.

    Wählen Sie alle zutreffenden aus.

  2. Vorhersagen · Aufgabe 2 von 7

    Sagen Sie es vorher, bevor Sie weiterlesen. Sie starten node und tippen diese zwei Zeilen, jeweils mit Enter. Was gibt die REPL nach der zweiten Zeile aus?

    6 * 7
    _ + 1
  3. Üben · Aufgabe 3 von 7

    Setzen Sie das Flag ein, damit der Befehl 1024 ausgibt, den Wert des Ausdrucks, ganz ohne console.log.

    node ____ "2 ** 10"
    node "2 ** 10"
  4. Üben · Aufgabe 4 von 7

    Ordnen Sie jedem Befehl zu, was er tut.

  5. Üben · Aufgabe 5 von 7

    Sie tippen in der REPL die erste Zeile und drücken Enter. Die REPL wartet auf mehr, also tippen Sie die anderen beiden. Was gibt sie aus?

    [1, 2, 3].forEach((n) => {
      console.log(n * 10)
    })
  6. Denksport · Aufgabe 6 von 7

    Knobelaufgabe. main.js importiert ./greet.js, das nicht in src liegt. Sie starten den Befehl unten, speichern eine Änderung an greet.js und dann eine neue Datei src/notes.txt. Wie oft startet main.js neu?

    node --watch-path=src main.js
  7. Anwenden · Aufgabe 7 von 7

    Mini-Aufgabe. Legen Sie in einem neuen Ordner eine package.json mit "type": "module" und einem "dev"-Skript an, das node --watch main.js ausführt, dazu eine main.js, die eine Zeile ausgibt. Starten Sie sie mit node --run dev, ändern Sie die Zeile in main.js und speichern Sie. Prüfen Sie, dass das Terminal Restarting meldet und die neue Zeile zeigt. Führen Sie dann in einem zweiten Terminal node --version aus und notieren Sie Ihre Version.

    Prüfen Sie Ihr Ergebnis anhand dieser Liste

Selbst programmieren

Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.

Ausgearbeitetes Beispiel

Welches Node.js läuft hier?

Prüfen Sie vor jeder Fehlersuche, welches Node.js Ihren Code ausführt. Dieses Programm fragt den laufenden Prozess. process.version ist derselbe String, den node --version ausgibt, process.versions listet die Versionen von Node.js und seinen eingebauten Teilen, etwa der JavaScript-Engine V8, und process.release.lts nennt die Linie mit Langzeitunterstützung (LTS). Die Ausgabe unten stammt von Node.js 24.21.0; Ihr Rechner zeigt seine eigene Version.

main.js

// Which Node.js is running this file? The process object knows.
console.log("version:", process.version);
console.log("without the v:", process.versions.node);
console.log("V8 engine:", process.versions.v8);
console.log("LTS name:", process.release.lts);

Ausführen mit

node main.js

Ausgabe

version: v24.21.0
without the v: 24.21.0
V8 engine: 13.6.233.17-node.53
LTS name: Krypton
  • process.version beginnt mit einem v; process.versions.node ist dieselbe Version ohne das v.
  • process.versions.v8 ist die Version von V8, der JavaScript-Engine, die Ihren Code ausführt.
  • Krypton ist der Name der LTS-Linie von Node.js 24. Bei einem Current-Release, das kein LTS ist, ist process.release.lts undefined.
  • node --version im selben Terminal gibt dasselbe v24.21.0 aus: Es ist dasselbe node.

Übungen

Übung 1 von 2

Von der REPL in eine Datei

Diese drei Zeilen stammen aus einer REPL-Sitzung, in der sie 42, dann 50 und dann 'NODE' ausgaben. Als main.js gespeichert, brechen sie mit ReferenceError: _ is not defined ab, und ohnehin gibt eine Datei nichts aus, was sie nicht ausgeben soll. Schreiben Sie main.js so um, dass node main.js 42, 50 und NODE ausgibt, je in einer Zeile. Behalten Sie die Rechnungen: Speichern Sie 6 * 7 in einer Variablen, statt sich auf _ zu verlassen.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser den JavaScript-Runner herunter (bis zu 0.1 MB) und speichert ihn im Cache. Ihr Code läuft in der eigenen Engine Ihres Browsers und bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    In einer Datei erscheint ein Wert nur, wenn Sie ihn an console.log übergeben.

  2. Hinweis 2

    _ gibt es nur in der REPL. Geben Sie dem ersten Ergebnis einen Namen: const answer = 6 * 7;

  3. Hinweis 3

    console.log("node".toUpperCase()) gibt NODE ohne Anführungszeichen aus.

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

const answer = 6 * 7;
console.log(answer);
console.log(answer + 8);
console.log("node".toUpperCase());
Auf dem eigenen Computer ausführen

Installieren Sie Node.js 24 LTS oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.js

// Copied from a REPL session. It printed 42, then 50, then 'NODE'.
6 * 7;
_ + 8;
"node".toUpperCase();

main.test.js

import {test} from 'node:test';
import assert from 'node:assert/strict';
import {runMain} from './learnrun.js';

test('läuft ohne Fehler', async () => {
  await runMain();
});

test('gibt 42, 50 und NODE aus, je in einer Zeile', async () => {
  const got = (await runMain()).trimEnd().split('\n');
  assert.deepEqual(got, ['42', '50', 'NODE'], `das Programm gab ${JSON.stringify(got)} aus`);
});

package.json

{
  "type": "module"
}

package.json sagt Node.js, dass die .js-Dateien Module sind; lassen Sie die Datei im Ordner.

Programm ausführen:

node main.js

Prüfungen ausführen (learnrun.js muss im selben Ordner liegen):

node --test
learnrun.js herunterladen

Übung 2 von 2

Die Hauptversion

Schreiben Sie major(version): Die Funktion bekommt einen Versions-String wie "v24.21.0", wie process.version ihn liefert, und gibt die Hauptversion als Zahl zurück: 24. Sie muss mit jeder Stellenzahl funktionieren, etwa "v8.17.0" und "v100.0.0". Die letzte Zeile von main.js gibt damit schon die laufende Version aus, zum Beispiel Node.js v24.21.0 major 24. Starten Sie es mit node main.js und prüfen Sie die Tests mit node --test.

Diese Übung braucht Node.js auf Ihrem Computer (die Browser-Version kann sie nicht ausführen). Dateien und Befehle stehen unten.

Hinweise
  1. Hinweis 1

    Entfernen Sie zuerst das führende v: "v24.21.0".slice(1) ist "24.21.0".

  2. Hinweis 2

    split(".") zerlegt den Rest in ["24", "21", "0"]; das erste Element ist die Hauptversion.

  3. Hinweis 3

    Die Teile sind Strings. Number("24") macht daraus die Zahl 24.

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

// Returns the major version as a number: "v24.21.0" -> 24.
export function major(version) {
  return Number(version.slice(1).split(".")[0]);
}

console.log("Node.js", process.version, "major", major(process.version));
Auf dem eigenen Computer ausführen

Installieren Sie Node.js 24 LTS oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.js

// Returns the major version as a number: "v24.21.0" -> 24.
export function major(version) {
  return 0;
}

console.log("Node.js", process.version, "major", major(process.version));

main.test.js

import {test} from 'node:test';
import assert from 'node:assert/strict';
import {runMain} from './learnrun.js';
import {major} from './main.js';

test('major("v24.21.0") ist 24', () => {
  assert.equal(major('v24.21.0'), 24, `major("v24.21.0") lieferte ${JSON.stringify(major('v24.21.0'))}`);
});

test('funktioniert mit ein- und dreistelligen Hauptversionen', () => {
  assert.equal(major('v8.17.0'), 8, `major("v8.17.0") lieferte ${JSON.stringify(major('v8.17.0'))}`);
  assert.equal(major('v100.0.0'), 100, `major("v100.0.0") lieferte ${JSON.stringify(major('v100.0.0'))}`);
});

test('gibt die Version des Node.js aus, das es ausführt', async () => {
  const expected = `Node.js ${process.version} major ${process.versions.node.split('.')[0]}`;
  const got = (await runMain()).trimEnd();
  assert.equal(got, expected, `das Programm gab ${JSON.stringify(got)} aus, erwartet: ${JSON.stringify(expected)}`);
});

package.json

{
  "type": "module"
}

package.json sagt Node.js, dass die .js-Dateien Module sind; lassen Sie die Datei im Ordner.

Programm ausführen:

node main.js

Prüfungen ausführen (learnrun.js muss im selben Ordner liegen):

node --test
learnrun.js herunterladen

Häufige Fehler

Eine REPL-Sitzung in eine Datei kopieren

> 6 * 7
42

Was Node.js ausgibt

SyntaxError: Unexpected token '>'

Warum, und die Lösung

Das > am Zeilenanfang ist der Prompt der REPL, die Zeile darunter ihre Antwort: Beides ist kein JavaScript. Kopieren Sie nur den Code, den Sie eingetippt haben, und übergeben Sie jeden Wert, den Sie sehen wollen, an console.log: console.log(6 * 7). Weil es ein SyntaxError ist, läuft keine einzige Zeile der Datei.

_ in einer Datei verwenden

const total = 6 * 7;
console.log(_ + 1);

Was Node.js ausgibt

ReferenceError: _ is not defined

Warum, und die Lösung

_ ist eine Bequemlichkeit der REPL, die darin das letzte Ergebnis speichert. Eine Datei hat keine solche Variable, dort ist _ ein unbekannter Name. Geben Sie Ihren Werten stattdessen Namen: console.log(total + 1).

fs ohne Import verwenden

console.log(fs.existsSync("main.js"));

Was Node.js ausgibt

ReferenceError: fs is not defined

Warum, und die Lösung

Die REPL lädt eingebaute Module wie fs, sobald Sie ihren Namen tippen, deshalb funktioniert die Zeile dort. Eine Datei bekommt diese Hilfe nicht: Sie importiert, was sie braucht. Schreiben Sie import {existsSync} from "node:fs"; an den Anfang und rufen Sie existsSync("main.js") auf.

JavaScript im Browser: die eigene Engine Ihres Browsers in einem abgeschotteten Worker. Syntaxfehler findet acorn 8.18.0, MIT. Lizenz und Quellcode

Abschlussquiz

5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.

Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.

Problem melden

Etwas ist falsch oder unklar? Beschreiben Sie es kurz, dann wird es geprüft und korrigiert.

#

Mindestens 20 Zeichen.

Nur, wenn Sie eine Antwort wünschen.

Kernideen

Eine Datei, ein String oder gar nichts

node main.js führt eine Datei aus. node -e "code" führt einen String mit JavaScript aus und gibt nur aus, was der Code selbst loggt; node -p "code" gibt zusätzlich das Ergebnis aus, node -p "6 * 7" also 42. Ohne Datei und ohne Flags öffnet node die REPL. node --version gibt die Version aus, die der Befehl node startet, etwa v24.21.0; im Programm enthält process.version denselben String und process.versions.node ihn ohne das v. Ein längerer Befehl kann als "dev"-Skript in package.json stehen, und node --run dev führt ihn aus. Setzen Sie Code in doppelte Anführungszeichen: cmd.exe unter Windows versteht keine einfachen.

Die REPL liest, wertet aus, gibt aus und wiederholt

Die REPL liest eine Zeile, wertet sie aus, gibt das Ergebnis aus und wartet auf die nächste. Für einen Wert brauchen Sie kein console.log: 6 * 7 gibt 42 aus, und const price = 4 gibt undefined aus, weil eine Deklaration keinen Wert hat. _ enthält das letzte Ergebnis, _error den letzten Fehler. Eine unfertige Zeile wie function double(n) { lässt die REPL auf weitere Zeilen warten. Eingebaute Module wie fs lädt sie, sobald Sie ihren Namen verwenden. .help listet die Punktbefehle, .exit beendet die Sitzung; ebenso Strg+D oder zweimal Strg+C in einer leeren Zeile. Einmal Strg+C bricht nur die aktuelle Eingabe ab. In einer Datei gibt es all diese Hilfen nicht.

--watch startet bei jedem Speichern neu

node --watch main.js führt main.js aus, meldet Completed running 'main.js'. Waiting for file changes before restarting... und läuft weiter. Speichern Sie main.js oder ein Modul, das es importiert, meldet es Restarting 'main.js' und führt das Programm von vorn aus. Eine Datei, die kein Modul importiert, etwa notes.txt, wird nicht beobachtet. --watch-path=src beobachtet stattdessen den Ordner src, und importierte Module dann nicht mehr, auch nicht zusammen mit --watch. Stürzt die neue Version ab, zeigt der Watch-Modus den Fehler und wartet auf das nächste Speichern. --watch braucht eine Datei: Mit -e, -p, --check oder der REPL lässt es sich nicht kombinieren. Die Doku führt den Watch-Modus seit v22.0.0 als stabil.

Quellen

Zuletzt geprüft am 30. September 2026