渲染线程为什么是单线程的
"JavaScript 是单线程的"——这句话几乎每个前端开发者都说过,但很少有人追问一句:为什么?
// 共 12 篇文章
"JavaScript 是单线程的"——这句话几乎每个前端开发者都说过,但很少有人追问一句:为什么?
很多人以为修改一个 CSS 属性会触发"浏览器重新绘制页面",但实际上——改 transform 只需要合成线程处理,改 width 要从布局步骤重新计算,改 background-color 跳过布局但仍需重绘。这三种操作的性能开销可以差 10 倍以上。
Pixi.js 号称"最快的 2D 渲染引擎",但一个场景放上几千个 Sprite 后照样会卡。性能问题不在引擎本身,而在于开发者是否理解引擎的工作方式。这篇文章不讲泛泛的"减少开销"建议,而是聚焦 Pixi.js 特有的性能杠杆:Draw Call、批处理中断、纹理管理和对象…
很多人以为 React Server Components(RSC)就是 SSR 的升级版——"以前在服务端渲染 HTML,现在换了个更好的方式"。但实际上,RSC 和 SSR 解决的是完全不同的问题,产出的东西也不一样,它们更像是两个可以叠加使用的独立技术层。
React 19 于 2024 年底正式发布。这个版本带来的变化不是"多了几个新 API"那么简单——它在编译层面、数据交互层面和异步处理层面同时发力,试图从根本上减少 React 开发中最常见的两类样板代码:手动性能优化和手动异步状态管理。
在 MutationObserver 出现之前,DOM 变化监听依赖 Mutation Events(如 DOMNodeInserted、DOMAttrModified)。这套 API 存在根本性的性能问题——每次 DOM 变化都同步触发事件,阻塞主线程,大量操作时性能灾难。M…
前面的文章解释了 V8 为什么会切换到字典模式(Dictionary Mode)——对象结构变得不稳定,维持隐藏类的成本超过了收益。但字典模式并不意味着"放弃优化"。V8 在哈希表层面做了一系列针对性的优化,同时,字典模式也有硬性的性能天花板。理解这两面,才能在实际开发中做出准…
函数调用在 JavaScript 里无处不在,但"调用一个函数"在 V8 内部并不简单。每次调用都要创建执行上下文、分配栈帧、传递参数、管理返回地址——这些开销在热点代码中积累,会变成性能瓶颈。TurboFan 用函数内联(Function Inlining)来消除这个开销。这…
"delete 会破坏 V8 优化"——这个建议在前端社区流传很广,但通常没有解释背后的原因。知道"不要用"和知道"为什么不要用"是两回事。后者能帮你在真正需要用 delete 的场景里,做出更准确的判断。
一个常见的认知是:JavaScript 是动态语言,对象可以随意增删属性,这天然就是慢的。但 V8 不接受这个结论。它在内部引入了隐藏类(Hidden Class)机制,让动态对象的属性访问接近静态语言的速度。理解这套机制,是理解 V8 对象优化的起点。
"字典是非线性数据结构"这句话在很多前端技术文章里出现,但很少有人解释清楚:这里的"非线性"是什么意思,和"线性"相比到底差在哪,以及 V8 为什么要在对象属性存储上区分线性和非线性。
React 的类组件生命周期曾经是面试高频题,很多人能背出从 componentWillMount 到 componentWillUnmount 的完整流程。但从 React 16.3 开始,三个 Will* 系列方法被标记为 UNSAFE_,到 React 18 已经不建议使…