[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"verticals":3,"tag-async-1":32,"tags-all":89,"search-suggestions":150},[4,20],{"id":5,"slug":6,"name":7,"tagline":8,"description":9,"accentFrom":10,"accentTo":11,"icon":12,"defaultLocale":13,"locales":14,"features":16,"position":19},"019fe637-3d33-714b-b57f-23e163ffca0c","dev","Web Development","Read it. Run it. Prove it.","A post a day on modern web development — most with an editable playground and a quiz that explains every answer. Free, no account needed.","violet-500","cyan-400","◇","en",[13,15],"fa",{"courses":17,"paths":17,"articles":17,"exams":18,"flashcards":18,"packages":17,"community":17,"certificates":17,"teams":17,"commerce":17},true,false,0,{"id":21,"slug":22,"name":23,"tagline":24,"description":25,"accentFrom":26,"accentTo":10,"icon":27,"defaultLocale":13,"locales":28,"features":30,"position":31},"019fe637-3dc2-754c-8657-0f175bfee7c6","lang","Languages","Learn a language the way you learn a codebase.","Grammar explained the way good documentation explains an API — one idea at a time, each with a quiz.","amber-400","⌘",[13,15,29],"es",{"courses":18,"paths":18,"articles":17,"exams":18,"flashcards":17,"packages":18,"community":17,"certificates":17,"teams":18,"commerce":18},2,{"items":33,"meta":87},[34,68],{"id":35,"slug":36,"title":37,"subtitle":38,"excerpt":39,"coverUrl":40,"locale":13,"readingMinutes":41,"publishedAt":42,"viewCount":43,"likeCount":19,"commentCount":19,"author":44,"vertical":49,"topic":50,"tags":53,"_count":65,"playground":67,"hasQuiz":17,"hasPlayground":17},"019ff19b-f9ca-772e-8f09-cd3d3c640d2b","web-locks-api-tab-coordination","Five tabs open, one refresh token — the race nobody noticed",null,"Users with multiple tabs open triggered a silent race: every tab refreshed the same expiring auth token at once, and the server started invalidating its own sessions. navigator.locks fixes it with a real mutex, no polling or localStorage hacks required.","\u002Fmedia\u002Fcovers\u002Fweb-locks-api-tab-coordination.png",5,"2026-08-15T06:44:54.917Z",89,{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},"019fe637-3c25-7088-9034-39c9f15dc3c8","Parsa Jiravand","parsa","Frontend engineer · building bestpractic",{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":52},"javascript","JavaScript",[54,56,59,62],{"slug":51,"name":55,"color":38},"Javascript",{"slug":57,"name":58,"color":38},"webdev","Webdev",{"slug":60,"name":61,"color":38},"frontend","Frontend",{"slug":63,"name":64,"color":38},"async","Async",{"assessments":66},1,{"slug":36},{"id":69,"slug":70,"title":71,"subtitle":38,"excerpt":72,"coverUrl":73,"locale":13,"readingMinutes":74,"publishedAt":75,"viewCount":76,"likeCount":19,"commentCount":19,"author":77,"vertical":78,"topic":79,"tags":80,"_count":85,"playground":86,"hasQuiz":17,"hasPlayground":17},"019fe660-de51-759d-935f-dbda9e7e38b5","array-from-async-async-iterable","You're collecting async iterable results with a for-await loop. `Array.fromAsync` does it in one call.","A for-await loop that pushes into an array, or the `await Promise.all([...asyncIterable])` workaround that silently fails — `Array.fromAsync` replaces both with a single awaited call. It's Baseline 2024.","\u002Fmedia\u002Fcovers\u002Farray-from-async-async-iterable.png",4,"2026-08-05T08:42:50.920Z",337,{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":52},[81,82,83,84],{"slug":51,"name":55,"color":38},{"slug":57,"name":58,"color":38},{"slug":60,"name":61,"color":38},{"slug":63,"name":64,"color":38},{"assessments":66},{"slug":70},{"page":66,"perPage":88,"total":31,"totalPages":66},12,[90,92,94,96,100,104,108,112,115,118,122,125,128,129,132,135,138,141,144,147],{"slug":57,"name":58,"color":38,"articles":91},54,{"slug":51,"name":55,"color":38,"articles":93},49,{"slug":60,"name":61,"color":38,"articles":95},48,{"slug":97,"name":98,"color":38,"articles":99},"css","Css",19,{"slug":101,"name":102,"color":38,"articles":103},"typescript","Typescript",10,{"slug":105,"name":106,"color":38,"articles":107},"performance","Performance",8,{"slug":109,"name":110,"color":38,"articles":111},"grammar","Grammar",6,{"slug":113,"name":114,"color":38,"articles":41},"react","React",{"slug":116,"name":117,"color":38,"articles":74},"node","Node",{"slug":119,"name":120,"color":38,"articles":121},"ai","Ai",3,{"slug":123,"name":124,"color":38,"articles":121},"tutorial","Tutorial",{"slug":126,"name":127,"color":38,"articles":121},"html","Html",{"slug":63,"name":64,"color":38,"articles":31},{"slug":130,"name":131,"color":38,"articles":31},"english","English",{"slug":133,"name":134,"color":38,"articles":31},"verbs","Verbs",{"slug":136,"name":137,"color":38,"articles":31},"spanish","Spanish",{"slug":139,"name":140,"color":38,"articles":31},"a1","A1",{"slug":142,"name":143,"color":38,"articles":31},"a2","A2",{"slug":145,"name":146,"color":38,"articles":31},"tenses","Tenses",{"slug":148,"name":149,"color":38,"articles":31},"turkish","Turkish",[151,152,153,154,155,156,157,158,159,160,161,162],{"slug":57,"name":58,"articles":91},{"slug":51,"name":55,"articles":93},{"slug":60,"name":61,"articles":95},{"slug":97,"name":98,"articles":99},{"slug":101,"name":102,"articles":103},{"slug":105,"name":106,"articles":107},{"slug":109,"name":110,"articles":111},{"slug":113,"name":114,"articles":41},{"slug":116,"name":117,"articles":74},{"slug":119,"name":120,"articles":121},{"slug":126,"name":127,"articles":121},{"slug":123,"name":124,"articles":121}]