Kunci jawaban 10 Latihan Modul.
10.1 Modul Roads
import {buildGraph} from "./graph.js";
const roads = [
"Alice's House-Bob's House", "Alice's House-Cabin",
"Alice's House-Post Office", "Bob's House-Town Hall",
"Daria's House-Ernie's House", "Daria's House-Town Hall",
"Ernie's House-Grete's House", "Grete's House-Farm",
"Grete's House-Shop", "Marketplace-Farm",
"Marketplace-Post Office", "Marketplace-Shop",
"Marketplace-Town Hall", "Shop-Town Hall"
];
export const roadGraph = buildGraph(
roads.map(r => r.split("-"))
);Kenapa: roads sendiri tidak diekspor, jadi tetap privat untuk modul ini — hanya roadGraph yang jadi antarmuka. buildGraph mau array pasangan, sedangkan roads array string; makanya roads.map(r => r.split("-")) mengubah tiap "A-B" jadi ["A", "B"] di dalam modul ini, sehingga graph.js tetap bersih dan gak bergantung pada format string tertentu.
→ Soal: 10 Latihan Modul > 10.1 Modul Roads
10.2 Dependensi Sirkular
Jawaban: triknya, require memasukkan objek antarmuka modul ke cache sebelum mulai menjalankan kode modul itu (baris let exports = require.cache[name] = {} dieksekusi sebelum kode modul dipanggil). Jadi kalau di tengah pemuatan modul A ada require("B"), dan B ternyata require("A") lagi, saat itu A sudah terdaftar di cache — sehingga antarmuka A yang saat itu (mungkin masih setengah terisi) langsung dikembalikan, bukan memuat A dari awal lagi. Tanpa trik ini, keduanya akan saling memanggil tanpa henti sampai stack habis.
Konsekuensinya: siklus aman selama modul-modulnya tidak langsung memakai isi antarmuka satu sama lain saat masih dimuat (baru dipakai setelah selesai, misalnya di dalam fungsi yang dipanggil belakangan). Konsep di 10 Modul > CommonJS Modules.