<scriptsrc="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 }[]} */lettodos=[];constid=crypto.randomUUID?.()??String(Date.now());Explain: stable id for delete/toggle.
functiondeleteTodo(id){todos=todos.filter((t)=>t.id!==id);render();}Teach filter as "keep todos whose id doesn't match."
asyncfunctionloadTodos(){constresponse=awaitfetch('/api/todos');todos=awaitresponse.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)