1. 程式人生 > >程式設計史話第四期-飽受爭議的前端之王JavaScript的血淚成長史

程式設計史話第四期-飽受爭議的前端之王JavaScript的血淚成長史

寫在前面

  這篇博文主要介紹javaScript的發展史,根據作者在B站釋出的同名視訊的文案整理修改而成,對視訊感興趣的博友可訪問https://www.bilibili.com/video/av94544624

JavaScript和網景

  1993年,美國伊利諾大學的NCSA組織釋出了一款名為mosaic的瀏覽器 ,中文就是馬賽克的意思,這個瀏覽器是第一款可以顯示圖文的瀏覽器 ,給當時的人們帶來了極大的視覺衝擊,當時的人們開啟mosaic就跟劉姥姥進了大觀園似的 ,mosaic一經發布就獲得極高的人氣並迅速走紅,這個瀏覽器也是點燃上世紀90年代的網際網路熱潮的重要火種.

  Mosaic的主要開發者馬克*安德森敏銳的嗅探到了瀏覽器在網際網路浪潮中的重要性,於是辭職創辦了自己的公司.

  1994年公司正式定名為NetScape 也就是網景 ,公司的使命 就是在mosaic的基礎上開發面向廣大普通網民的新一代網頁瀏覽器Netscape Navigator,也就是網景導航者.    1994年12月 網景導航者釋出1.0版本 ,立刻受到市場的狂熱追捧,隨著上網衝浪的人越來越多,再加上網頁內容變得更加複雜多變,瀏覽器急需一種前端指令碼語言來幫助服務端做一些邏輯校驗以及實現一些動態互動效果  ,當時的網速可不像現在這樣百兆光纖打底,看視訊1080p起步,當時的傳輸效率頂天了二十多KB每秒,試想 當你你興沖沖的在某某網註冊使用者 ,等了10秒鐘,結果告訴你郵箱格式填錯了 ,你是不是想掀桌子,類似的網速體驗你可以到沒開會員的百度雲盤裡感受下.    隨著1.0版本的成功,網景公司馬不停蹄投入到下一個版本的開發,1995年 34歲的函數語言程式設計愛好者Brendan Eich,看到網景在招聘程式設計師來開發基於瀏覽器的Schema,艾奇一看專業對口入夥了,這裡多說一句Schema語言是Lisp語言的一個變種 ,語法簡單 功能強大 是一種函式式的語言.   當時正逢SUN公司的java問世,,java的口號是 write once run anywhere ,也就是一次編寫到處執行,這個口號在當時對於java的病毒式擴散發揮了巨大的作用 ,效果不亞於今天的 充電五分鐘 通話兩小時 ,網景於是和SUN公司進行了深入合作 ,比如網景瀏覽器支援將java小程式嵌入到網頁中這就是java applet,當時網景思考過乾脆直接將java作為瀏覽器的前端語言得了 ,因為好處很明顯 不需要開發 而且壓根不需要推廣,但最終這個方案很快被否決了 ,一方面java實在是在太重了 ,嵌到瀏覽器上有一種殺雞用牛刀的感覺 ,另一方面java比較複雜 學習門檻略高,網景決定開發一個更輕量級更簡單的新語言來作為自家瀏覽器的前端語言.     艾奇入職僅僅一個月 ,網景高層就公佈了決策 新語言必須要長得像java 但是要比java簡單,為什麼會有這種奇怪的要求呢 ?因為網景不是和SUN公司深度合作了嘛,SUN公司當時正在全力推廣java,而SUN公司不論從體量和規模都遠超網景,在合作中也掌握著絕對的話語權,所以SUN公司參與並主導了這次高層會議 ,雖然心裡有一萬個草泥馬奔過,但迫於壓力,極不情願的艾奇為了應付公司安排的任務,還是開始著手設計這個新語言,他僅僅花了10天就設計出了javascript的原型,javascript語言在函式上參考Scheme,而在語法和資料結構上又深度借鑑C和java,同時在一些細節之處還學習了Self,Perl甚至是Python的一些語言特點,可謂是集百家所長.   js釋出不久,就被迅速搭載進即將釋出的網景導航者2.0瀏覽器中,當時也是誰都不知道 這個10天就被潦草設計出來的語言,會對後世產生多麼深刻的影響,而後世又要花多年的時間去消化它的因為倉促發布欠下的技術債,當然這都是後話.      1996年3月 js隨著網景導航者2.0的釋出一同出道 ,值得一提的是 和js一樣對後世影響深遠的cookie技術,也是在這個版本一併面世的,Session配Cookie ,還是頭一回.      伴隨著mosaic瀏覽器的節節敗退,網景導航者如海嘯般席捲千家萬戶,1996年底 乘勝追擊的網景又馬不停蹄釋出了3.0版本,這個版本搭載的是javascript1.1版本,此時網景導航者的市場佔用率達到了75%,javascript憑藉瀏覽器的強勢得到了市場的廣泛認可.

