Melin's Blog

Latest posts

See all posts
  • Using `navigator.connection.downlink` to Measure Network Speed on the Front End
    For feed-style products like Weibo, image lists are everywhere. On mobile, those images are often served as 2x or even 3x assets to preserve visual quality on high-density scree...
  • First Impressions of Vap, Tencent’s Open-Source Solution for Playing Cool Animations
    A colleague recently mentioned Vap in our group chat. The description was simple: it can play flashy animation effects, and more importantly, it supports transparent animation b...
  • JS Video Decoding: An Out-of-the-Box Review of JSMpeg and Broadway
    Last week, I tried Vap , a player that can use WebGL to decode and play videos, and wrote an article documenting the experience. Someone commented under that article: if all I w...
  • Safari Does Not Support Built-In Custom Elements: A Practical Compatibility Strategy
    Based on Zhang Xinxu’s discussion of Safari’s Web Components limitations, with practical implementation examples from the demo code. Safari supports autonomous custom elements ,...
  • Understanding `Promise.all()`, `Promise.race()`, and `Promise.any()`
    JavaScript gives us several ways to coordinate multiple asynchronous operations. Three of the most useful are Promise.all() , Promise.race() , and Promise.any() . They all accep...
© 2026 • Melin
Press Esc or click anywhere to close