Leuke steken onder water, stellen dat mij het inzicht ontbreekt. Ik ontwikkel al 20 jaar op het web en volg de ontwikkelingen op de voet. Ik ben hoofdontwikkelaar op websites met meer dan een miljard pageviews. Ik ben niet echt een beginner te noemen, of iemand die het niet begrijpt.
(...)
Ik ben blij dat je naar die 2 muppets linkt, want dat is precies het probleem: developers die deze Googlers blindelings volgen en denken dat al hun onderwerpen, welke veelal niche en bleeding edge zijn, de enige waarheid zijn.
Je realiseert je dat je hier zelf de
argument from authority-fallacy begaat, heh? Juist datgene waar je mij van beschuldigd in het aanhalen van bovenstaande Googlers, maar dan door jezelf ongefundeerd naar voren te schuiven als autoriteit.
Verder verkondig je ongefundeerd onwaarheden (bijv. over het single-threaded zijn van interne browser processen); snauw je mensen af; en reageer je op rationele argumenten door je vingers in je oren te steken; alvorens er een welles-nietes wie-schreeuwt-er-harder spelletje van te maken. Dan kun je ook een sneer verwachten van iemand die vindt dat je de discussie aan het vergallen bent. Niks niet vreemd.
(Voor de volledigheid: ik zit ook al zo'n 15 jaar in het vak en heb ook een bedrijfsbrede vooraanstaande rol op gebied van frontend zaken, maar ik zal niet gaan pochen over pageviews. Overigens zo nietszeggend over de kwaliteit van wat je aflevert: een aantal van de grootste pageview-trekkers op het internet zijn technisch de grootste bagger die je je maar kunt bedenken.)Je kunt beginnen met begrijpend lezen: de discussie werd gestart met stellen dat het massaal inzetten van workers voor allerlei taken een standaard recept is, een best practise, en dat indien je dit niet doet, je jaren achterloopt.
Werkelijkheid: vrijwel niemand gebruikt workers, het is onontgonnen gebied. Workers zijn verder niet bedoeld voor triviale taken, slechts voor zware rekentaken, omdat ze "duur" zijn. Voor een zeer groot gedeelte van client side apps zijn er amper echt zware rekentaken.
Even voorop: er werd letterlijk gesteld dat PWAs "al tijden" net zo vloeiend kunnen zijn als native apps en dat om dit te bereiken het nodig is "om zoveel mogelijk taken door webworkers te laten uitvoeren zodat je UI op 60fps blijft draaien."
Het argument dat het een absolute best-practice zou zijn en het feit dat je "jaren achterloopt" als je het niet doet,
dat kwam pas ter sprake nadat jij met jou dramkloterij BarôZZa op de kast gejagen kreeg. Chapeau. Leer zelf begrijpend lezen.
Met het originele argument van BarôZZa was
niets mis.
Het bestond er uit om zoveel mogelijk
taken op een worker plaats laten vinden zodat de main thread en de UI ontlast wordt en zo dicht mogelijk tegen het ideaal van 60 FPS aan kan blijven. Dat impliceert totaal niet dat je voor elke scheet en een knikker een short-lived worker moet aanmaken of dat je massaal veel workers moet gaan spawnen. Dat zou inderdaad heel duur zijn. De startup cost voor een worker is namelijk vrij hoog en het geheugengebruik is ook redelijk significant.
In de basis komt het er op neer dat je simpelweg zoveel mogelijk werk van de main thread af wilt duwen. Dat is een heel valide architectuur-insteek die het al letterlijk decennia goed doet met desktop-applicaties. In die zin is het architectureel trouwens ook wel degelijk een best-practice, alleen een best-practice die op het web lange tijd niet gebezigd kon worden en nog niet de kans heeft gehad om er breed door te breken.
Het is een opzet die je, zoals ik al eerder schreef, het makkelijkste bereikt door de relatie om te draaien en je hele applicatie binnen een worker te trekken en enkel de delen die de DOM raken terug uit te besteden aan de hoofd UI thread.
Frameworks die werken op basis van een virtuele DOM zijn daar bij uitstek geschikt voor omdat ze de uit te voeren DOM updates al als een soort commandlist prepareren om op de echte DOM uit te voeren. De virtuele DOM en alles wat er aan hangt kan in principe gewoon in de worker draaien. Deze commandlists kunnen daarna in batches overgeheveld worden naar de UI thread en daar uitgevoerd worden.
Aan de UI kant verwerk je de commandlists dan in een requestAnimationFrame callback; meet je periodiek met bijv. performance.now hoeveel frame-time je nog over hebt, en als deze op begint te raken stop je en ga je verder met de lists te verwerken op een nieuw frame, binnen een nieuwe rAF callback.
Omgekeerd stuur je DOM events en DOM-to-model updates aan two-way bindings juist van de hoofd UI thread naar de worker toe.
Geen reden dat zo'n systeem niet goed zou kunnen werken. En met letterlijk honderden verschillende oplossingen in JS app frameworks met praktisch elke maand wel weer een paar extra erbij, zijn er ook vast specialistische oplossingen die zoiets al doen.
[Reactie gewijzigd door R4gnax op 25 juli 2024 09:52]