Skip to content
No results
  • A JSBlogról
JSBlog
  • Winben blogja
  • CSS
  • Git
  • HTTP
  • Node.js
  • Teljesítmény
  • Web API-k
  • Webbiztonság
JSBlog
  • TypeScript

Négy tagot írsz, nyolc kulcsot kapsz: a TypeScript enum boncolása

Diagram: egy négytagú TypeScript enum a fordítás után nyolc kulcsos JavaScript objektummá válik – minden taghoz egy tükörkulcs is készül a reverse mapping miatt

Az enum az egyetlen konstrukció a TypeScript magjában, ami fordítás után is ott marad a kódban. Megnéztük, mit generál pontosan, miért veszélyes a const enum publikált csomagban, és miért ad a fordító külön kapcsolót a saját feature-ének kitiltásához.

  • Szabó Benjámin
  • 2026.08.13.
  • Web API-k

A WebSocket send() sosem mond nemet – csak a memóriád fogy el

Diagram: a küldő alkalmazásból sűrűn érkező üzenetek egy túltöltött, vörösen izzó pufferben tornyosulnak, miközben a lassú fogadó felé csak vékony csepegés jut ki a hálózatra.

A send() akkor is sikeres, ha egyetlen bájt sem megy ki a hálózatra: az üzenetek esemény nélkül gyűlnek a memóriában. Megmértem, hogyan lesz ebből 566 MiB RSS, mit mondana a spec, és mit lehet tenni ma – küszöb, dobás vagy WebSocketStream.

  • Szabó Benjámin
  • 2026.08.11.
  • Adatbázis

Egyetlen NOTIFY a tranzakcióban, és 25 ezer TPS-ből lesz 1700

Diagram: felül négy párhuzamos zöld nyíl fut egyszerre az adatbázis-hengerbe, alul a négy narancssárga tranzakció közül csak egy halad át a lakattal zárt kapun, a többi szaggatott vonallal várakozik előtte

A LISTEN/NOTIFY a Postgres beépített pub/subja, és tényleg jó. Csakhogy a NOTIFY commitkor egy globális zárat fog, ami libasorba állítja a notifikáló tranzakciókat: 32 kliensnél 24 759 helyett 1708 TPS-t mértem. Megnéztem, kinek van igaza a Recall.ai és a DBOS vitájában, és mit javít a PostgreSQL 19 – és mit nem.

  • Szabó Benjámin
  • 2026.08.07.
  • Docker

Mit csinál a Docker, ha unhealthy lesz a konténered? Semmit.

Kétsávos diagram: felül egy unhealthy jelvényű Docker-konténer az idő múlásával is változatlanul fut tovább, az újraindítás áthúzva; alul egy orchestrator ütemezője az unhealthy konténert friss, egészséges példányra cseréli.

A HEALTHCHECK-től sokan önjavító konténert várnak, pedig a sima Docker az unhealthy állapotra nem reagál: nem indít újra, nem állít le, csak átszínezi a docker ps kimenetét. Kipróbáltam, ki olvassa valójában ezt a státuszt, ki cselekszik belőle, és ki az, aki soha le sem futtatja.

  • Szabó Benjámin
  • 2026.08.04.
  • Web API-k

A service workered gyorsítótáraz – és közben késlelteti a HTML-t

Folyamatábra: service worker nélkül egymás után indul a worker és a HTML-kérés, navigation preloaddal pedig a két művelet párhuzamosan fut

A service worker indulása a hálózati kérés elé állhat. A navigation preload párhuzamosítja a kettőt – de cache-first stratégiánál felesleges forgalmat is okozhat.

  • Szabó Benjámin
  • 2026.08.02.
  • Node.js

A fetch() nem a hálózatra várt: a DNS a Node négy munkaszálán áll sorban

Diagram: a libuv threadpool négy szlotja crypto-, fs- és zlib-feladatokkal foglalt, a dns.lookup a bejáratnál várakozik, míg a dns.resolve4 a c-ares könyvtárral a threadpoolt megkerülve, közvetlenül a hálózat felé megy

