Tracy & AJAX – udělejme Tracy stejnou pro AJAXové weby jako pro neAJAXové
- jahudka
- Člen | 71
Ahoj,
začal jsem trochu experimentovat s ohnutím Tracy tak, aby debug bar i bluescreen fungovaly i na AJAXovým webu, a narážím na celkem dost věcí..
Goals:
- Debug bar by se měl umět obnovit po AJAXovém requestu tak, aby chování bylo stejné, jako kdyby request nebyl AJAXový
- Když AJAXový request selže, bluescreen by se měl zobrazit úplně stejně jako kdyby request nebyl AJAXový
- Docela fajn by bylo, kdyby šlo třeba napsat si panel do Debugger baru, který umí vzít momentálně zobrazený bluescreen a odeslat ho přes nějaké API do issue trackeru – Tracy sama to samozřejmě umět nemá, ale mohla by to umožnit (možnost získat na client-side zdrojový kód celého bluescreenu, možnost dostat z toho typ a popis chyby + stack trace, možnost získat hash chyby jako používají exception dumpy v Loggeru aby se to dalo v issue trackeru párovat s existujícími issues atd)
- Mělo by to být samozřejmě napsané tak, že to nemá žádné závislosti mimo Tracy – mělo by to fungovat s jakýmkoliv client-side i backend frameworkem s minimální konfigurací
Poznámky:
- Posílat Debugger bar nějak zakódovanejma HTTP hlavičkama jako to dělá FireLogger moc nejde, naráží to na limit velikosti HTTP hlaviček minimálně v Chrome, takže spíš by se to mělo při requestu třeba uložit do session a dotáhnout bokem nějakým AJAXem
- Na server side by mělo stačit zapnout tomuhle podporu a maximálně jedním dvěma řádky zařídit zpracování těch dodatečných AJAX requestů
- Na client-side by pokud možno mělo být potřeba minimum kódu pro
integraci s čímkoliv, takže maximálně třeba jedna metoda typu
Tracy.Debug.refreshBar()
a jedna něco jakoTracy.Debug.loadBluescreen()
pro ty základní věci, plus třeba nějakýTracy.Bluescreen.getInfo()
, který by vracelo objekt ve stylu{"class": "App\CustomException", "code": 34, "message": "Something bad happened", "hash": "af78d3ced9" }
, případně včetně kompletního HTML celého bluescreenu, aby se dal přiložit jako blob upload
Na co narážím:
- Hlavně na existující JS kód Tracy – není ho úplně málo a do detailu mu nerozumím, ale vidím spoustu potenciálních problémů, speciálně s event listenerama – Tracy si celkem liberálně přivazuje listenery na různé DOM elementy a není úplně jednoduché obnovovat bar tak, aby se něco nenavázalo dvakrát atd.
- Různé duplikátní volání – třeba právě Debugger bar si vytváří
novou instanci objektu Panel při každém volání
Tracy.Debug.getPanel()
, místo aby se někde existující instance držely; Dumper se při zobrazení bluescreenu a baru zároveň taky incializuje víckrát (i když tam je myslím nějak oddělenej kontext, jak jsem psal, úplně tomu ještě nerozumím) - Potřeba definovat to samé chování v PHP i v JS, jak v baru tak v bluescreenu – rendering HTML pro normální requesty se většinově děje v PHP, ale když to chci natáhnout AJAXem, opakuju spoustu těch věcí znova v JS
Jak bych na to šel:
- Především bych některé části kódu přesunul z PHP do JS – třeba
vytváření Baru – místo generování panelů a ikonek na straně PHP by
šlo předat do JS rovnou to pole
$panels
; pak by logika obnovování Baru po AJAX requestu byla vlastně úplně stejná jako jeho úvodní vytvoření, což je plus - Nějak bych „učesal“ ten JS kód, aby tam nevznikaly ty problémy viz
výše (btw by zároveň bylo fajn možná pro takový ty „public“ věci
typu
Tracy.Debug.refreshBar()
aTracy.Debug.loadBluescreen()
mít spíš zkratku na tom top-level objektu Tracy – zjednoduší to integrační kód – místowindow.Tracy && Tracy.Debug && Tracy.Debug.refreshBar()
bude stačitwindow.Tracy && Tracy.refreshBar()
)
Ale:
Jednak některým částem toho kódu moc nerozumím, a jednak mám dojem, že jsem kdysi zaznamenal, že na něčem podobném tu a onde už někdo pracuje – tak si říkám, nechcem to nějak zkonsolidovat a spojit síly? :-)
A pozor:
Když se to udělá šikovně, může to teoreticky znamenat podporu Content Security Policy v baru i v bluescreenu ^_^
Editoval jahudka (7. 3. 2016 20:26)
- enumag
- Člen | 2118
Pokusů o něco podobného zde bylo už několik. Myslím, že poslední je tenhle pull request od @DavidGrudl takže doporučuji zeptat se tam. Že by to mohlo znamenat podporu CSP se již také ví.
Editoval enumag (7. 3. 2016 21:11)
- David Grudl
- Nette Core | 8218
Rozpracoval jsem to už před pár lety, ale stále to nemám dokončené. Ale stále v tom vidím důležitou feature, pokud se toho nikdo neujme, zkusil bych to koncem roku implementovat.
- David Matějka
- Moderator | 6445
A s timhle i souvisi napad, co jsem dostal pred nejakou dobou – aby to fungovalo i pro CLI. Jak? V browseru by sis otevrel specialni adresu (bud s nejakym _GET parametrem, ktery by odchytila tracy, pripadne explicitni samostatny soubor). A CLI by pak nejak posilalo debug bar/bluescreen do toho prohlizece. Bud jen zapisovanim do souboru a ten web by to cyklicky kontroloval, nebo treba pres sockety.
- jahudka
- Člen | 71
@DavidGrudl No já se do toho klidně pustím – ale pravděpodobně to skončí tak, že překopám drtivou většinu stávajícího JS kódu a asi i docela dost těch phtml šablon, tak jenom chci nějak ověřit, že to je ok :-)
@DavidMatějka To je geniální nápad!! Určitě nad tím zapřemejšlím. Dávalo by asi nejvíc smysl udělat konzolovou „server“ aplikaci, která vystaví nějakej malej HTTP frontend a websocket endpoint přes kterej se ten frontend bude aktualizovat, plus nějakej další socket na kterej může odkládat data ta samotná CLI aplikace kterou debuguješ. Asi by se to líp psalo v NodeJS než v PHP, ale to už bychom do toho zanášeli moc externích závislostí..
- David Grudl
- Nette Core | 8218
Tam uz existuje funkci demo, prekopavat temer nic nebylo potreba, ale jak jsem psal, PR dost jiste neni aktualni, klidne se do toho pust jinou cestou.
- jahudka
- Člen | 71
@DavidGrudl Viz vyse, jak jsem psal – Tracy JS kod je psanej tak, ze i kdyz se do toho da nejak zadratovat podpora pro AJAX, snadno povede k duplikatni inicializaci veci tj. k vicenasobnymu navazovani event listeneru a podobnejm failum.. spravny a cisty by bylo zacit from scratch a jen tu a tam si neco vypujcit..
- Jan Tvrdík
- Nette guru | 2595
K čemu přesně je dobrý Dumper::LIVE?
- Výrazně to zmenšuje to velikost dumpů a tím v důsledku zrychluje dumpování.
- Výrazně to snižuje náročnost renderování dumpů pro prohlížeč.
Není to učeno pro koncové uživatele, na to by bylo potřeba mergnout https://github.com/…racy/pull/61 nebo https://github.com/…racy/pull/62.
- jahudka
- Člen | 71
@JanTvrdík ok, dík za vysvětlení, to dává smysl.
Btw, pustil jsem se do toho, viz https://github.com/…ree/ajax-bar
Funguje:
- AJAX reload debug baru pomocí
Tracy.refreshBar()
- načtení bluescreenu po selhaném AJAX requestu
pomocí
Tracy.loadBluescreen()
Zatím není:
- podpora CLI (ale bude brzo a snadno!! wink)
Většinou (i když to tak možná na první pohled nevypadá) bylo potřeba jen popřesouvat věci – občas v rámci šablony, občas přesunout část renderování z PHP do JS, aby nebylo na dvou místech..
V /examples/ajax*.php
jsou ukázky :-) reflexi, testování a
nápady vítám.
Editoval jahudka (12. 3. 2016 20:55)
- David Grudl
- Nette Core | 8218
jahudka napsal(a):
@DavidGrudl Viz vyse, jak jsem psal – Tracy JS kod je psanej tak, ze i kdyz se do toho da nejak zadratovat podpora pro AJAX, snadno povede k duplikatni inicializaci veci tj. k vicenasobnymu navazovani event listeneru a podobnejm failum..
Toho si uplně nejsem vědom.