Bevor man tief in Sprache und Standardbibliothek einsteigt, lohnt eine kurze Inventur: Wo läuft JavaScript heute eigentlich, und wie bringt man eine Zeile Code möglichst schnell zur Ausführung? Dieser Artikel zeigt die drei wichtigsten Wege — die Browser-Console, die Node-REPL und das klassische Skript per node datei.js — und ordnet sie didaktisch ein. Dazu kommen die Unterschiede zwischen ES Modules und CommonJS in Node, ein knappes Setup für VS Code und ein Überblick über die wichtigsten Online-Spielwiesen für 2026.

Drei Wege im Überblick

Für den Einstieg gibt es genau drei Umgebungen, die man kennen sollte: die Browser-Console, die interaktive Node-REPL und ein vom Terminal aus gestartetes Skript. Alle drei sprechen denselben Sprachkern, unterscheiden sich aber in Persistenz, verfügbaren APIs und Reibung beim Wechsel zwischen Iterationen.

UmgebungStärkenGrenzen
Browser-ConsoleDOM, sofortiges Feedback, Web-APIsKein Datei-System, kein Modul-Import
Node-REPLTop-Level await, Tab-Completion, FS-ZugriffState geht beim Beenden verloren
node datei.jsReproduzierbar, versionierbar, testbarKein interaktives Probieren

In der Praxis nutzt man alle drei parallel: die Browser-Console für UI- und DOM-Fragen, die REPL als Taschenrechner und Spielwiese, eine Datei für alles, was reproduzierbar bleiben soll.

Die Browser-Console

Die DevTools öffnen sich überall mit F12 oder — auf macOS — mit Cmd+Opt+I. Im Tab Console lässt sich beliebiger JavaScript-Code eintippen; mit Enter wird er ausgewertet, der Rückgabewert direkt darunter angezeigt. Mehrzeilige Eingaben gelingen mit Shift+Enter; ein automatischer Zeilenumbruch wird auch gesetzt, sobald ein Block syntaktisch noch nicht abgeschlossen ist.

JavaScript Browser-Console
const greet = name => `Hallo, ${name}!`;
greet('Welt');
Output
'Hallo, Welt!'

Drei Komfort-Funktionen sind erwähnenswert. Erstens: das Häkchen Preserve log lässt Console-Einträge auch nach einem Reload überleben — praktisch beim Debuggen von Redirects. Zweitens funktioniert in modernen Engines (Chrome, Firefox, Safari) Top-Level await direkt in der Console. Drittens stellt die Console mit $0 bis $4 einen Verlauf der zuletzt im Elements-Panel selektierten Knoten bereit, und $_ enthält stets den letzten Rückgabewert.

JavaScript Top-Level await in der Console
const res = await fetch('/api/health');
const data = await res.json();
data.status;
Output
'ok'

Node.js installieren

Für alles abseits des Browsers braucht es eine lokale Runtime. Empfohlen ist Node.js 22 LTS — die aktive LTS-Linie wird bis Mai 2027 mit Sicherheits-Updates versorgt. Statt Node global per Installer einzurichten, lohnt sich der Umweg über einen Versions-Manager: er erlaubt projektgenaue Wechsel und macht Upgrades schmerzfrei.

Bash Installation via nvm
# nvm installieren (macOS / Linux)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash

# aktuelle LTS holen und aktivieren
nvm install --lts
nvm use --lts

# Verifikation
node -v   # v22.x.x
npm -v

Auf macOS ist alternativ brew install node möglich, unter Windows hat sich fnm oder nvm-windows eingebürgert. Wer Bun oder Deno parallel nutzen möchte, installiert beide problemlos daneben — sie konkurrieren nicht mit Node, sondern erweitern den Werkzeugkasten.

Die Node-REPL

Ein nacktes node ohne Argument startet die Read-Eval-Print-Loop. Sie ist für die Sprache, was python interaktiv für Python ist: ein Skizzenblock zum Probieren von Ausdrücken, ohne eine Datei anzulegen.

Bash Node-REPL Session
$ node
Welcome to Node.js v22.14.0.
Type ".help" for more information.
> const xs = [1, 2, 3];
undefined
> xs.map(n => n * n);
[ 1, 4, 9 ]
> _
[ 1, 4, 9 ]
> .editor
// Mehrzeilig: zum Verlassen Ctrl+D
function square(n) {
    return n * n;
}
square(7);
// Strg+D
49
> .save session.js
> .exit