Négy crypto.pbkdf2() hívás, és ugyanaz a fetch() 524 ms helyett 2217 ms. A dns.lookup() ugyanis nem hálózati I/O, hanem blokkoló getaddrinfo a libuv négyszálas threadpoolján – ugyanott, ahol az fs, a crypto és a zlib dolgozik. Megmértem, mi történik, és megnéztem, mit lehet tenni ellene.

  • Szabó Benjámin
  • 2026.08.01.
  • CSS

Heti 80 millió letöltés egy tooltip miatt: megérkezett a CSS anchor positioning

Diagram a CSS anchor positioningról: bal oldalon egy gombhoz rögzített tooltip a 3×3-as position-area rács felső cellájában, jobb oldalon a viewport szélénél a fallback az áthúzott, kilógó pozíció helyett a gomb alá fordítja a buborékot

A @floating-ui/dom-ot hetente 80 milliószor töltjük le, hogy tooltipeket és dropdownokat pozicionáljunk JavaScriptből. A Firefox 147 óta mindhárom nagy böngésző tudja ugyanezt natív CSS-ből: anchor positioning, automatikus átfordulással a viewport szélén, görgetéskövetéssel, top layerrel. Megnéztem, mit tud, és hol vannak a csapdái.

  • Szabó Benjámin
  • 2026.07.31.
  • HTTP, Teljesítmény

A tömörítési defaultok ellened dolgoznak: gzip, brotli és zstd, megmérve

Illusztráció három tömörítési sávval: a gzip, a brotli és a zstd különböző méretűre tömöríti ugyanazt az adatblokkot, eltérő hosszúságú sebességjelző csíkokkal

A böngésződ 2024 óta minden kéréssel felajánlja a zstd tömörítést, idén februártól már a Safari is érti. Közben az nginx 1-es szinten gzipel, a Node brotlija alapból maximumon ég, a Cloudflare-nél pedig az Enterprise csomaghoz jár a gzip. Megmértem, mit tudnak a tömörítők – a defaultok nem a barátaid.

  • Szabó Benjámin
  • 2026.07.29.
  • JavaScript

A Set.intersection() sorrendjét a kisebb halmaz dönti el

Két halmaz átfedése, a metszet elemeit sárga pontok jelölik

A Set új halmazműveletei végre kiváltják a kézzel írt filtereket, de az intersection() sorrendjét a kisebb bemenet dönti el. Megnézzük, miért, és hogyan fér bele egy Map, miközben egy Array nem.

  • Szabó Benjámin
  • 2026.07.24.
  • Webbiztonság

A req.ip, amit a támadó tölt ki: az Express trust proxy csapdája

Diagram: az X-Forwarded-For fejléc két IP-vel; a trust proxy: true a bal szélső, kliens által írt címet választja, a trust proxy: 1 a jobb szélső, proxy által hozzáfűzött címet – ez lesz a req.ip

Bekapcsolod a trust proxy-t, mert proxy mögött vagy — és ezzel a req.ip-t a kliens X-Forwarded-For fejlécére bízod. Miért a true a legrosszabb beállítás, mit válassz helyette, és hogyan kerülhető meg vele az egész rate limited.

  • Szabó Benjámin
  • 2026.07.22.
  • Git

git bisect run: a 125-ös exit kód megment egy rossz vádlottól

Git commitgráf feleződő keresési tartományokkal, egy kihagyott és egy hibás committal

A git bisect run automatizálja a regressziókeresést, de egy buildhiba könnyen hamis bűnöst gyárt. Így használd helyesen a 125-ös kilépési kódot.

  • Szabó Benjámin
  • 2026.07.21.
  • JavaScript

A substring() nem másol: húsz karakter, ami 200 megabájtot tart életben

Diagram: fent összefűzött stringdarabokból épülő cons-fa, lent hosszú memóriasáv, amelynek kiemelt kis szeletére egy különálló slice-objektum mutat

A V8 háromféle adatszerkezetet rejt egy JavaScript-string mögé: flat, cons és sliced. Ettől a += olcsóbb, mint a régi tanácsok állítják, a substring() viszont képes 200 megabájtot életben tartani húsz karakterért. Lemértem.

  • Szabó Benjámin
  • 2026.07.16.
  • Web API-k

A true nem azt jelenti, hogy megérkezett: a sendBeacon() 64 KiB-os csapdája

