Kunci jawaban 21 Latihan Skill-Sharing. Ide solusinya; sesuaikan dengan nama di kode server/client-mu.
21.1 Persistensi ke Disk
Garis besar di server:
import {readFile, writeFile} from "node:fs/promises";
let talks = Object.create(null);
// Muat saat start
try {
talks = JSON.parse(await readFile("./talks.json", "utf8"));
} catch (e) {
// file belum ada — mulai kosong
}
// Panggil ini tiap kali data berubah (PUT/DELETE/komentar)
function simpan() {
writeFile("./talks.json", JSON.stringify(talks));
}Kenapa: saat start, coba baca talks.json dan parse jadi state awal; kalau file belum ada, readFile melempar dan kita abaikan (mulai kosong). Tiap perubahan memanggil simpan() yang menulis seluruh daftar sebagai JSON. Untuk aplikasi kecil, menulis tiap perubahan sederhana dan cukup; untuk yang besar kamu bakal menulis lebih jarang atau pakai database.
→ Soal: 21 Latihan Skill-Sharing > 21.1 Persistensi ke Disk
21.2 Field Komentar Ter-reset
Masalahnya: tiap pembaruan menggambar ulang semua talk dari nol, jadi <input> komentar yang sedang diketik hilang. Solusi: pakai kembali komponen talk yang sudah ada dan hanya syncState, jangan bikin DOM baru.
// di komponen daftar talk
syncState(state) {
let talks = state.talks;
// ... untuk tiap talk:
for (let talk of talks) {
let lama = this.komponenTalk[talk.title];
if (lama) {
lama.syncState(talk); // perbarui yang ada
} else {
let baru = new Talk(talk, this.dispatch);
this.komponenTalk[talk.title] = baru;
this.dom.appendChild(baru.dom);
}
}
// hapus komponen untuk talk yang sudah tak ada lagi
}Kenapa: kunci komponen berdasarkan talk.title (ID unik). Kalau komponen untuk talk itu sudah ada, cukup panggil syncState-nya, yang hanya mengubah bagian yang berbeda (judul/ringkasan/komentar) tanpa menyentuh <input> komentar — sehingga teks yang sedang diketik tetap utuh. Komponen baru hanya dibuat untuk talk yang benar-benar baru, dan komponen untuk talk yang dihapus dibuang. Ini persis pola “sinkronkan yang ada, jangan gambar ulang semua” dari editor piksel.
→ Soal: 21 Latihan Skill-Sharing > 21.2 Field Komentar Ter-reset