隨著HTML5的快速發展和網絡時代的到來,Web的接入口——瀏覽器越來越重要,而作為瀏覽器的內核——渲染引擎也變成了熱門話題。自筆者接觸HTML5技術和瀏覽器以來,深深地被這一包含眾多非凡技術的新領域所吸引,并由此產生了很多疑問,為此,我開始了漫長的學習和研究WebKit(及Blink)渲染引擎和Chromium瀏覽器的征程。雖然WebKit項目本身非常復雜,但是其簡單的代碼結構、清晰的邏輯給我留下了深刻的印象,因為在這些復雜技術的背后,竟然也可以使用良好的設計去解決技術的復雜性。而基于WebKit的Chromium項目更是將眾多大膽的新技術引入到了瀏覽器領域,讓人耳目一新。
WebKit是一個非常成功的項目,它不僅僅是個渲染引擎,而且成功地推動了網絡的發展。基于WebKit渲染引擎的瀏覽器項目Chromium,更是成為率先支持HTML5功能和創新新功能的標桿。要完整理解一個Web渲染引擎和瀏覽器并不容易,因為它們的確包含了眾多復雜的功能。據筆者的統計,WebKit項目和Chromium項目(不包括該項目依賴的眾多第三方項目)的代碼量都在500萬行以上,而這些代碼很多并沒有完善的文檔,所以理解這些技術背后的工作原理還是非常困難的。
隨著學習的深入,筆者發現目前對于整個渲染引擎的分析和文檔化還處于一個缺失的狀態。同時,因為渲染引擎和瀏覽器包含了太多的技術,讓人有點應接不暇的感覺。雖然WebKit項目代碼結構簡單,但是由于文檔的缺失,愛好者對于每一項新技術,也經常有不知從何下手的感覺。為此,筆者結合自身的理解,通過這本書系統性地分析這一領域的眾多技術,希望能幫助讀者快速度過迷茫的時期。
本書的讀者
本書主要是為Web愛好者準備的一本書,主要針對Web前端開發者、瀏覽器開發者、Web平臺開發者和其他一切對HTML5技術、WebKit渲染引擎和Chromium瀏覽器的工作原理感興趣的讀者。對于Web前端開發者而言,筆者一直認為,如果使用HTML5技術來編寫網頁或者Web應用,了解其背后的工作原理是寫出高效代碼的有效捷徑。就像開發者想編寫高效C++代碼,需要理解C++編譯器背后的原理一樣,因為只有這樣,開發者才能夠編寫出高性能的代碼。對于瀏覽器開發者來說,本書著重介紹現在非常熱門的WebKit(及Blink)渲染引擎和非常先進的Chromium瀏覽器,通過解釋其內部的工作機制和原理,讓開發者可以很快理解這一切的前因后果。對于其他的廣大愛好者來說,HTML5技術才剛剛開始,未來的發展還將繼續,了解這一技術有助于擴展視野,而且理解瀏覽器對各種技術的應用和設計,對于大家理解很多其他領域的技術也有很強的啟發作用。
因為本書的介紹主要是基于對WebKit和Chromium內部原理的解釋來進行,而這些項目也都是基于C/C++代碼來編寫,所以讀者最好對該語言有一些了解。不過,如果不了解它也沒有太大的關系,只要對面向對象編程的思想有所了解,閱讀本書也沒有太大的障礙。同時,本書不是一本介紹編寫HTML/JavaScript代碼的書,所以,不會對HTML的編程做過多詳細的解釋,而是以一種簡單的方式描述一些基礎性常識。
本書的組織
本書基本的寫作方式是力求在介紹HTML5技術的基礎上,通過對W3C組織制定的規范的解釋,進一步解讀WebKit渲染引擎和Chromium瀏覽器是如何設計出高效的架構來支持這些HTML5技術規范的,其中著重剖析內部的框架和工作原理。在很多情況下,筆者也試圖通過一些開發和工作實踐來幫助理解這些框架和實現背后的機制和原理。
如果想了解整個渲染引擎的原理,光靠渲染引擎本身不足以說明所有機制,所以本書自始至終都是結合WebKit項目和基于WebKit的Chromium瀏覽器項目來描述其工作原理的,因為WebKit項目本身不是一個瀏覽器,而Chromium瀏覽器的設計和架構可以幫助讀者完整理解網頁的渲染過程和現代HTML5新技術是如何獲得支持的,這一過程的確非常精彩。
為了理解HTML5新技術和瀏覽器的工作原理,本書著重帶來以下方面的詳細分析,包括HTML5技術分析、渲染引擎和瀏覽器介紹、WebKit渲染引擎框架、Chromium框架和進程架構、網頁和網頁結構、渲染過程、網絡棧、HTML語言、DOM、CSS樣式、布局計算、渲染基礎、高級硬件加速機制、JavaScript引擎、插件和擴展、多媒體、移動領域、安全機制、調試機制、發展趨勢和Web平臺等眾多熱門技術和前沿性話題。筆者希望將HTML5中絕大多數的重要技術都展現出來,讓讀者可以對這個領域的眾多技術有個總體把握并對主要技術的前因后果有較為深入的理解。
本書引用的參考資料都是筆者多年來研究的對象,對于筆者理解HTML5技術、前端開發技術、渲染引擎和瀏覽器技術起了非常重要的作用,一些論題可能在本書中介紹得不夠完善,讀者可以參考這些資料,做進一步的學習和研究。
本書是一個講解內部原理的書,涉及眾多的技術,特別是深入技術內部工作機制的地方,由于這些內容非常復雜,而且是根據筆者個人的理解加以分析,所以很多時候可能存在理解上的偏差或者錯誤。如果有什么不妥之處,還望廣大讀者諒解并給予指導,或者將意見發送到我的郵箱:
yongsheng@chromium.org。
致謝
感謝電子工業出版社的張春雨、王新宇、尚冰雪等編輯,自始至終給予筆者的強有力的幫助和支持。特別感謝我在英特爾亞太研發有限公司的同事,包括但是不限于閔洪波、王興楠、余枝強、劉守群、朱俊敏、王視鎏、胡寧馨、高純、尹立、顧揚、馮海濤、霍海濤等,他們同我一起探討了很多關于HTML5、WebKit和Chromium方面的話題,讓我受益匪淺。
最后要感謝我的太太、女兒和父母,在寫作的大半年時間里給予了筆者很多支持。因為本書是在繁忙的工作之余利用瑣碎的業余時間來完成的,所以,如果沒有家人提供的良好環境,我是沒有辦法完成這本書的。特別是我的小女兒經常過來“光顧”和“巡視”我的寫作,并給予一些特別的“驚喜”和“禮物”,讓我在寫作之余多了一份樂趣。
朱永盛
2014年2月1日