Diagram a böngésző közös 64 KiB-os keepalive soráról: a sorba állítás sikeres lehet, miközben a szerveres kézbesítés még bizonytalan

A sendBeacon() true értéke csak sikeres sorba állítást jelent. A 64 KiB ráadásul közös keepalive keret – és ettől még a szerver semmit sem kapott meg biztosan.

  • Szabó Benjámin
  • 2026.07.14.
  • Node.js

Egy csomag, két példány: amikor az instanceof jogosan mond nemet

Diagram: egy npm csomag import és require ágon két külön példányként töltődik be, alul a module-sync feltétellel mindkét út ugyanabba az egy példányba fut

Ha egy npm csomag ESM-ként és CommonJS-ként is megjelenik, a Node mindkét buildet betölti: két osztály, két singleton, bukó instanceof. A dual package hazard anatómiája – és ahogy a require(esm) meg a module-sync feltétel pontot tesz a végére.

  • Szabó Benjámin
  • 2026.07.13.
  • Web API-k

A Ctrl+F kinyithatja az accordionodat: hidden=”until-found” a gyakorlatban

A böngésző keresője egy összecsukott tartalmi panelt nyit ki

A hidden="until-found" kereshetővé teszi a becsukott tartalmat, a beforematch pedig szinkronban tartja a komponenst. A dobozmodell és egy régi CSS-reset viszont könnyen elrontja.

  • Szabó Benjámin
  • 2026.07.11.
  • HTTP

A 206 nem félkész 200: Range kérések Node.js-ben

HTTP Range kérés útja a kliens, a szerver és egy nagy fájl között

A videók, PDF-ek és folytatható letöltések mögött álló HTTP Range kérés nem csak egy slice: a 206, 416, suffix range és If-Range apró részletei számítanak.

  • Szabó Benjámin
  • 2026.07.07.
  • Adatbázis

Három szám, amit félreolvasol az EXPLAIN ANALYZE kimenetéből

Diagram egy Postgres EXPLAIN ANALYZE plan fáról: a Nested Loop szülő csomópont Buffers értéke a két gyermek csomópont (Seq Scan és Index Scan) összegzett buffer- és időadataiból áll össze, az Index Scan 1639 futásának átlagideje pedig a lekérdezés futásidejének több mint felét teszi ki

Az actual time egy átlag, nem összeg, a Buffers érték felfelé gyűlik a plan fában, és a sima EXPLAIN ANALYZE nem méri a szerializációt – három valós Postgres 17-es példával.

  • Szabó Benjámin
  • 2026.07.05.
  • JavaScript

A regexed több emojit is egy karakternek nézheti: a Unicode v flag

Unicode-karakterhalmazok metszetét és több kódpontból álló emoji-sorozatot ábrázoló technikai diagram

A JavaScript Unicode v flagje halmazműveleteket és több kódpontból álló emoji-sorozatokat hoz a regexekbe. A negált property escape-eknél azonban a jelentés is változhat.

  • Szabó Benjámin
  • 2026.07.04.
  • Node.js

A process.nextTick() nem mikrotask: a Node event loop külön VIP-sora

A Node.js eseményhurkának három várakozási sora, ahol a nextTick sor megelőzi a mikro- és a normál feladatokat.

A process.nextTick() nem ugyanaz, mint egy mikrofeladat: külön Node-sora van, és egy rossz rekurzióval elnémíthatja az I/O-t.

  • Szabó Benjámin
  • 2026.07.03.
  • Docker

A konténered nem lusta leállni – csak nem hallja, hogy szóltál neki

Diagram: fent egy piros sávban a szignál egy PID 1 dobozba ütközik, majd óra és kényszerleállás-jel következik; lent egy zöld sávban a szignál egy init dobozon át simán eljut az alkalmazásdobozhoz, amit egy pipa zár le sikeres leállásként

Tíz másodperc néma csend minden konténerleállításnál, aztán egy erőszakos kilövés. Ez nem lassú cleanup, hanem a Linux PID 1 különleges viselkedése — és egy gyors kernel-szintű teszttel pontosan megmérhető, mekkora a különbség.

  • Szabó Benjámin
  • 2026.06.30.
1 2 3 4
Next
Copyright © 2026 - WordPress Theme by CreativeThemes