2019/4/6 10:38:24
有(yǒu)些人(rén)認爲“JavaScript是Web的(de)彙編語言”完全是精神病說的(de)話(huà)。爲此,我詢問了幾位JavaScript權威,比如(rú)Brendan Eich(JavaScript之父)、Douglas Crockford(JSON之父),還有(yǒu)Mike Shaver(Mozilla技術(shù)副總裁)。
昨天我跟Erik Meijer聊天,他(tā)說:
JavaScript就是一個(gè)彙編語言。JavaScript加上(shàng)生成的(de)HTML就像是.NET彙編一樣。浏覽器(qì)可(kě)以執行(xíng)這些代碼,但(dàn)沒人(rén)真的(de)關心裏面到(dào)底寫的(de)是什(shén)麽。
——Erik Meijer
怎麽會(huì)說起這件(jiàn)事兒呢?當時我正在試用(yòng)Google+,就跟上(shàng)大(dà)多數讓我印象深刻的(de)網站一樣,我立即就查看它的(de)源代碼。不看不要緊,一看吓一跳:
咱就将就說吧(ba),我看到(dào)了1300行(xíng)代碼,密密麻麻的(de),大(dà)約90KB。上(shàng)面圖片顯示的(de)隻是最前面的(de)一小(xiǎo)部分(fēn),基本上(shàng)都(dōu)是“瘦身後”的(de)JavaScript代碼。再往下看,頁面中間呢,全都(dōu)是像下面這樣的(de)span、div以及生成的(de)類和(hé)id:
我勒個(gè)去,滿篇都(dōu)是GUID(Globally Unique Identifier,全局唯一标識符)。
話(huà)又(yòu)說回來了,http://msn.com、http://www.bing.com、http://.www.facebook.com,全都(dōu)這樣啊。就連http://www.twitter.com也(yě)都(dōu)開(kāi)始有(yǒu)點“瘦身”的(de)迹象了。所有(yǒu)大(dà)點的(de)網站好像都(dōu)絲毫不在乎什(shén)麽标記之美(měi)。這是爲什(shén)麽呢?
這樣有(yǒu)效率啊,性能(néng)高(gāo)啊。Google很多最出色的(de)網站背後都(dōu)依賴GWT呢。在這種情況下,要是這一類網站的(de)裏頭和(hé)外頭全都(dōu)一樣漂亮,你(nǐ)反而會(huì)覺得不可(kě)思議了。
不能(néng)不說這可(kě)真有(yǒu)點諷刺的(de)意味。曾幾何時,ASP.NET的(de)開(kāi)發人(rén)員對ViewState可(kě)是怨聲載道啊。“簡直太笨了”的(de)意思就是“我看不懂它都(dōu)幹什(shén)麽了。”ViewState曾經(現在也(yě))是一項讓Web開(kāi)發效率提高(gāo)很多倍的(de)技術(shù)。它跟Google Web Toolkit(GWT)不一樣,但(dàn)GWT與WebForms的(de)出發點也(yě)并非完全沒有(yǒu)相(xiàng)似之處。看看GWT網站自己怎麽說:
Google Web Toolkit(GWT)是一個(gè)開(kāi)發工(gōng)具包,用(yòng)于構建和(hé)優化基于浏覽器(qì)的(de)複雜應用(yòng)。GWT的(de)目标是提高(gāo)高(gāo)性能(néng)Web應用(yòng)開(kāi)發的(de)效率,而且無需開(kāi)發人(rén)員熟悉浏覽器(qì)的(de)各種怪癖,以及XMLHttpRequest,還有(yǒu)JavaScript。
這個(gè)出發點可(kě)真是值得贊美(měi),不對?難道不可(kě)以這樣說(抱歉,開(kāi)個(gè)玩笑(xiào)而已):
“ASP.NET WebForms”是一個(gè)開(kāi)發工(gōng)具包,用(yòng)于構建和(hé)優化基于浏覽器(qì)的(de)複雜應用(yòng)。它的(de)目标是提高(gāo)高(gāo)性能(néng)Web應用(yòng)開(kāi)發的(de)效率,而且無需開(kāi)發人(rén)員熟悉浏覽器(qì)的(de)各種怪癖,以及XMLHttpRequest,還有(yǒu)JavaScript。
本文(wén)的(de)目的(de)不是想誇獎WebForms,也(yě)不是給WebForms正名。WebForms對于某些應用(yòng)是不二之選,正如(rú)GWT對其他(tā)一些應用(yòng)那樣。我真正想說的(de)是,使用(yòng)服務器(qì)端的(de)工(gōng)具包,沒有(yǒu)辦法像使用(yòng)jQuery寫出清晰的(de)JavaScript,或者使用(yòng)Razor或HAML寫出清晰、清楚的(de)标記一樣,給Web開(kāi)發帶來真正的(de)快樂(yuè)。歸根結底,其實就是你(nǐ)選擇的(de)抽象級别的(de)問題。
所謂的(de)語義标記在這種情況下仍然是被隐藏的(de),而諸如(rú)http://schema.org之類的(de)站點也(yě)仍然非常重要,隻不過可(kě)别指望你(nǐ)能(néng)在心儀的(de)站點裏看到(dào)縮進得像俳句一樣整齊的(de)源代碼。
大(dà)家知道,精簡和(hé)壓縮屬于正交優化。而我要說的(de)是,一點也(yě)不在乎标記和(hé)腳本發送到(dào)客戶端之後是否美(měi)觀,确實太草(cǎo)率了。假如(rú)誰都(dōu)不在乎發送到(dào)浏覽器(qì)的(de)标記,隻在乎結果,那誰的(de)标記和(hé)JS就那麽不值錢啊,誰還願意主動公開(kāi)自己的(de)源代碼呢?反正,網站不是運行(xíng)得挺好嘛,誰還在乎其他(tā)的(de)?
現在我要給親愛的(de)讀(dú)者提個(gè)問題,你(nǐ)覺得自己爲什(shén)麽那麽在乎點擊“查看網頁源代碼”之後的(de)結果呢?難道HTML5和(hé)JavaScript是Web的(de)新彙編語言不成?
(更新)聲明(míng)一下:
當然,這個(gè)比喻不一定準确。JavaScript代碼無論從外觀到(dào)行(xíng)爲,肯定不像ASM。但(dàn)作爲一個(gè)比喻,至少(shǎo)可(kě)以說明(míng):
JavaScript無所不在;
它速度快而且越來越快;
JavaScript酷似低級的(de)Web編程語言;
它可(kě)以通過手工(gōng)編寫,也(yě)可(kě)以從另一種語言編譯而來。
作爲開(kāi)發人(rén)員或者設計(jì)人(rén)員,如(rú)果有(yǒu)工(gōng)具提供了你(nǐ)需要的(de)控制(zhì)和(hé)你(nǐ)需要的(de)結果,你(nǐ)最關心哪一個(gè)?我認爲Rails、ASP.NET,甚至GWT,都(dōu)沒有(yǒu)100%做到(dào)這一點。它們都(dōu)有(yǒu)自己的(de)問題,但(dàn)我認爲将來的(de)Web不會(huì)再專注于清晰的(de)标記,而是奪目的(de)用(yòng)戶體驗和(hé)語言、工(gōng)具的(de)天下,開(kāi)發人(rén)員會(huì)很享受,效率也(yě)會(huì)更高(gāo)。
親愛的(de)讀(dú)者,你(nǐ)願意HTML和(hé)JavaScript再多抽象一點嗎?還是希望它少(shǎo)抽象一點?
(再更新)爲了讓大(dà)家明(míng)白,我得再說一遍。本文(wén)討(tǎo)論了兩個(gè)獨立的(de)問題。一個(gè)當然就是源代碼經過了精簡和(hé)通常的(de)混淆。但(dàn)這隻是第一個(gè)問題。真正的(de)問題在于,JavaScript已經成了其他(tā)多種語言的(de)目标語言。GWT是一個(gè)用(yòng)JAVA來寫Web應用(yòng)的(de)框架,它産生的(de)字節碼是“JavaScript”。GWT爲原來天然的(de)語言(HTML+JS)選擇了一個(gè)設計(jì)好的(de)高(gāo)級語言,并将整個(gè)浏覽器(qì)當成了一個(gè)VM。好,問題來了:我們是在寫彙編呢,還是在寫某種更高(gāo)級點的(de)代碼?而且,我剛知道Google+是用(yòng)Closure來寫的(de),但(dàn)這不影響前面的(de)問題。
深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04
咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967