中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

谷歌為何會選用TypeScript?

2018-09-14    來源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

我已經(jīng)使用TypeScript兩年多時(shí)間,是時(shí)候?qū)懸粌善恼聛砜偨Y(jié)一下了。

谷歌在很早之前就張開雙臂擁抱Web應(yīng)用程序,Gmail已經(jīng)發(fā)布14年了。當(dāng)時(shí),JavaScript的世界是瘋狂的。Gmail工程師不得不為IE糟糕的垃圾回收算法捏一把汗,他們需要手動將字符串文字從for循環(huán)中提取出來,以避免GC停頓。最近,我找到了那個(gè)時(shí)代一個(gè)設(shè)計(jì)文檔,是關(guān)于如何“minify” JavaScript文件的,只不過一些工具僅用于Windows平臺。這些事情在今天看來是難以想象的。

多年來,谷歌構(gòu)建了大量的基礎(chǔ)設(shè)施,用于開發(fā)大型的JavaScript應(yīng)用程序。例如,他們開發(fā)了一個(gè)模塊系統(tǒng),可以讓源文件自描述它們之間的相互依賴關(guān)系,還有一個(gè)捆綁器,可以將源文件合并在一起,并縮小為可與瀏覽器兼容的工件。另外還有一個(gè)工具,它通過動態(tài)加載入口點(diǎn)來分析應(yīng)用程序的依賴關(guān)系圖,并抽取服務(wù)的公共子模塊。還有非常常見的服務(wù)器端渲染。所有這些概念對于今天的Web開發(fā)人員來說都是很熟悉的,但谷歌的技術(shù)?偸呛艹,它們并行演進(jìn),雖然在概念上很相似,但實(shí)際上卻完全不同——不同的流程、工具,甚至名字都不一樣。

另一個(gè)有關(guān)并行演進(jìn)的例子:谷歌、Facebook和微軟各自構(gòu)建了相似但不兼容的編譯器,這些編譯器向JavaScript中加入了靜態(tài)檢查。谷歌的編譯器通俗地稱為Closure(不要與Clojure這門編程語言混淆,另外請注意,ClojureScript使用的是Closure編譯器)。

谷歌的JavaScript技術(shù)棧非常棒,其中一些部分已經(jīng)超越了當(dāng)今最好的技術(shù)。例如,Closure編譯器可能仍然是最復(fù)雜的JavaScript優(yōu)化器,可以使用類型信息來優(yōu)化代碼、跨熱加載塊邊界進(jìn)行函數(shù)內(nèi)聯(lián),以及將無用的代碼剝離成單個(gè)符號。

當(dāng)然,谷歌的JavaScript技術(shù)棧也存在一些問題。Closure是JavaScript的一種帶有靜態(tài)類型的變體,通過注釋來引入語言新特性。Closure具有不可預(yù)測的語義,它運(yùn)行速度慢,容易出現(xiàn)bug,除非你很小心,否則它很容易就讓你的代碼變得一團(tuán)糟。它是開源的,但除了一些能夠招到谷歌前員工的公司之外,行業(yè)中很少有公司會使用它。在谷歌內(nèi)部,我認(rèn)為JavaScript的聲望并不高,部分原因在于我們的工具,它將靜態(tài)語言的冗長性與動態(tài)語言的不可預(yù)測性結(jié)合在了一起。

而在谷歌之外,JavaScript在不斷演進(jìn),變得越來越流行。為了解決IE垃圾回收器的問題,我們開發(fā)了Chrome,然后v8出現(xiàn)了,繼而nodejs誕生,所以今天的大多數(shù)Web工具都是用JavaScript編寫的。模塊系統(tǒng)(UMD、AMD、CommonJS)大肆膨脹,ES6也發(fā)明了自己的模塊系統(tǒng),但由于某種原因,與其他模塊系統(tǒng)不兼容,非常可惜。npm統(tǒng)一了工具和庫的共享方式。Webpack可以在你開發(fā)代碼的同時(shí)將模塊動態(tài)加載到正在運(yùn)行的應(yīng)用程序中。

但谷歌沒有使用這些東西。我們有一個(gè)類似SASS的CSS預(yù)處理語言,只是它不叫SASS,而且沒有人喜歡用它;ㄉ诘膲K分割器并不支持第三方JavaScript庫,部分原因是這些工具的出現(xiàn)早于JavaScript的庫生態(tài)系統(tǒng)。

這些都已經(jīng)成為歷史。你可以說我們不應(yīng)該忘了我們是如何到達(dá)這里的,但不管怎樣都無法改變我們已經(jīng)達(dá)到這里的事實(shí);蛟S我們更應(yīng)該關(guān)心接下來要去哪里。我們有幾個(gè)選擇。

第一個(gè)選擇是放棄這個(gè)已經(jīng)破敗不堪的星球,去到一個(gè)沒有JavaScript的新星球。如果我們在GWT(一個(gè)將Java編譯為JavaScript的谷歌項(xiàng)目)或Dart(一個(gè)將其他語言編譯為JavaScript的谷歌項(xiàng)目)或WASM或(Clojure?Haxe?Elm?)上做更多的投入,根本就不需要擔(dān)心JavaScript!

