文章

漏水 IE

瀏覽器大戰,走的方向都是以運行 Web Application 為主,所以大力加重 Javascript 的效能改進,得益的自然是一般用戶。可是,我想即使是現在,仍然有很多開發工作要以 IE6 為對象。IE6 除了超多 CSS 臭蟲 外,Javascript Engine 的漏水 (記憶) 情況也是很嚴重。

MSDN 上,就已經有專屬文章讓大家了解 IE 漏水的原因 ,有四種:Circular Reference、Closure、DOM Insertion (Cross-Page Leak) 和 Pseudo Leak,全都是很容易中招的地方,開發者只能自求多福,盡量除蟲。

Circular Reference 和 Closure 大致上是同一類問題,當 Javascript 和 DOM 之間互有 Reference 的時候,IE 就不懂 GC,原因是 IE Javascript GC 和 DOM 的 GC 採用不同機制。但現在的 UI 越趨複雜,Javascript 和 DOM 有更緊密的接觸,一不小心就會留下這些 Circular Reference。而近年被談論得最多的 Closure 語法 (?),在文章裏給大家的意見是:「可免則免」。

至於 DOM Insertion bug,我寫過一個有 lightbox 加 Ajax Form 的元件,當中當然有大量的 DOM object 的處理。但這個元件在 IE 上一開,就會消耗 7-8 MB 的記憶,而最可惡的是即使是跳頁,記憶也不會被釋放。結果,用上半個小時左右的 IE 已經佔數百 MB 的記憶。這個 bug 的解決方法,是改變一下插入 DOM 的順序,看似簡單,但卻很容易被忽視。

Pseudo Leak 指的是同頁上的 DOM Object 即使被移除了,記憶也不會被釋放,只會在跳下一頁時才可以清除。MS 認為,因為最終記憶是可被釋放,所以才說這是 Pseudo Leak。但對於一些 Single Page Application 來說,這又是另一個大頭痛。

以上種種問題,的確會令開發者膽子變少,不敢用太多新的寫法、技術,結果會停滯不前,也少了創意。這也是為甚麼靠 Internet 而存在的 Google,要推出自家瀏覽,始終不能靠一個漏水瀏覽器吧!

對付 IE 的漏水問題, sIEve 會是大家的好幫手。使用 Library 如 jQuery 也會有幫助,裏面有蠻多 code 特地應付以上談到的漏水原因。IE 也有一些 Patch 來治漏,不過效果好像不太理想。另外也有一些偏門技巧如 finallyCollectGarbage() 等等。

P.S. 寫此篇明顯是因為近日又要與 IE 搏鬥的關係…

回應

*