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.

→ Soal: 10 Latihan Modul > 10.2 Dependensi Sirkular