Aufwärmen · Aufgabe 1 von 7
Zum Aufwärmen aus Lektion I3.2. Was gibt main.js aus?
// tools.js
export default function shout(text) {
return text.toUpperCase();
}
// main.js
import loud from "./tools.js";
console.log(loud("hi"));// I3.3 · ca. 34 Min. · Aufbau
Nach dieser Lektion wissen Sie, warum Node.js eine Datei als ES-Modul oder als CommonJS behandelt, und ersetzen require, __dirname und das Laden von JSON durch die ES-Modul-Varianten.
Danach können Sie
Aufwärmen · Aufgabe 1 von 7
// tools.js
export default function shout(text) {
return text.toUpperCase();
}
// main.js
import loud from "./tools.js";
console.log(loud("hi"));Vorhersagen · Aufgabe 2 von 7
// package.json
{"type": "commonjs"}
// main.js
import {platform} from "node:os";
console.log(typeof platform());Üben · Aufgabe 3 von 7
import {readFileSync} from "____:fs";Üben · Aufgabe 4 von 7
Üben · Aufgabe 5 von 7
// main.js
const fs = require("node:fs");
console.log(typeof fs.readFileSync);Denksport · Aufgabe 6 von 7
// app/data.txt
hello
// app/main.js
import {readFileSync} from "node:fs";
console.log(readFileSync("data.txt", "utf8").trim());Anwenden · Aufgabe 7 von 7
Prüfen Sie Ihr Ergebnis anhand dieser Liste
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
main.js ist ein ES-Modul, weil die package.json des Projekts "type": "module" sagt. Es importiert eingebaute Module mit node:, eine CommonJS-Datei, deren module.exports als Default-Export ankommt, und eine JSON-Datei mit einem Import-Attribut. Es liest notes.txt neben sich über import.meta.dirname und lädt node:os erst bei Bedarf, mit einem dynamischen Import.
main.js
import {readFileSync} from "node:fs";
import {join} from "node:path";
import legacy from "./legacy.cjs"; // a CommonJS file: its module.exports
import settings from "./settings.json" with {type: "json"};
console.log(typeof require, typeof __dirname); // CommonJS only
console.log(import.meta.filename.endsWith("main.js"));
// A file next to this module, wherever node is started from:
const notes = readFileSync(join(import.meta.dirname, "notes.txt"), "utf8");
console.log(notes.trim());
console.log(legacy.greet("Ada"));
console.log(settings.theme);
const os = await import("node:os"); // a dynamic import
console.log(typeof os.platform());
legacy.cjs
module.exports = {
greet(name) {
return "Hello, " + name;
}
};
settings.json
{"theme": "dark"}
notes.txt
Remember: import, not require.
Ausführen mit
node main.jsAusgabe
undefined undefined
true
Remember: import, not require.
Hello, Ada
dark
stringÜbung 1 von 2
loadWords() soll words.txt lesen, die neben main.js liegt, und ihre Zeilen als Array zurückgeben. Der Startcode baut den Pfad mit __dirname, das es in einem ES-Modul nicht gibt, der Aufruf wirft also. Nutzen Sie stattdessen import.meta.dirname.
Diese Übung braucht Node.js auf Ihrem Computer (die Browser-Version kann sie nicht ausführen). Dateien und Befehle stehen unten.
Führen Sie die Tests aus: ReferenceError: __dirname is not defined in ES module scope. Was ersetzt es?
import.meta.dirname ist der Ordner des aktuellen Moduls.
join(import.meta.dirname, "words.txt")
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
import {readFileSync} from "node:fs";
import {join} from "node:path";
export function loadWords() {
const text = readFileSync(join(import.meta.dirname, "words.txt"), "utf8");
return text.trim().split("\n");
}
Installieren Sie ECMAScript 2026 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.
main.js
import {readFileSync} from "node:fs";
import {join} from "node:path";
export function loadWords() {
const text = readFileSync(join(__dirname, "words.txt"), "utf8");
return text.trim().split("\n");
}
main.test.js
import {test} from 'node:test';
import assert from 'node:assert/strict';
import {loadWords} from './main.js';
test('loadWords liest die drei Wörter', () => {
const words = loadWords();
assert.deepEqual(words, ['apple', 'banana', 'cherry'], `loadWords gab ${JSON.stringify(words)}`);
});
words.txt
apple
banana
cherry
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.jsPrüfungen ausführen (learnrun.js muss im selben Ordner liegen):
node --testlearnrun.js herunterladenÜbung 2 von 2
legacy.cjs ist eine alte CommonJS-Datei mit toCelsius und toFahrenheit auf module.exports. convert(value, to) in main.js soll sie nutzen: to "C" rechnet von Fahrenheit um, to "F" von Celsius. Der Startcode ruft require in der Funktion auf, das ein ES-Modul nicht hat. Importieren Sie stattdessen legacy.cjs oben in der Datei.
Diese Übung braucht Node.js auf Ihrem Computer (die Browser-Version kann sie nicht ausführen). Dateien und Befehle stehen unten.
Führen Sie die Tests aus: require is not defined in ES module scope. Wie lädt ein ES-Modul eine andere Datei?
Das module.exports einer CommonJS-Datei kommt als Default-Export an.
import temperature from "./legacy.cjs"; oben in main.js
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
import temperature from "./legacy.cjs";
export function convert(value, to) {
return to === "C" ? temperature.toCelsius(value) : temperature.toFahrenheit(value);
}
Installieren Sie ECMAScript 2026 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.
main.js
export function convert(value, to) {
const temperature = require("./legacy.cjs");
return to === "C" ? temperature.toCelsius(value) : temperature.toFahrenheit(value);
}
main.test.js
import {test} from 'node:test';
import assert from 'node:assert/strict';
import {convert} from './main.js';
test('212 Fahrenheit sind 100 Celsius', () => {
const got = convert(212, 'C');
assert.equal(got, 100, `convert(212, 'C') gab ${got}`);
});
test('20 Celsius sind 68 Fahrenheit', () => {
const got = convert(20, 'F');
assert.equal(got, 68, `convert(20, 'F') gab ${got}`);
});
legacy.cjs
module.exports = {
toCelsius: (f) => Math.round(((f - 32) * 5) / 9),
toFahrenheit: (c) => Math.round((c * 9) / 5 + 32)
};
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.jsPrüfungen ausführen (learnrun.js muss im selben Ordner liegen):
node --testlearnrun.js herunterladenconst {readFileSync} = require("node:fs");
console.log(readFileSync("main.js", "utf8").length > 0);
Was Node.js ausgibt
ReferenceError: require is not defined in ES module scope, you can use import insteadWarum, und die Lösung
Eine .js-Datei in einem Paket mit "type": "module" ist ein ES-Modul, in dem es require nicht gibt. Schreiben Sie oben import {readFileSync} from "node:fs";. Nur wenn Sie wirklich CommonJS brauchen, nennen Sie die Datei .cjs.
import settings from "./settings.json";
console.log(settings.theme);
Was Node.js ausgibt
TypeError [ERR_IMPORT_ATTRIBUTE_MISSING]Warum, und die Lösung
Node.js importiert JSON nur, wenn der Import sagt, was er erwartet, damit eine Datei nie versehentlich als Code läuft. Ergänzen Sie das Import-Attribut: import settings from "./settings.json" with {type: "json"};. Oder lesen Sie die Datei mit readFileSync und JSON.parse.
import {greet} from "./legacy.cjs";
console.log(greet("Ada"));
Was Node.js ausgibt
SyntaxError: Named export 'greet' not found. The requested module './legacy.cjs' is a CommonJS module, which may not support all module.exports as named exports.Warum, und die Lösung
Node.js kann benannte Exporte nur aus manchem CommonJS-Code erraten, und hier gelingt es nicht. Der Default-Export funktioniert immer, weil er module.exports selbst ist: import legacy from "./legacy.cjs"; dann legacy.greet("Ada"), oder const {greet} = legacy;.
JavaScript im Browser: die eigene Engine Ihres Browsers in einem abgeschotteten Worker. Syntaxfehler findet acorn 8.18.0, MIT. Lizenz und Quellcode
5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.
Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.