有些人認為“JavaScript是Web的匯編語言”完全是精神病說的話。為此,我詢問了幾位JavaScript權威,比如Brendan Eich(JavaScript之父)、Douglas Crockford(JSON之父),還有Mike Shaver(Mozilla技術副總裁)。
昨天我跟Erik Meijer聊天,他說:
JavaScript就是一個匯編語言。JavaScript加上生成的HTML就像是.NET匯編一樣。瀏覽器可以執行這些代碼,但沒人真的關心里面到底寫的是什么。
——Erik Meijer
怎么會說起這件事兒呢?當時我正在試用Google+,就跟上大多數讓我印象深刻的網站一樣,我立即就查看它的源代碼。不看不要緊,一看嚇一跳:
咱就將就說吧,我看到了1300行代碼,密密麻麻的,大約90KB。上面圖片顯示的只是最前面的一小部分,基本上都是“瘦身后”的JavaScript代碼。再往下看,頁面中間呢,全都是像下面這樣的span、div以及生成的類和id:
我勒個去,滿篇都是GUID(Globally Unique Identifier,全局唯一標識符)。
話又說回來了,http://msn.com、http://www.bing.com、http://.www.facebook.com,全都這樣啊。就連http://www.twitter.com也都開始有點“瘦身”的跡象了。所有大點的網站好像都絲毫不在乎什么標記之美。這是為什么呢?
這樣有效率啊,性能高啊。Google很多最出色的網站背后都依賴GWT呢。在這種情況下,要是這一類網站的里頭和外頭全都一樣漂亮,你反而會覺得不可思議了。
不能不說這可真有點諷刺的意味。曾幾何時,ASP.NET的開發人員對ViewState可是怨聲載道啊。“簡直太笨了”的意思就是“我看不懂它都干什么了。”ViewState曾經(現在也)是一項讓Web開發效率提高很多倍的技術。它跟Google Web Toolkit(GWT)不一樣,但GWT與WebForms的出發點也并非完全沒有相似之處。看看GWT網站自己怎么說:
Google Web Toolkit(GWT)是一個開發工具包,用于構建和優化基于瀏覽器的復雜應用。GWT的目標是提高高性能Web應用開發的效率,而且無需開發人員熟悉瀏覽器的各種怪癖,以及XMLHttpRequest,還有JavaScript。
這個出發點可真是值得贊美,不對?難道不可以這樣說(抱歉,開個玩笑而已):
“ASP.NET WebForms”是一個開發工具包,用于構建和優化基于瀏覽器的復雜應用。它的目標是提高高性能Web應用開發的效率,而且無需開發人員熟悉瀏覽器的各種怪癖,以及XMLHttpRequest,還有JavaScript。
本文的目的不是想夸獎WebForms,也不是給WebForms正名。WebForms對于某些應用是不二之選,正如GWT對其他一些應用那樣。我真正想說的是,使用服務器端的工具包,沒有辦法像使用jQuery寫出清晰的JavaScript,或者使用Razor或HAML寫出清晰、清楚的標記一樣,給Web開發帶來真正的快樂。歸根結底,其實就是你選擇的抽象級別的問題。
所謂的語義標記在這種情況下仍然是被隱藏的,而諸如http://schema.org之類的站點也仍然非常重要,只不過可別指望你能在心儀的站點里看到縮進得像俳句一樣整齊的源代碼。
大家知道,精簡和壓縮屬于正交優化。而我要說的是,一點也不在乎標記和腳本發送到客戶端之后是否美觀,確實太草率了。假如誰都不在乎發送到瀏覽器的標記,只在乎結果,那誰的標記和JS就那么不值錢啊,誰還愿意主動公開自己的源代碼呢?反正,網站不是運行得挺好嘛,誰還在乎其他的?
現在我要給親愛的讀者提個問題,你覺得自己為什么那么在乎點擊“查看網頁源代碼”之后的結果呢?難道HTML5和JavaScript是Web的新匯編語言不成?
(更新)聲明一下:
當然,這個比喻不一定準確。JavaScript代碼無論從外觀到行為,肯定不像ASM。但作為一個比喻,至少可以說明:
JavaScript無所不在;
它速度快而且越來越快;
JavaScript酷似低級的Web編程語言;
它可以通過手工編寫,也可以從另一種語言編譯而來。
作為開發人員或者設計人員,如果有工具提供了你需要的控制和你需要的結果,你最關心哪一個?我認為Rails、ASP.NET,甚至GWT,都沒有100%做到這一點。它們都有自己的問題,但我認為將來的Web不會再專注于清晰的標記,而是奪目的用戶體驗和語言、工具的天下,開發人員會很享受,效率也會更高。
親愛的讀者,你愿意HTML和JavaScript再多抽象一點嗎?還是希望它少抽象一點?
(再更新)為了讓大家明白,我得再說一遍。本文討論了兩個獨立的問題。一個當然就是源代碼經過了精簡和通常的混淆。但這只是第一個問題。真正的問題在于,JavaScript已經成了其他多種語言的目標語言。GWT是一個用JAVA來寫Web應用的框架,它產生的字節碼是“JavaScript”。GWT為原來天然的語言(HTML+JS)選擇了一個設計好的高級語言,并將整個瀏覽器當成了一個VM。好,問題來了:我們是在寫匯編呢,還是在寫某種更高級點的代碼?而且,我剛知道Google+是用Closure來寫的,但這不影響前面的問題。