JavaScript名字的由來

  像java一樣 javascript也經歷了改名風波,js最早名字叫做 Mocha ,Mocha中文直譯是摩卡,也是一種咖啡,外國人對咖啡真是有執念啊 ,1995年9月 Mocha改名叫LiveScript ,後來經過SUN公司授權 最終定名為javascript,這個命名對網景和SUN公司來說是雙贏,一方面網景可以蹭到了java的名氣,同時SUN公司也將java的影響力擴充套件到了瀏覽器領域.

JavaScript和java的區別

  關於java和javascript的區別很多編外的吃瓜群眾搞不清,而網上很流行的段子是這麼說的 ,java和javascript的關係就像是雷鋒和雷峰塔,言外之意就是沒有半毛錢關係 ,作為一個嚴謹的程式設計師,我匿名反對這個比喻,我覺得java和javascript更像是瀋陽和小瀋陽的關係 ,乍一看沒什麼關係,仔細一看確實沒什麼關係 ,但往祖墳上 你挖 你使勁挖,就會發現二者其實有著千絲萬縷的聯絡,不只是名稱 ,javascript在設計理念和語法風格很多地方都參考java

JavaScript的標準化之路

  也是在這一年 姍姍來遲的微軟也釋出了IE瀏覽器3.0的版本,在這個瀏覽器上搭載了javascript的克隆版-Jscript,微軟從名稱中去掉java是為了避免潛在的版權問題 ,此時市場上一共有三種客戶端語言同時流通,除了javascript和jscript ,還有一個名氣不大的ScriptBase,值得一提的是ScriptBase也是藝名,你去百度一下ScriptBase原名叫什麼 ,我保證你會回來”臥槽”的.    為了搶先獲得規則制定權,網景最先將javascript作為草案提交給歐洲計算機制造商協會,也就是ECMA組織,希望能將javascript做成行業標準,最終在網景,SUN,以及微軟等公司的參與下 ,由一眾程式設計師和相關組織人員組成的第39技術委員會 也就是TC39釋出了ECMA-262標準 ,這個標準定義了名為ECMAScript的全新指令碼語言,為啥又來了個ECMAScript?   因為java是SUN的商標,SUN授權了NetScape可以叫javascript,但是ECMA沒有SUN的授權就不能叫javascript,哪怕NetScape成員特別希望ECMA把它叫做javascript,但是ECMA也有成員並不希望這個標準就叫javascript,總之經過幾輪磋商和博弈,ECMAScript這個名字就定下來.