作為編程語言愛好者,我覺得這個(gè)主意不錯(cuò)。不過長話短說,這里有一些問題:首先,采用不同的語言對于我們現(xiàn)有的數(shù)百萬行代碼來說并沒有任何意義——“使用新語言重寫”在某些情況下可能是正確的選擇,但很難做到充分利用Gmail工程師的時(shí)間。其次,采用不同的語言對于我們想要聘請的前端程序員來說一點(diǎn)幫助都沒有,等于說他們之前的經(jīng)驗(yàn)都用不上了。

改變一切的對立面是不做出任何改變。JavaScript世界充斥著業(yè)余代碼和leftpad災(zāi)難。一個(gè)優(yōu)秀的工程師總能適應(yīng)特殊的前端開發(fā)方式,我們總能改進(jìn)或構(gòu)建更多屬于自己的工具。我們構(gòu)建的應(yīng)用類型——谷歌搜索主頁每天的點(diǎn)擊量超過數(shù)十億次——與其他人構(gòu)建的網(wǎng)絡(luò)應(yīng)用程序不同,我們的工具不僅優(yōu)秀,而且都是必需的。我認(rèn)同這種觀點(diǎn)。我認(rèn)為存在某種權(quán)衡,一方面,構(gòu)建我們自己的工具是有意義的,另一方面,我們已經(jīng)遠(yuǎn)離了主流,以致于我們的工具變成了一種負(fù)擔(dān)。關(guān)鍵在于,我們現(xiàn)在處于這個(gè)權(quán)衡的哪個(gè)位置上,我相信我們離后者更近。我們從對LLVM/Clang的貢獻(xiàn)中獲益,因?yàn)槲覀円蕾囉贑++,但是我們不會從構(gòu)建自己的LLVM中獲得更多額外的價(jià)值。

我的團(tuán)隊(duì)一直在追求中間那條路:在必要的時(shí)候逐步采用一些外部工具。這項(xiàng)任務(wù)并不那么有趣——我們不可能只是簡單地把遺留的那套東西直接丟掉——但我喜歡謙虛一些,向外看,而不是向內(nèi)看。

在谷歌JavaScript孤島和大陸之間架起橋梁的首先是一個(gè)靜態(tài)檢查器:

(1)它不是我們內(nèi)部開發(fā)的

(2)已經(jīng)很流行,與我們現(xiàn)有的代碼相似

(3)旨在為JavaScript做橋接

(4)支持大規(guī)模開發(fā)

這個(gè)工具就是TypeScript。Closure編譯器的優(yōu)勢在于它的優(yōu)化輸出,而TypeScript具有出色的用戶接口,但不提供優(yōu)化。這兩個(gè)工具是互補(bǔ)的,并且在處理某些任務(wù)時(shí)可以進(jìn)行分層式協(xié)作。

使用TypeScript給我們帶來了很多好處——從IDE風(fēng)格的代碼完成到從StackOverflow上獲取相關(guān)問題的答案。我們所要做的工作主要是集成:將我們的應(yīng)用程序逐步遷移到TypeScript,而不是從頭開始重寫。在與谷歌范圍內(nèi)的構(gòu)建系統(tǒng)集成時(shí),我們非常謹(jǐn)慎,我們進(jìn)行增量編譯,這對大型應(yīng)用程序來說至關(guān)重要。一個(gè)模塊發(fā)生變更,只要不影響公開的API,就不應(yīng)該導(dǎo)致下游模塊進(jìn)行重新編譯。與Closure類型/模塊系統(tǒng)的集成意??味著ES6 TypeScript模塊可以導(dǎo)入谷歌模塊系統(tǒng)模塊,反之亦然,而且可以保留大部分類型信息。

在谷歌,現(xiàn)在到處都可以看到TypeScript的身影。如果你在使用谷歌的產(chǎn)品,很可能是在與TypeScript代碼打交道。TypeScript本身就是一系列有趣的方案的折衷,它在靜態(tài)類型的編程語言與自由轉(zhuǎn)換的JavaScript生態(tài)系統(tǒng)之間做出了權(quán)衡。這就是我們的工程師要做的事情:做出有趣的權(quán)衡,嘗試在各種問題之間找到平衡點(diǎn)。我希望后面能夠?qū)懜辔恼路窒磉@些年發(fā)現(xiàn)的一些有趣的事情,我認(rèn)為TypeScript在這個(gè)領(lǐng)域內(nèi)達(dá)到了很好的平衡。

英文原文: http://neugierig.org/software/blog/2018/09/typescript-at-google.html

感謝覃云對本文的審校。

 

來自:http://www.infoq.com/cn/articles/typescript-at-google

 

標(biāo)簽: Google 代碼 服務(wù)器 服務(wù)器端 谷歌 搜索 網(wǎng)絡(luò)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:JavaScript中Array方法的正確打開方式

下一篇:Java序列化的狀態(tài)