摘要:為使瀏覽器載入大量模塊時不會造成內存占用過高,瀏覽器應能使被移除后的模塊能被完全釋放。瀏覽器應使模塊運行在獨立空間中,以保證模塊自身錯誤時不至于導致整個應用停止工作。
IOING 在做些什么?
IOING 在你的代碼和瀏覽器之間架設了一個中間解釋層,該解釋層提供了一套新的語法來填補瀏覽器所不具備的能力。
SPA 開發痛點開發一個 SPA 應用的痛點是不同模塊頁面的狀態保存,當從一個頁面跳轉到另一個頁面的時候窗口的所有狀態都將被清空重載,歷史頁面與當前頁面將不產生任何聯系,這個過程是一個拆毀重建的過程,如果你要回到歷史同樣只能再次拆毀重建,并且在這個過程中不可避免的出現加載期的窗口白屏,顯然這樣的丑陋效果不符合一個高貴 App 的設定,但正因這種方式前后頁面不共存的簡單特性也使得開發邏輯變得簡單,開發者只需考慮單個頁面的邏輯即可,而每一次新頁面的加載都能將之前頁面進行完全釋放,完全不需要擔心高耦合和內存無法完全釋放的問題,這也算是傳統技術的優點,雖然簡單粗暴,但是它很管用。那到底有沒有兩全其美的辦法呢?
傳統模式帶來的挑戰和 SPA 應用不同的是多頁面應用往往相對要變得簡單,頁面與頁面之間不需要有復雜的數據交換,也無需保存頁面歷史狀態,因此使用傳統技術最適合不過了。
而 SPA 應用則要協調頁面間的關系,它的每一個模塊都可能是聯動的,而且需要保持窗口的數據狀態,因而催生了另一個技術的流行,即通過使用 Ajax 和模版將新模塊內容載入到當前頁面,但這也導致新載入模塊的腳本和 DOM 樹內容在主文檔下不斷堆積,且在不需要時也無法將其很好移除和釋放(比如 setTimeout 等僵尸事件)。另一種情況是一旦其中一個模塊發生錯誤將很有可能導致整個 SPA 應用崩潰。
除了高耦合問題外,Ajax 每次載入大量的 DOM 結構到主 DOM Tree 下時都將可能會導致這個龐大的 DOM Tree 進行 reflow(回流) 和 repaint(重繪),從而影響整體運行效率
實現方案分析基于上述分析,我們要得到一個穩定的 SPA 應用時必須改造瀏覽器使其支持以下特性:
為保證應用松耦合,瀏覽器必須具備能夠使新加載的模塊與已加載模塊不產生相互干擾的能力。
為使瀏覽器載入大量模塊時不會造成內存占用過高,瀏覽器應能使被移除后的模塊能被完全釋放。
瀏覽器應使模塊運行在獨立空間中,以保證模塊自身錯誤時不至于導致整個應用停止工作。
只有具備了這些特性時才能保證一個大型 WEB 應用的穩定運行,那么對于上述問題 IOING 是怎么處理的呢?
首先為了保證模塊的代碼錯誤不至于影響整個應用的運行,我們需要保證除引擎外的所有不可控腳本都不能運行在主 window 下,而模塊腳本自需要運行在多帶帶的沙盒中。
什么是沙盒模塊?沙盒(Sandbox)簡單來講就是:
無需解釋大家也就都懂了,但是很多人在看到 iframe 時就開始各種擔心起來,聯想起各種文章對 iframe 的負面描述。這里需要解釋一下,iframe 直接作為嵌入網頁使用時確實會占用當前頁面連接池,但其在引擎中其主要目的是作為沙盒使用而并不是為了嵌入網頁使用的,當引擎將編譯好內容時會先主動創建一個空 iframe,然后直接將編譯內容直接丟入其中,注意 iframe 的 src="_blank",這是一個空頁面,該情況下 iframe 并不會共享主窗口連接池。
我們設想一下這樣一個場景:你在瀏覽器打開多個窗口分別載入不同的模塊頁面,然后在你需要打開其他頁面時能通過自定義動畫使瀏覽器窗口進行動畫過渡將頁面展示,當你返回時也能通過反向動畫再將之前窗口內容過渡回來,如果瀏覽器支持這些或許 webApp 看起來將更酷,但現實是瀏覽器并沒有這樣的操作??♂?。
而這個設想可以通過沙盒來實現,在沙盒中的頁面就像新開一個瀏覽器窗口那樣,能夠很好的隔離模塊的 DOM 元素和變量,也能保存頁面狀態,并能通過動畫控制其轉場。
沙盒雖然很穩妥,但其過于獨立,這導致模塊內元素不能突破沙盒限制顯示在模塊外區域,比如說一些復合型模塊(即嵌入主模塊中的模塊,沙盒一般適用與獨立的全屏模塊),當你有這個需求時沙盒特性則不能滿足你,此時你應該支持另一種模塊運行方式:shadowbox 應運而生。
shadowbox使用 shadowbox 配置的模塊,其模塊內容將以一顆新 DOM Tree 插入到主 DOM Tree 中(即 shadowdom 方式),這顆新 DOM Tree 中的 CSS樣式 和 元素id 將不會和外部元素耦合,而此時模塊的 js 文件則依舊在其沙盒中運行。(若運行瀏覽器不支持該特性時應自動降級處理)
后續當然只有一個沙盒模型是遠遠不夠的,比如組件同樣需要一套合理運作機制。之后「兩分鐘了解IOING」將會繼續推出以下話題:
組件設計與通信
模塊刷新機制
量子 DOM 原理(和 Def 算法不同的數據雙向綁定設計)
CSS 引擎的設計思想
更多敬請期待...
往期話題IOING在開發SPA大型應用時有哪些必要的技術條件?
如何用 js 獲取虛擬鍵盤高度?(適用所有平臺)
讓 CSS 完成背景圖加載完畢后顯示 之 解析 IOING 的 onload url 原理
IOING 是一款高性能的前端開發引擎。它為創建一個大型應用提供一整套的完備方案,如頁面模塊化拆分、層級路由控制、可編程CSS、熱拔插組件、雙向數據綁定、DOM語法擴展、自動兼容處理等
聯系掃碼二維碼關注我的公眾號:
傳送門:IOING 仿ios界面
傳送門:官網
傳送門:Github 項目地址
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/112645.html
摘要:為使瀏覽器載入大量模塊時不會造成內存占用過高,瀏覽器應能使被移除后的模塊能被完全釋放。瀏覽器應使模塊運行在獨立空間中,以保證模塊自身錯誤時不至于導致整個應用停止工作。 IOING 在做些什么? IOING 在你的代碼和瀏覽器之間架設了一個中間解釋層,該解釋層提供了一套新的語法來填補瀏覽器所不具備的能力。 SPA 開發痛點 開發一個 SPA 應用的痛點是不同模塊頁面的狀態保存,當從一個頁...
摘要:為使瀏覽器載入大量模塊時不會造成內存占用過高,瀏覽器應能使被移除后的模塊能被完全釋放。瀏覽器應使模塊運行在獨立空間中,以保證模塊自身錯誤時不至于導致整個應用停止工作。 IOING 在做些什么? IOING 在你的代碼和瀏覽器之間架設了一個中間解釋層,該解釋層提供了一套新的語法來填補瀏覽器所不具備的能力。 SPA 開發痛點 開發一個 SPA 應用的痛點是不同模塊頁面的狀態保存,當從一個頁...
摘要:之所以看起來很,除了自身慢的問題還有因為它具備了一些獨有的特性,比如鏈接跳轉,物理像素,不能獲取軟鍵盤高度等具有特色的問題。 WEB 之所以看起來很 WEB,除了自身慢的問題還有因為它具備了一些獨有的特性,比如鏈接跳轉,物理像素,不能獲取軟鍵盤高度等具有 WEB 特色的問題。 而今天我想講一點大家都不在意的一個問題,圖片流式加載的問題 我們先來看一個短片: showImg(https:...
閱讀 2410·2021-11-16 11:44
閱讀 848·2021-09-10 11:16
閱讀 2224·2019-08-30 15:54
閱讀 1042·2019-08-30 15:53
閱讀 1894·2019-08-30 13:00
閱讀 615·2019-08-29 17:07
閱讀 3509·2019-08-29 16:39
閱讀 3135·2019-08-29 13:30