JavaScript,Jscript和ECMAScript的關係 

  嚴格來說 javascript包含ECMAScript 和文件物件模型DOM以及瀏覽器物件模型BOM,但後兩者更新的很少,你就把javascript當成ECMAScript理解也沒什麼太大問題,現在 javascript更多是ECMAScript的商業名稱,後面我們講javascript的發展也主要是說ECMAScript的版本更新,這裡我們總結一下,jscript和javascript是ECMAscript的兩個不同分支,他們在申明變數,操作物件資料等方面都是一樣的,因為這些都是ECMASCript的範疇,但是在操作瀏覽器物件等方面又略有差異,拿微軟來說 ,為了讓自家親兒子IE看上去更加強大,微軟在網頁技術上加了很多特有的東西,這就導致了同樣的程式碼在非IE瀏覽器上無法正常顯示,這裡就要講到DOM(文件物件模型),DOM也經歷了從野蠻生長到標準化的過程,這個標準化工作由W3C組織接管,其實不只是DOM了,Html css也都是在這幾年完成了從散兵遊勇到正規軍的進化.

 ECMAScript3.0(ES3)的釋出

  憑藉Windows作業系統強大的帶貨能力以及免費這張王牌.IE不費吹灰之力就把網景打得連親媽都不認識了,其中曲折我們留到下回分說,不過網景的沒落並沒有阻止javascript這個語言的發展.      1999 ECMAScript釋出3.0的版本 也就是ES3,為啥沒提ES2呢  因為不值一提,ES3版本才是真正意義上對ECMAScript的第一次修改,這個版本新增了對正則表示式,異常處理等新功能的支援,這個版本的javascript真正意義上得到了廣泛的支援和認可,甚至有這樣一種聲音 ,ES3版本的釋出才正式標誌著javascript成為一門程式語言 ,直至今天很多初學javascript的朋友,還是在學ES3的語法.

 ECMAScript4.0(ES3)的曲折

  進入千禧年 ES4.0開始醞釀釋出,ES4對ES3做了大刀闊斧的全面改造,導致TC39委員會出現了一些反對的聲音,部分成員認為這個版本太過於激進 ,版本更新應該小火慢燉 步子邁太大 容易扯著淡,最終這個版本沒有通過,21世紀頭幾年 javascript的發展也進入了一個迷茫的低谷, 不僅後院起火 市場上也湧現了眾多挑戰者試圖吞食js的市場,值得一提的就是actionscript,這是adobe公司為為自家的flash開發的一門指令碼語言,同樣基於ECMAScript 語法類似於javascript,不過隨著flash的逐漸沒落 actionacript也逐漸式微,有趣的是actionscript是遵循ES4早期草案開發的 ,因此Adobe公司就成了ES4的堅定支持者,而微軟就是當時的主要反對派,因為他擔心javascript變得太大 失去控制,所以你看到沒有,當時各路人馬對ES4的巨大分歧  並不像我上面說的,步子邁大了容易扯著蛋 這麼膚淺,其中 利害錯綜複雜,涉及到商業利益 企業競爭 行業話語權等等,真掰開了聊 一兩包瓜子根本不夠,總之大家是各懷鬼胎,委員會裡的微軟成員甚至一度準備通過法律途徑來阻止ES4的通過,ES4的代號是Harmony 意思是和諧,你品一下.  

 Ajax和JQuery的救場

  2005年 ,隨著谷歌在自家郵件服務Gmail,谷歌地圖等產品中大量使用ajax技術,ajax開始走進大眾視野  並被人們迅速接受,簡單理解ajax就是可以讓你在不刷當前頁面的情況下,和服務端進行非同步的資料交換並且能動態操作當前頁面的節點,人們發現javascript配上ajax簡直有如神助,就像周杰倫遇上方文山.   有了ajax的加持,不僅能提高系統性能 優化使用者頁面 ,還能實現一些實用又炫酷的效果 ,比如我們現在已經司空見慣的關鍵詞聯想 搜尋建議等等,可以這麼說 AJAX給當時迷茫孱弱的javascript打了一針強力興奮劑.   繼ajax救場之後 ,2006年,JQuery的第一個版本面試了 ,我們知道 ,微軟仗著自己財大氣粗,在IE的迭代過程中閉門造車 標新立異 ,導致IE和其他瀏覽器在設計和實現細節上出現了很多分歧,但由於IE市場佔用率又居高不下 ,因此令人頭禿的瀏覽器相容問題引無數開發者競折腰  據不完全統計, ,因為瀏覽器相容問題被前端開發者砸壞的鍵盤連起來可繞地球兩圈 ,天下苦秦久矣,IQuery是一個封裝javascript的工具框架,在很大程度上遮蔽了底層瀏覽器之間的相容問題,並且針對常用功能封裝了大量的API,因此一經推出 ,就受到了廣泛的關注和歡迎.   有了Ajax和jquery的雪中送炭,javascript的版本更新之路開始被重新提上日程,在ES4漫長的鬥爭無果後,終於無疾而終.   2008年,社群把注意力都放在了ES3.1上,並且在釋出之際 改名為ES5,ES5釋出後 ,很長時間裡成為最受歡迎的javascript版本 ,被市面大部分瀏覽器全面支援 ,比如火狐,谷歌,safari等等 甚至還包括IE.