Wichtige Befehle: .help listet alle Spezialkommandos, .editor öffnet einen Multi-Line-Modus, .save und .load schreiben oder lesen ganze Sessions als Datei, .clear setzt den Kontext zurück. Der Unterstrich _ enthält stets den letzten Rückgabewert — perfekt, um Zwischenergebnisse weiter zu verketten. Tab-Completion funktioniert auf Variablen, Properties und Modul-Namen.

Eine Datei mit Node ausführen

Sobald Code wiederverwendbar werden soll, wandert er in eine Datei. node datei.js reicht für den Einstieg; zwei zusätzliche Flags sind im Alltag Gold wert.

JavaScript hello.js
function greet(name) {
    return `Hallo, ${name}!`;
}

const names = ['Anna', 'Bert', 'Clara'];
for (const n of names) {
    console.log(greet(n));
}
Output
Hallo, Anna!
Hallo, Bert!
Hallo, Clara!

node --watch hello.js (Node 19+, stabil seit Node 20) startet das Skript bei jeder Änderung an der Datei oder einer importierten Datei automatisch neu — ein kompletter Ersatz für nodemon aus dem Werkzeuggürtel. node --inspect-brk hello.js öffnet einen DevTools-kompatiblen Debug-Port; mit dem Aufruf chrome://inspect im Browser lässt sich die Datei dann mit Breakpoints durchsteppen.

Bash nützliche Flags
node hello.js                  # einmalig ausführen
node --watch hello.js          # Auto-Reload bei Änderungen
node --inspect-brk hello.js    # Debug-Port + Breakpoint am Start
node --env-file=.env hello.js  # .env-Datei laden (Node 20.6+)

ES Modules vs. CommonJS

In Node existieren zwei Modul-Systeme nebeneinander. Das ältere CommonJS mit require und module.exports ist seit Node 0.x dabei und für .js-Dateien weiterhin Default, sofern nichts anderes konfiguriert ist. ES Modules mit import und export sind seit Node 12 produktionsreif, seit Node 22 die empfohlene Form für Neuprojekte und in .mjs-Dateien sowie bei "type": "module" in der package.json automatisch aktiv.

JSON package.json (ESM-Default)
{
  "name": "mein-projekt",
  "version": "1.0.0",
  "type": "module"
}

Der gleiche Use-Case einmal in ESM, einmal in CommonJS — die strukturellen Unterschiede sind klar erkennbar:

JavaScript math.mjs (ESM)
// Datei-Endung mjs ODER package.json mit "type": "module"
export function add(a, b) {
    return a + b;
}

export const PI = 3.14159;
JavaScript app.mjs (ESM)
import { add, PI } from './math.mjs';

// Top-Level await ist in ESM erlaubt
const res = await Promise.resolve(add(2, 3));
console.log(res, PI);
Output
5 3.14159
JavaScript math.cjs (CommonJS)
function add(a, b) {
    return a + b;
}

module.exports = { add, PI: 3.14159 };
JavaScript app.cjs (CommonJS)
const { add, PI } = require('./math.cjs');

console.log(add(2, 3), PI);
// Top-Level await ist in CommonJS NICHT erlaubt
Output
5 3.14159
EigenschaftCommonJSES Modules
Importrequire()import / dynamisches import()
Exportmodule.exportsexport / export default
Datei-Endung (Default).cjs oder .js.mjs oder .js mit "type": "module"
Top-Level awaitneinja
__dirname / __filenamedirekt verfügbarüber import.meta.dirname
Datei-Endung im Importoptionalverpflichtend

Quick-Start: das erste Skript

Vom leeren Verzeichnis bis zum laufenden Skript braucht es heute keine Build-Pipeline mehr. Drei Befehle, eine Datei.

Bash Quick-Start
mkdir hallo-js && cd hallo-js
npm init -y
# in package.json: "type": "module" ergänzen
echo 'console.log(`Hallo aus Node ${process.version}`);' > index.js
node index.js
Output
Hallo aus Node v22.14.0

Wer schnell Top-Level await ohne package.json will, nutzt entweder die Datei-Endung .mjs oder das Flag --input-type=module für Inline-Code:

Bash Inline-ESM
node --input-type=module -e "
const res = await fetch('https://api.github.com');
console.log(res.status);
"
Output
200

Online-Spielwiesen

Wenn lokale Installation gerade keine Option ist — etwa beim Pair-Programming, im Workshop oder am fremden Rechner — gibt es 2026 mehrere ausgereifte Browser-Umgebungen.

  • CodePen und JSFiddle sind klassische Frontend-Spielwiesen mit HTML/CSS/JS-Splitscreen, ideal für DOM-Experimente.
  • CodeSandbox und StackBlitz bieten vollwertige Node-Container im Browser; StackBlitz nutzt dafür WebContainers, also ein WASM-Node, das ohne Server auskommt.
  • Replit liefert eine vollwertige IDE inklusive Hosting und Datenbank — das Cloud-Pendant zu VS Code.
  • Der Bun-Playground auf bun.com ist nützlich, um Bun-spezifische APIs ohne lokale Installation zu testen.

