Aufwärmen · Aufgabe 1 von 7
Zum Aufwärmen aus Lektion I3.1. add hat kein export. Was gibt main.js aus?
// math.js
function add(a, b) {
return a + b;
}
// main.js
import {add} from "./math.js";
console.log(add(1, 2));// I3.2 · ca. 34 Min. · Aufbau
Nach dieser Lektion wählen Sie zwischen benannten Exporten und einem Default-Export, importieren beide richtig, benennen mit as um und bauen ein Index-Modul, das andere Module bündelt.
Danach können Sie
Aufwärmen · Aufgabe 1 von 7
// math.js
function add(a, b) {
return a + b;
}
// main.js
import {add} from "./math.js";
console.log(add(1, 2));Vorhersagen · Aufgabe 2 von 7
// math.js
export function add(a, b) {
return a + b;
}
export default function square(x) {
return x * x;
}
// main.js
import add from "./math.js";
console.log(add(3, 4));Üben · Aufgabe 3 von 7
export ____ function greet(name) {
return "Hello, " + name;
}Üben · Aufgabe 4 von 7
Üben · Aufgabe 5 von 7
// math.js
export function add(a, b) {
return a + b;
}
export default function square(x) {
return x * x;
}
// main.js
import * as math from "./math.js";
console.log(Object.keys(math));Denksport · Aufgabe 6 von 7
// math.js
export function add(a, b) {
return a + b;
}
export default function square(x) {
return x * x;
}
// index.js
export * from "./math.js";
// main.js
import square from "./index.js";
console.log(square(5));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
text.js hat zwei benannte Exporte und einen Default-Export. numbers.js hat einen benannten Export. utils.js ist ein Index-Modul: Es reicht die benannten Exporte von text.js weiter, benennt round2 in round um und macht den Default von text.js zu einem benannten slugify. main.js importiert den Default unter eigenem Namen, benennt capitalize um und nimmt utils.js als Namespace-Objekt.
main.js
import makeSlug, {capitalize as cap} from "./text.js";
import * as utils from "./utils.js";
console.log(makeSlug("Named And Default"));
console.log(cap("module"));
console.log(Object.keys(utils));
console.log(utils.round(3.14159), utils.shout("hi"));
text.js
export function capitalize(word) {
return word[0].toUpperCase() + word.slice(1);
}
export function shout(text) {
return text.toUpperCase() + "!";
}
// The one default export of this file.
export default function slugify(title) {
return title.toLowerCase().split(" ").join("-");
}
numbers.js
export function round2(n) {
return Math.round(n * 100) / 100;
}
utils.js
// An index module: it gathers features from other files.
export * from "./text.js"; // every named export, but not the default
export {round2 as round} from "./numbers.js";
export {default as slugify} from "./text.js";
Ausführen mit
node main.jsAusgabe
named-and-default
Module
[ 'capitalize', 'round', 'shout', 'slugify' ]
3.14 HI!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.
Übung 1 von 2
main.js soll formatPrice(cents) als Default-Export exportieren, das aus 1999 "19.99 EUR" macht, und zwei benannte Exporte: CURRENCY ("EUR") und parsePrice(text), das aus "19.99" 1999 macht. Der Startcode exportiert formatPrice benannt, eine Datei, die den Default importiert, bekommt also nichts. Machen Sie es zum Default-Export.
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.
Führen Sie die Tests aus: Das Modul hat keinen Default-Export. Welches Wort macht einen Export zum Default?
Ein Modul hat höchstens einen Default-Export; die anderen beiden bleiben benannt.
export default function formatPrice(cents) { … }
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
export const CURRENCY = "EUR";
export default function formatPrice(cents) {
return (cents / 100).toFixed(2) + " " + CURRENCY;
}
export function parsePrice(text) {
return Math.round(Number(text) * 100);
}
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 const CURRENCY = "EUR";
export function formatPrice(cents) {
return (cents / 100).toFixed(2) + " " + CURRENCY;
}
export function parsePrice(text) {
return Math.round(Number(text) * 100);
}
main.test.js
import {test} from 'node:test';
import assert from 'node:assert/strict';
import * as prices from './main.js';
test('Der Default-Export formatiert Cent', () => {
assert.equal(typeof prices.default, 'function', 'main.js hat keine Default-Export-Funktion');
const got = prices.default(1999);
assert.equal(got, '19.99 EUR', `der Default-Export gab ${got}`);
});
test('CURRENCY und parsePrice sind benannte Exporte', () => {
assert.equal(prices.CURRENCY, 'EUR', `CURRENCY ist ${prices.CURRENCY}`);
assert.equal(prices.parsePrice('19.99'), 1999, 'parsePrice soll aus 19.99 den Wert 1999 machen');
});
test('formatPrice ist der Default, nicht zusätzlich ein benannter Export', () => {
assert.equal('formatPrice' in prices, false, 'formatPrice soll nur als Default exportiert werden');
});
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
text.js und numbers.js sind vorgegeben. main.js ist das Index-Modul einer kleinen Bibliothek: Es soll genau capitalize (benannt, aus text.js), round (round2 aus numbers.js, umbenannt) und slugify (der Default von text.js, als benannter Export) exportieren. Der Startcode nutzt export * zweimal, was round2 unter dem alten Namen weiterreicht und den Default auslässt.
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.
Führen Sie die Tests aus: Der Index exportiert round2 und kein slugify. Welche Form reicht einen Namen weiter und kann ihn umbenennen?
export {round2 as round} from "./numbers.js"; benennt beim Weiterreichen um.
Ein Default wird unter seinem Namen default weitergereicht: export {default as slugify} from "./text.js";
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
export {capitalize} from "./text.js";
export {round2 as round} from "./numbers.js";
export {default as slugify} from "./text.js";
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 * from "./text.js";
export * from "./numbers.js";
main.test.js
import {test} from 'node:test';
import assert from 'node:assert/strict';
import * as lib from './main.js';
test('Der Index exportiert genau capitalize, round und slugify', () => {
const names = Object.keys(lib);
assert.deepEqual(names, ['capitalize', 'round', 'slugify'], `main.js exportiert ${JSON.stringify(names)}`);
});
test('Die weitergereichten Funktionen funktionieren', () => {
assert.equal(lib.capitalize('ada'), 'Ada', 'capitalize soll Ada liefern');
assert.equal(lib.round(3.14159), 3.14, 'round soll auf 2 Nachkommastellen runden');
assert.equal(lib.slugify('Hello World'), 'hello-world', 'slugify soll hello-world liefern');
});
text.js
export function capitalize(word) {
return word[0].toUpperCase() + word.slice(1);
}
export default function slugify(title) {
return title.toLowerCase().split(" ").join("-");
}
numbers.js
export function round2(n) {
return Math.round(n * 100) / 100;
}
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 herunterladenimport add from "./math.js";
console.log(add(1, 2));
Was Node.js ausgibt
SyntaxError: The requested module './math.js' does not provide an export named 'default'Warum, und die Lösung
Ohne Klammern verlangt import den Default-Export, und math.js hat keinen. Importieren Sie den benannten Export in Klammern: import {add} from "./math.js". Oder exportieren Sie add mit export default, wenn es das Hauptangebot des Moduls sein soll.
export default const VAT = 0.19;
console.log("loaded");
Was Node.js ausgibt
SyntaxError: Unexpected token 'const'Warum, und die Lösung
export default nimmt einen Ausdruck, eine Funktion oder eine Klasse, keine Variablendeklaration. Deklarieren Sie zuerst, exportieren Sie dann: const VAT = 0.19; export default VAT;. Oder schreiben Sie den Wert direkt: export default 0.19;. Meist ist ein benannter Export, export const VAT = 0.19;, klarer.
import * as math from "./math.js";
math.add = (a, b) => a - b;
console.log(math.add(5, 2));
Was Node.js ausgibt
TypeError: Cannot assign to read only property 'add' of object '[object Module]'Warum, und die Lösung
Ein Namespace-Objekt ist versiegelt, seine Eigenschaften sind schreibgeschützt: Es ist eine Ansicht der Exporte des Moduls, die nur das Modul selbst ändern kann. Für eine andere Funktion deklarieren Sie Ihre eigene: const subtract = (a, b) => a - b;.
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.