引言
我從07年開始進入博客園,從最開始閱讀別人的文章到自己開始嘗試表達一些自己對技術的看法。可以說,博客園是我參與技術討論的一個主要的平台。在這其間,隨着接觸技術的廣度和深度的增加,也寫了一些得到了大家認可的技術文章,多篇文章也得到了編輯推薦。大家的認可也更激發了我寫技術文章的熱情,借助公司在博客園的賬號葡萄城控件技術團隊博客發布了多篇有關Web前端開發的文章,尤其是如下三篇前端開發最佳實踐相關的文章引來了大家的熱烈討論:
也正是這三篇文章的編寫促成了我的新書《Web前端開發最佳實踐》的出版。多年來技術的長進都得益於在博客園技術社區的討論和借鑒前輩們的技術思想。得益於社區,也應該回饋社區,所以從今天起,計划在博客園發布前端開發相關的系列文章,和大家討論我所認為的Web前端開發最佳實踐方法。本文為開篇,簡單介紹前端開發的一些概念和方向,后續將依次從HTML、CSS、JavaScript、移動端開發為主體展開討論。
Web前端開發需要具備的技能
由於Web前端技術興起的時間不長,因此還沒有明確的界限定義,不同的Web項目中可能要求的Web前端開發技術會有所不同。比如,某些項目可能需要前端開發人員了解一些后端技術,這樣前端開發人員才可以更好地與后端開發人員配合,比如在頁面上留下一些后端需要調用的鈎子等,而某些項目可能需要前端開發懂一些UI設計、Photoshop工具的使用方法等,以便於和UI設計師溝通和配合。盡管Web前端開發的范疇廣泛,並且界限模糊,但是以下7點則是Web前端開發必備的技能。
1. 頁面標記(HTML)
由於頁面HTML代碼結構基本固定,HTML的標簽數量也不多,所以從學習的難易程度來說,HTML應該是前端技術中非常容易上手的技術。即使是一個新手也能在較短的時間里學會並編寫一個結構良好的頁面來。雖說入門容易,但是要編寫語義良好、簡潔整齊的HTML代碼則需要大量的實踐學習才能掌握。HTML是頁面的基本結構組成,是網站的基礎,臃腫混亂的HTML代碼不但會影響其本身的展現,而且與其對應的CSS和JavaScript代碼也會變得難以編寫和維護。
2. 頁面樣式
CSS 是 Cascading Style Sheets(層疊樣式表)的簡稱。在標准頁面設計中,CSS負責網頁內容的表現,所以CSS也是前端開發需要掌握的核心內容。豐富的CSS樣式能讓平淡的HTML展現出絢麗的效果,使得頁面更為友好。好的樣式可以讓用戶在頁面上停留的時間更久一些,也可以幫助用戶更好地閱讀網站內容,同時,還可以讓用戶在不同瀏覽器上有着相同的體驗。CSS和HTML代碼一樣,沒有復雜的邏輯,上手也比較容易。其主要的難點在於如何合理利用CSS的組合和繼承特性來編寫簡潔、可維護性好的CSS代碼。以上這兩項基本技能是前端UI開發必備技能。
3. 前端編程
前端編程技能主要指定是JavaScript編程。JavaScript是一種居於對象和事件驅動的客戶端腳本語言,是頁面實時動態交互的技術基礎。相較於HTML和CSS,編寫JavaScript代碼更能讓前端開發人員找到后端程序員的感覺。JavaScript是非常靈活的腳本語言,包含了高階函數、動態類型以及靈活的對象模型等強大的語言特性,當然,JavaScript的靈活性也導致代碼不易維護。此外,瀏覽器的兼容性也增加了JavaScript編碼的難度。同一個功能,可能在不同的瀏覽器中有不同的實現, 例如,在IE瀏覽器中事件綁定使用的是attachEvent()方法,但其它瀏覽器則使用的是addEventListener()方法。開發人員在熟悉JavaScript基本語法和基本的編碼規范之外,還應該掌握在不同瀏覽器中JavaScript的兼容性問題。另外,作為前端開發工程師,必定會涉及后端的編程,一些原因是目前流行的Web編程方式會有部分后端代碼存在於前端頁面中,和前端的HTML、JavaScript等混合在一起,比如PHP、JSP、ASP.net等,所以前端工程師也有必要了解一些后端編程技術。
4. 跨平台,跨瀏覽器
前端代碼本來是不存在跨平台方面的問題,但是隨着移動Web平台的興起,跨平台的問題就逐漸顯現出來了。移動設備如智能手機和平板電腦在近幾年發展迅猛,用戶通過移動設備訪問Web站點的比率也是逐年增高。如何在眾多移動平台、眾多屏幕尺寸上展現友好的Web站點成為了一項前端技能。不過,目前跨瀏覽器沒有像幾年前表現得那么突出了,這要歸功於IE6、IE7瀏覽器的占有率快速下降和眾多瀏覽器對標准的重視,另外目前流行的前端框架已經很好地處理了瀏覽器的兼容問題。盡管如此,但是還需要熟悉常見的瀏覽器兼容方法,主要包括:IE7、IE8的兼容,HTML5中新特性的兼容等。
5. 前端框架
各種前端框架的出現,很大程度上降低了前端開發的難度。框架統一了編碼的方式、封裝了瀏覽器兼容問題並添加大量的擴展功能。如今的Web項目中前端框架應用非常廣泛,在開源社區Github上排名靠前的開源框架也是以前端框架居多。優秀的前端框架可以很大程度上減少項目開發的周期,尤其是jQuery,幾乎成為了Web項目默認的前端框架。但是前端框架的接口眾多,各種框架的使用方式和編碼方式也不盡相同。作為前端開發工程師,需要熟悉一些常用框架的使用方法,並且要了解如何編寫常用框架的擴展插件,如:jQuery、YUI、ExtJs等。
6. 調試工具
對於前端代碼,在調試過程中需要查看頁面的HTML結構變化,CSS渲染效果,JavaScript代碼的執行情況及HTTP請求和返回的數據,並且還要查看網站各個部分的性能等,甚至需要動態更改HTML,CSS代碼來查看預期的效果,模擬發起HTTP請求來查看后端返回的數據。各主流瀏覽器都會有對應的瀏覽器插件來輔助完成這些工作,如:IE中的IE Dev Toolbar、Chrome中的Developer Tools、Firefox中的Firebug等,此外還有HTTP請求監控和模擬工具,如:Fiddler等。 開發工程師需要熟練使用這些工具來輔助完成前端代碼的調試。
7. 溝通能力
軟件工程師向來是一個不善於溝通的群體,但是溝通卻又是一項必備的基本技能,尤其是對於前端開發工程師來說。Web前端開發介於UI和后端邏輯開發之間,所以Web前端工程師在開發過程中必定會和UI設計師及后端工程師合作:前端工程師需要和UI設計師溝通,確定效果是否可以實現以及實現的代價,並對UI設計提出建議;還需要和后端工程師溝通,確定前后端交互的接口以及傳輸的數據實體的結構等,良好的溝通會讓這些過程變得輕松許多。
Web前端開發現狀
前端開發雖然起步時間短,但是發展勢頭迅猛,在各種新技術、新標准的推動下,各大互聯網公司也開始重視Web產品的前端重構與開發了,如淘寶、騰訊、新浪、百度、搜狐等都對自己的網站進行了重構並同時使用了HTML5中的新特性。現在開發的Web新產品的頁面交互也越來越豐富,視覺效果也越來越絢麗。互聯網公司除了重視前端開發之外,還在積極推動互聯網技術的發展,從2001年到2012年,騰訊、百度以及360先后加入了萬維網聯盟(W3C),共同參與互聯網技術標准的研究和制定,促進國內互聯網產業的發展。
在Web前端發展的過程中,瀏覽器的發展起着至關重要的作用。瀏覽器廠商在這場Web浪潮中推波助瀾,表現在瀏覽器的版本升級周期短、對前端標准的支持也越來越好、瀏覽器的性能也有大幅的提升等。一向表現差強人意的IE瀏覽器也開始發力,最新發布的IE11瀏覽器無論從標准的支持或者是性能都表現突出。瀏覽器的快速發展使得低端的瀏覽器如IE6、IE7等快速退出市場。
除各大互聯網公司和瀏覽器廠商的積極推動外,Web前端開源社區的參與熱情也極為高漲,呈現出一派欣欣向榮的景象。在著名的網絡代碼托管系統Github上,開源的項目仍然是以前端相關項目居多。按語言排名前三的分別為JavaScript、Ruby和Python。按項目分,排名靠前的大部分也是前端項目,如:prototype、bootstrap、jQuery及相關插件等,具體大家可參考Github官方網站。國內的前端社區則發展較為緩慢,多是以推廣HTML5為主,靠一些酷炫的效果來吸引眼球,反而關注前端基礎的較少。國內Web互聯網公司(如:淘寶、百度、騰訊等)也有部分優秀的開源前端框架,這些公司的前端技術分享氛圍不錯,但受地域的限制,主要集中在北京和杭州等小范圍內,雖然相關人員在積極推動但還是孤掌難鳴,發展很不平衡。整體來講,國內前端技術發展還是挺迅速,也不乏頂級的前端技術人員,但缺乏的是開放的心態和與國外同行交流的能力,國內前端技術的發展任重道遠。
Web前端整體技術的發展和前端工程師個人的能力是相輔相成的。目前前端工程師大都是半道出家,一部分是從頁面UI開發轉行為Web前端開發的,一部分則是由后端工程師轉行而來,所以前端工程師普遍是自學成才,並沒有受過足夠的專業訓練,也缺乏實際的項目經驗。
除了以上這些Web前端開發的外在環境外,Web前端在技術方面也存在着大量的挑戰,大量舊的網站需要重構來提高網站用戶體驗和性能等。這些網站的前端代碼普遍存在的問題有:代碼組織混亂,CSS代碼和JavaScript代碼混合在HTML代碼中;代碼的格式問題突出,不夠整潔;頁面布局隨意,HTML代碼不符合標准;網站整體性能差,還沒有意識到要去應用諸如緩存、動態加載、腳本壓縮、圖片壓縮等提高性能的技術。
Web前端開發的現狀可以概括為:前端技術發展迅速,但起步晚,基礎薄弱;前端工程師熱情高漲,但缺乏足夠技能培訓,對代碼規范重視不足,對一些基礎原理的理解不夠深刻。
規范的web前端代碼:更好維護、更好性能和更安全
規范的代碼,這是所有軟件開發中對代碼的基本要求,前端開發也是一樣的,要求寫規范的HTML、CSS和JavaScript代碼。
什么樣的前端代碼才能稱的上是規范的代碼?探討這個問題之前,首先需要強調的是規范不是標准,不是放之四海而皆准的,不同的項目中的代碼規范是有可能有差異的,比如命名,有些項目規定HTML標簽的id必須要以控件的縮寫名作為前綴。如按鈕的id名以”btn”作為前綴,有些只是規定命名有意義就可以。再比如有些項目規定JavaScript代碼語句結尾必須添加分號,但是有些項目並不要求,大名鼎鼎的bootstrap源代碼中並沒有給JavaScript語句結尾添加分號。所以規范的作用只是讓同一個團隊代碼風格的統一,減少協作時的復雜性,確保后續的維護和修改方便。不同團隊中遵循的規范有可能存在部分差異,但是在同一個團隊中規范必須是統一的,團隊中的成員應該嚴格遵循。澄清了規范的作用后,接着上面的問題來探討什么才是規范的前端代碼。
Web前端的代碼規范主要針對的是HTML、CSS和JavaScript代碼。盡管前端代碼規范在不同場合會有差異,但是規范的前端代碼應該具有如下的特征:
1. 符合標准
所謂的標准指的是W3C制定的Web標准,W3C制定的標准包括使用語言的規范,開發中使用的原則和解釋引擎行為等。主要由3個部分組成:結構標准(Structure)、表現標准(Presentation)和行為標准(Behavior)。結構標准包括XML標准、XHTML標准和HTML標准,目前使用的標准版是HTML4.01標准,HTML5是HTML和XHTML的最新標准;表現標准主要指的是CSS樣式標准,目前使用標准版的是CSS2,CSS3尚未發布最終版;行為標准主要包括ECMAScript標准和DOM標准,ECMAScript是ECMA(European Computer Manufacturers Association)制定的標准腳本語言(JAVAScript),DOM是文檔對象模型(Document Object Model)的縮寫,是一個中立於語言的應用程序接口,容許程序訪問並更改頁面的內容、結構和樣式。目前推薦遵循的是ECMAScript標准是ECMAScript 262第5版,DOM標准是DOM級別2,DOM級別3還沒有發布正式版本。W3C推薦的這些標准受到了各瀏覽器廠商和IT互聯網公司的歡迎,前端代碼遵循標准則可以保證網頁在不同瀏覽器上可以正常展現。
2. 格式規范統一
前端代碼的格式主要包括命名、代碼縮進、空格和空行的使用以及代碼注釋。命名主要有HTML元素的id和class名,JavaScript中函數和變量的命名;HTML、CSS和JavaScript代碼中都需要通過代碼的縮進來體現代碼的層次關系;空格和空行主要用在CSS和JavaScript代碼中,用來提高代碼可讀性,如操作符前后添加空格、不同代碼段邏輯之間添加空行等; CSS和JavaScript代碼中都需要添加必要的注釋來解釋說明代碼文件及代碼段,HTML代碼中使用注釋的情況較少。和其它代碼格式規范一樣,前端代碼格式規范也是為了提高代碼的可讀性和可維護性。
3. 高性能
前端性能體現在瀏覽器的響應速度上,包括網頁的加載速度和頁面的交互響應速度。網頁加載所占有的時間包括后端處理請求的時間、代碼文件從服務器端傳輸的時間、HTML和CSS的組合展現的時間以及JavaScript加載和運行的時間。除了第一條,其余都和前端代碼有直接的關系,減小文件傳輸時間的最直接的方式就是減小文件的大小,越小的代碼文件相對傳輸就會更快;簡潔和符合標准的HTML和CSS代碼能減小瀏覽器解析的時間,加快瀏覽器渲染過程;頁面中請求數量越少相對頁面加載時間也會越快;JavaScript代碼中選擇性能更好的實現方案,如延遲加載、動態加載等技術,會讓頁面加載更快和交互更流暢。規范的前端代碼應該針對這些方面來編寫高性能的前端代碼,提高用戶的前端體驗。
4. 高安全性
網站的安全很難引起互聯網公司的足夠重視,他們更看重的是站點的用戶體驗、性能等這些更直觀的方面。2011年,多個網站用戶信息泄露風波震驚整個互聯網,網站安全也再次引起業內的重視。從技術上講,網站的安全瓶頸主要在后端,但是隨着前端技術的發展,富客戶端應用越來越多,前端安全問題也隨之增多,例如,跨站點攻擊、cookie劫持等。這些攻擊通過設置JavaScript變量、HTML標簽的值和屬性、CSS屬性值等方式偽造惡意代碼來達到攻擊的目的,那么規范的前端代碼至少要針對這些方面做必要的安全校驗和必要的編碼,提高代碼的安全性。
前端代碼如果能遵守如上的幾個規范點,則基本上能稱之為高質量的代碼。需要強調的是酷炫的技術只是浮雲,良好的編碼習慣和意識才是真功夫