Nodejs的橫空出世

  2009年,基於JavaScript語言的開源web專案Node.js正式釋出 ,在此之前,瀏覽器一直是JavaScript的唯一宿主,nodejs讓JavaScript終於脫離了瀏覽器的束縛 ,投入到後端伺服器開發的懷抱中 ,node.js雖然香,但是最初缺少一個包管理工具 ,因為你使用Nodejs開發是,會用到很多別人寫的js庫,因此需要一個簡單的包管理工具 ,此時npm應運而生 和nodejs雙劍合璧 ,一起將JavaScript推向另一個巔峰.   經此一戰,javascript後面的發展就比較順風順水,波瀾不驚了,到現在ECMAScript最新版本ES2020馬上就要面世了 ,javascript也成了前端指令碼領域唯一的王.

 總結和展望

  魯迅先生說,先驅者往往容易會成為絆腳石,由於javascript設計階段過於倉促 ,並且一經面世就被飢渴的市場立馬接受,沒有一個慢慢漲粉厚積薄發自我進化的過程,同時早早的就進行了標準化,這使得javascript一些倉促甚至不合理的設計無法得到及時的修正,也讓早期使用js寫出來的程式碼混亂不堪,雖然如今,前端這個魚塘已經被javascript承包了,但我們回首它來時路的每一步,都走的好孤獨,javascript的設計者愛奇在很長的時間都不喜歡自己這個親兒子,愛奇甚至說 ,與其說我愛它 不如說我恨它,它的優秀之處並非原創 它的原創之處並不優秀 ,javascript原生家庭的命運也讓人唏噓,網景經歷了短暫的繁榮,但微軟這個龐然大物的強勢攪局,也讓它迅速隕落.    javascript由於過早的標準化留下很多爛攤子,在跌跌撞撞的發展路上也飽受指責和非議,比如沒有名稱空間 很難模組化 不適合大型專案,比如臭名昭著的null和undefined,==和===等等都給開發者帶來了很多不必要的煩惱.,除了自身的短板 javascript也受到了很多不該屬於它的非議,比如彈窗小廣告盛行的那些年 ,javascript就被戴上了瀏覽器牛皮癬的帽子,比如說相容IE這事 ,也成了萬千開發者揮之不去的夢魘,微軟早在2015年就釋出了EDGE來代替卡慢醜的IE,IE的壽終正寢也是板上釘釘的事了 ,我知道大家在相容IE這件事上已經經受了太多的折磨.但是死者為大,IE生前也是個體面人 ,IE6的輝煌是不以人的意志而轉移的.    回頭想想在javascript磕磕絆絆的成長之路,尤其是ES4標準推廣的事情上,微軟的消極對待,沒有一點三好學生 優秀團幹部的樣子,如果網景再晚一些推動javascript的標準化,可能現在的web領域就是另外一番景象了,被微軟挾天子以令諸侯也說不定 ,微軟的策略真可謂 非我族類 其心必異 ,不過 商業競爭的事我們這樣的俗人也無法太過苛責,商業上的博弈和競爭本就是,商戰有時比熱戰更加殘酷,陰謀 陽謀 明爭 暗鬥 ,一將功成萬骨枯,其實很多在現在看來很成功或者很傻逼的產品,在彼時彼刻都是無奈的選擇,這些都淹沒在歷史的塵埃裡,只留下一個結果,交給世人評說.    關於javascript的陳年往事 ,現在回首也已經是雲淡風輕,關於javascript的未來將會何去何從,我們也可以保持樂觀 ,雖然WebAssembly未來可能會把很多程式語言帶到web中來,但javascript的前端霸王地位我覺得不會被撼動,如今各種各樣的前端框架琳琅滿目層出不窮,javascript已經下沉到這些框架之中,javascript一路走來並不容易,能走到今天的位置更不容易,它不夠完美 但一直在進步 ,隨著編譯器效能的突飛猛進和各種新技術的出現,或許如果有一天,我們可以在瀏覽器上暢玩英雄聯盟這樣的遊戲大作,屆時 請別忘記,javascript一定在你看不見的地方為你貢獻著它力所能及的力量 .

 參考資料

1.百度百科和相關紀錄片 2.JavaScript簡史-奇舞週刊(連結太長,不放了) 3.http://www.ruanyifeng.com/blog/2011/06/10_design_defects_in_javascript.html