Für reine Sprach-Experimente ist die Browser-Console oft schneller als jede Online-IDE. Sobald aber package.json, mehrere Dateien oder Hot-Reload ins Spiel kommen, lohnt der Umstieg auf StackBlitz oder eine lokale Node-Installation.

Editor-Setup

VS Code ist der De-facto-Standard für JavaScript. Out of the box bringt es einen Node-Debugger, IntelliSense für Standardbibliothek und npm-Pakete sowie ein integriertes Terminal mit. Drei Erweiterungen lohnen den Tag-Eins-Aufwand: ESLint für statische Analyse, Prettier für konsistente Formatierung und Error Lens für inline angezeigte Fehler.

JSON .editorconfig
root = true

[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

Eine .editorconfig im Projekt-Root sorgt dafür, dass Tab-Breite und Zeilenende über Editoren und Betriebssysteme hinweg gleich aussehen. Wer Type-Checks ohne TypeScript möchte, schreibt JSDoc-Kommentare und aktiviert in der jsconfig.json die Option "checkJs": true — VS Code zeigt dann die gleichen roten Schlangenlinien wie bei einem TS-Projekt, ohne dass eine .ts-Datei nötig wäre.

JavaScript JSDoc-Type-Hints
/**
 * @param {string} name
 * @param {number} [age]
 * @returns {string}
 */
function describe(name, age) {
    return age ? `${name} (${age})` : name;
}

Häufige Fragen

Welche Node-Version sollte ich nutzen?

Für Production immer die aktuelle LTS-Linie — 2026 ist das Node 22 (Wartung bis Mai 2027). Für Experimente und neue Features lohnt parallel die jeweils aktuelle Major-Linie. Beides parallel installieren ist über nvm in Sekunden erledigt.

Wie wechsle ich zwischen Node-Versionen?

Auf macOS und Linux: nvm. Unter Windows: nvm-windows oder das schnellere, in Rust geschriebene fnm. Mit einer .nvmrc im Projekt-Root und nvm use wird die Version pro Projekt automatisch eingestellt.

Soll ich npm, yarn oder pnpm nutzen?

pnpm ist 2026 die schnellste Wahl: Content-Addressable-Storage spart Plattenplatz und Install-Zeit, der strikte Resolver verhindert Phantom-Dependencies. npm reicht für simple Projekte und ist überall vorinstalliert. yarn 4 bleibt eine ausgereifte Alternative mit Plug'n'Play-Modus.

Was ist der Unterschied zwischen .js und .mjs?

.mjs ist immer ESM, .cjs ist immer CommonJS. .js hängt vom Feld type in der nächstgelegenen package.json ab — fehlt es, behandelt Node die Datei als CommonJS.

Funktioniert TypeScript ohne Build-Tool?

Mit Node 22+ ja: node --experimental-strip-types datei.ts entfernt Typ-Annotationen zur Laufzeit ohne separaten Compile-Schritt. Deno und Bun führen TypeScript ohnehin nativ aus. Für komplexere Projekte bleibt tsc oder tsx aber die robustere Wahl.

Was tun bei „SyntaxError: Cannot use import statement outside a module“?

Node interpretiert die Datei gerade als CommonJS. Zwei schnelle Lösungen: entweder "type": "module" in die package.json eintragen oder die Datei in .mjs umbenennen. Beides aktiviert ESM und akzeptiert import.

Wie debugge ich Node-Code?

node --inspect-brk datei.js startet das Skript mit angehaltenem Debugger. In Chrome chrome://inspect öffnen, das Target erscheint dort automatisch. Alternativ: in VS Code „Run and Debug“ mit aktiviertem Auto-Attach — dann reicht ein normaler node-Aufruf im integrierten Terminal.

Brauche ich für moderne Features einen Bundler?

Im Browser: für größere Apps ja — esbuild, Vite oder Rollup bündeln ESM, behandeln Assets und liefern HMR. Im Browser für ein einzelnes Skript reicht <script type="module"> ohne Build. In Node: nein — die Runtime versteht ESM nativ, ein Bundler wird nur für Deployment-Größen-Optimierung gebraucht.

Weiterführende Ressourcen

Externe Quellen

/ Weiter

Zurück zu Grundlagen

Zur Übersicht