<script src="app.js" defer></script>| Attribute | Effect |
|---|---|
| defer | Run after HTML parsed, order preserved |
| type="module" | ES modules, strict mode, defer implied |
/** @type {{ id: string, text: string, done: boolean }[]} */
let todos = [];const id = crypto.randomUUID?.() ?? String(Date.now());Explain: stable id for delete/toggle.
function deleteTodo(id) {
todos = todos.filter((t) => t.id !== id);
render();
}Teach filter as "keep todos whose id doesn't match."
async function loadTodos() {
const response = await fetch('/api/todos');
todos = await response.json();
render();
}Order: fetch returns Promise → await pauses function until data → json parses body.
| Tool | Use |
|---|---|
| console.log | See values |
| breakpoint | Pause on line in Sources tab |
| Network tab | See fetch requests (apis skill) |
- User asks save across refresh
- User mentions database, login, server
- fetch errors (404, CORS)