templates — foydalanuvchi interfeysi
Tayyor oling. HTML va CSS bu kursning mavzusi emas. Lekin nima uchun shunday qilinganini tushuning.
chat.html — asosiy
<div id="xabarlar"></div> <form id="forma"> <input id="savol" placeholder="Savolingizni yozing..." autocomplete="off"> <button type="submit">Yuborish</button> </form> <script> const forma = document.getElementById('forma'); const xabarlar = document.getElementById('xabarlar'); forma.onsubmit = async (e) => { e.preventDefault(); const savol = document.getElementById('savol').value.trim(); if (!savol) return; qoshish('siz', savol); document.getElementById('savol').value = ''; const kutish = qoshish('bot', 'Javob tayyorlanmoqda...'); try { const javob = await fetch('/api/ask', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({question: savol}) }); if (!javob.ok) throw new Error('Server xatosi: ' + javob.status); const natija = await javob.json(); kutish.remove(); qoshish('bot', natija.answer, natija.sources); } catch (xato) { kutish.remove(); qoshish('xato', 'Javob olinmadi: ' + xato.message); } }; </script>
Uchta muhim tafsilot
1. e.preventDefault()
Busiz forma sahifani qayta yuklaydi va hamma narsa yo'qoladi. Bu eng ko'p unutiladigan qator.
2. Kutish xabari
const kutish = qoshish('bot', 'Javob tayyorlanmoqda...');
LLM javobi 2-5 sekund davom etadi. Bu vaqtda ekranda hech narsa bo'lmasa, foydalanuvchi tugmani qayta bosadi va ikkita so'rov ketadi.
3. try/catch
Server o'chgan bo'lishi mumkin. Busiz foydalanuvchi ekranga qarab qoladi va nima bo'lganini bilmaydi.
Manbalarni ko'rsatish
function qoshish(kim, matn, manbalar) { const div = document.createElement('div'); div.className = 'xabar ' + kim; div.textContent = matn; if (manbalar && manbalar.length) { const m = document.createElement('div'); m.className = 'manbalar'; m.textContent = 'Manba: ' + manbalar .map(s => `${s.title} (${s.similarity})`) .join(', '); div.appendChild(m); } xabarlar.appendChild(div); xabarlar.scrollTop = xabarlar.scrollHeight; return div; }
textContent, innerHTML EMAS.
div.textContent = matn; // XAVFSIZ div.innerHTML = matn; // XAVFLI — XSS
Agar hujjatda <script>alert(1)</script> bo'lsa va siz innerHTML
ishlatsangiz, u bajariladi. textContent esa uni oddiy matn
sifatida ko'rsatadi.
Bu — RAG tizimidagi haqiqiy xavf: kontent tashqaridan keladi (PDF, sayt), siz uni nazorat qilmaysiz.
scrollTop = scrollHeight — yangi xabarga avtomatik siljish.
Kichik tafsilot, lekin bu bo'lmasa foydalanuvchi har safar qo'lda
pastga siljitadi.
Nima uchun React yo'q
Bu 60 qator vanilla JavaScript. React bilan bir xil natija uchun
node_modules, build qadami, va yangi til kerak bo'lardi.
Kurs maqsadi — RAG, frontend emas. Talaba shu kodni to'liq o'qiy oladi va tushunadi. Bu muhimroq.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.