摘要:他們的計劃是,使用微軟開發(fā)者們所習(xí)慣的其他語言的開發(fā)工具所支持的靜態(tài)類型,得到更好的代碼。在微軟內(nèi)部,被和以及團(tuán)隊所使用,而且它被系的等公司使用。標(biāo)準(zhǔn)的編輯,同時也是微軟項目高級經(jīng)理的也同意。
本文轉(zhuǎn)載自:眾成翻譯
譯者:文藺
鏈接:http://www.zcfy.cc/article/895
原文:http://thenewstack.io/javascript-transpilers-need-know/
想要在與 ECMAScript 保持一致的同時也不拋棄那些沒有最新 JavaScript 特性的瀏覽器嗎?或者在成為標(biāo)磚之前試驗?zāi)切┘磳⒌絹淼奶匦?,以告訴 ECMAScript 哪些對你有用,哪些沒什么用?再或者就是想利用那些大型項目中提高 JavaScript 效率的工具?轉(zhuǎn)譯器(transpiler)可以幫你完成所有這些。
轉(zhuǎn)譯器是將一種語言的代碼轉(zhuǎn)換為另一種語言代碼的工具,它們過去曾被更多地用來轉(zhuǎn)換替代性語言如 CoffeeScript、ClojureScript、Elm,甚至還使用像 C 和 C++、Emscripten(將 LLVM 二進(jìn)制碼轉(zhuǎn)換為 asm.js 代碼) 這樣的語言。Mozilla 的政策與研究主任 Dave Herman 指出,這并不是要替代 JavaScript,“多種 Web 編程模型可以愉快地共存,它們甚至還能健康地競爭、相互借鑒?!?/p> 擴(kuò)展 JavaScript
與此類似,他評論 TypeScript、PureScript、Flow 以及 JSX 這樣一些給 JavaScript 增加自定義擴(kuò)展的轉(zhuǎn)譯器“對 Web 來說是偉大的”。
TypeScript 是 JavaScript 的超集,支持可選的靜態(tài)類型,還有一些工具,它們提高代碼編寫效率,支持重構(gòu),還可以偵測錯誤,從方法名的書寫錯誤到因類型錯誤而無法執(zhí)行的操作都能被檢測到。你可以試驗帶有類型安全特性但同時保持可讀性的 JavaScript,而不用深陷在其他語言如 Dart 或 CoffeeScript 之中。
當(dāng)初,使用 TypeScript 來編寫 Babylon.js 的時候,David Catuhe 指出來,“使用 Babylon.js 的開發(fā)者不會察覺到 TypeScript 編寫的新版本與 JavaScript 編寫的老版本之間的差異?!彼€提到,引入 TypeScript 幫助他找到了許多之前在代碼中一直存在的小 bug。
使用轉(zhuǎn)譯器,意味著開發(fā)者在編碼的時候可以使用更新的特性和 API,總的說來,這同時也會幫助社區(qū)發(fā)展。 —— Henry Zhu
對那些大量編碼大團(tuán)隊來說,這些好處能帶來巨大的效率提升。這正是 2011 年 TypeScript 啟動時,微軟所尋求的。Office Online 網(wǎng)頁應(yīng)用擁有超過 100 萬行的代碼,“那時候做這樣的 app,可沒那么多可以使用的工具”,TypeScript 前任項目經(jīng)理 Jonathan Turner 告訴我們。他們的計劃是,使用微軟開發(fā)者們所習(xí)慣的其他語言的開發(fā)工具所支持的靜態(tài)類型,得到更好的 JavaScript 代碼。
VS Code 和 Visual Studio 很好地支持 TypeScript,也有 Sublime、Emacs 和 Vim 的 TypeScript 插件,還有其他一大堆工具正在支持。TypeScript 被許多項目選中,比如說,Angular,Asana,Dojo,Mozilla 的 Flash 替代產(chǎn)品,以及 Babylon.js WebGL 框架、JavaScript 遠(yuǎn)程調(diào)試工具 vorlon.js。
在微軟內(nèi)部,TypeScript 被 Bing、 Visual Studio 和 Visual Studio Online、Azure 以及 Xbox 團(tuán)隊所使用,而且它被 Adobe、Google、Palantir、Progress(NativeScript)、eBay 系的 SitePen 等公司使用。
除了擴(kuò)展 JavaScript,TypeScript 還可以將代碼轉(zhuǎn)譯為匹配多種 ECMAScript 標(biāo)準(zhǔn)的代碼,這讓你可以出更少的力氣支持多種瀏覽器,還能提前使用 ECMAScript 標(biāo)準(zhǔn)的建議。
這個特點(diǎn)也被開源的 Babel transpiler 所支持,這是另一個 JavaScript 轉(zhuǎn)譯器。
“轉(zhuǎn)譯器允許開發(fā)者編寫面向未來的代碼,哪怕當(dāng)前版本的語言不被任何環(huán)境支持,” Babel 核心團(tuán)隊的 Henry Zhu 解釋道?!氨确秸f,如果你要支持不含任何 ES2015 特性的 IE 瀏覽器,那就必須要轉(zhuǎn)譯了,因為 IE 對新語法一無所知。Babel 就是中間的一層,讓你無需考慮正在使用什么瀏覽器、指定哪些需要轉(zhuǎn)譯的特性。瀏覽器實現(xiàn)規(guī)范需要時間,他們在增量進(jìn)行。如果沒有自動更新特性,可能用戶永遠(yuǎn)不會更新 JavaScript 版本,所以唯一的辦法就是編寫新版本的 JavaScript 然后再轉(zhuǎn)譯?!?/p>
和 TypeScript 一樣,Babel 不僅僅是轉(zhuǎn)譯,Zhu 提到?!癇abel 是 JavaScript 轉(zhuǎn)換通用性工具。它并不只是將 ES6 轉(zhuǎn)到 ES5。” Babel 擁有超過 1000 個的擴(kuò)展插件;“人們?yōu)樘囟ǖ膸臁⒐ぞ撸ㄈ绱a檢測)、瀏覽器優(yōu)以及代碼壓縮等編寫插件?!?/p> Standards at Scale
此外,Zhu 說,“使用轉(zhuǎn)譯器,意味著開發(fā)者在編碼的時候可以使用更新的特性和 API,總的說來,這同時也會幫助社區(qū)發(fā)展?!?/p>
“規(guī)范的創(chuàng)造者們在 TC-39 處理的 stage-0 到 stage-4 過程中(譯者注:原文 “TC-39 stage process from stage-0 to stage-4”,可以流程可以參考譯文《ES7新特性及ECMAScript標(biāo)準(zhǔn)的制定流程》)可以接收到提案的反饋,如果有人為其編寫了插件,” Zhu 說道?!耙驗橛袕V泛的用戶基礎(chǔ),Babel 允許許多用戶嘗試實驗特性,相對于只是被沒有‘真實世界’測試的語言作者所認(rèn)可,這有助于塑造更好的特性。許多提議都在 Github 上,任何人都可以給未來的提案提供建議,只要它還在往前發(fā)展。”
Herman 對他所謂的 “標(biāo)準(zhǔn)轉(zhuǎn)譯技術(shù)的采用,特別是 Babel 的成功” 充滿熱情?!皩﹂_發(fā)者來說,最現(xiàn)實的誘惑就是利用 JavaScript 的改進(jìn)之處,哪怕引擎(瀏覽器或 Node.js)尚未提供原生支持。不過因為這些特性是基于標(biāo)準(zhǔn)的,開發(fā)者們可以放心大膽地使用,而不必?fù)?dān)心大的兼容性變化。在快速進(jìn)化的 JavaScript 生態(tài)系統(tǒng)中,這對開發(fā)者的價值,怎么說都不為過?!?/p>
ECMAScript 標(biāo)準(zhǔn)的編輯,同時也是微軟 Edge 項目高級經(jīng)理的 Brian Terlson 也同意。“轉(zhuǎn)譯器十分重要。JavaScript 程序員通常都想使用最新特性。迎合最小公分母是很悲催的,沒人想做這事。轉(zhuǎn)譯器讓我們得以直接使用新語法,這你所鐘愛的、提高你效率的、讓你的應(yīng)用更具維護(hù)性的語法 —— 然后將其編譯為可以在那些老頑固的瀏覽器上跑起來的東西,你希望市場上再也不要有這些老頑固了,可不幸的是它們還在。轉(zhuǎn)譯器在 JavaScript 社區(qū)如何書寫代碼這方面起到了變革性的作用?!?/p>
開發(fā)人員早期的使用和反饋,帶來了良性循環(huán),Herman 說?!稗D(zhuǎn)譯器已經(jīng)引發(fā)了新特性的超前使用與社區(qū)實驗的浪潮。這讓開發(fā)者們有能力在真實的生產(chǎn)環(huán)境中的應(yīng)用里面使用新特性,并且對更新到最新版本特性的頻度和時間有了控制。這也就意味著更多的開發(fā)者正在參與標(biāo)準(zhǔn)特性的早期審查,使他們在變化化的過程中有了更強(qiáng)的聲音,最終帶來更好的標(biāo)準(zhǔn)?!?/p>
“多虧有了轉(zhuǎn)譯器,未來版本的特性正在持續(xù)獲得大量的早期試用。(比如)裝飾器(Decorators)讓類定義中抽象通用模式(pattern)成為可能,它在 Web 框架如 Angular、Ember 及 React 中大受歡迎,” Herman 說道。Ember.js 社區(qū)很早就采用了 Babel,Herman 說這讓許關(guān)于模塊系統(tǒng)(module system)的多可用性反饋進(jìn)入到 ES 2015 中。
開發(fā)者的反饋也推動了裝飾器的標(biāo)準(zhǔn)化,Terlson 說。“早期在轉(zhuǎn)譯器中實現(xiàn)的特性真的是很大的、引人注目的特性,像裝飾器就是這樣;這對那些特性設(shè)計的迭代非常有幫助?!?/p>
“如果你所知道的某個特性真的能改善你的代碼和你所工作的應(yīng)用,” 他建議,“趕緊在轉(zhuǎn)譯器中做起來或使用 polyfill,用起來,然后給我們反饋?!?/p> 新特性,更快
轉(zhuǎn)譯器是解決新特性無法進(jìn)入 ES 標(biāo)準(zhǔn)除非其已被實現(xiàn)的雞生蛋還是蛋生雞的問題的一種辦法。不過瀏覽器廠商們不太愿意實現(xiàn)尚未標(biāo)準(zhǔn)化的特性,因為這可能導(dǎo)致開發(fā)者們無法與特性的標(biāo)準(zhǔn)保持一致,這些特性在標(biāo)準(zhǔn)化的過程中會有所變化。
ES 2015 不需要之前的實現(xiàn);“結(jié)果就是,” Terlson 解釋道,“在我們批準(zhǔn)某些特性如 Proxy 之后,實現(xiàn)者們遇到了標(biāo)準(zhǔn)中沒有體現(xiàn)的東西,所以在現(xiàn)實面前,我們不得不做修改。這體現(xiàn)出在批準(zhǔn)那些標(biāo)準(zhǔn)之前確保特性將按照標(biāo)準(zhǔn)實現(xiàn)有多重要。”類似問題還有尾調(diào)用優(yōu)化,這并非巧合,Zhu 提到了那些無法在轉(zhuǎn)譯器中嘗試的特性。
在新版本語言出爐之前,語言的維護(hù)者需要程序員們提供反饋。Terlson 認(rèn)為,轉(zhuǎn)譯器就是其中重要的一部分?!稗D(zhuǎn)譯器幫助我們得到語法上的反饋。擁有 Babel 和 TypeScript 這些轉(zhuǎn)譯器,我們真的很幸運(yùn),這讓我們在瀏覽器實現(xiàn)之前就能使用試驗新語法。對某些特性來說,我們相當(dāng)自信,如果有轉(zhuǎn)譯器 或 polyfill 外加瀏覽器,它們將會工作?!?/p>
轉(zhuǎn)譯器能比瀏覽器更快地開發(fā)新特性, Herman 指出,“Babel 由 JavaScript 實現(xiàn),而瀏覽器們是用 C++ 實現(xiàn)的,所以功能更容易做出來。一些特性要同整個瀏覽器整合起來,可能是更棘手的挑戰(zhàn)。JavaScript 引擎都有復(fù)雜的、多層 JIT 編譯的構(gòu)架,這常常意味著僅僅一個特性需要多次實現(xiàn),每層實現(xiàn)一次。而且相比實現(xiàn)新的 JavaScript 特性,瀏覽器引擎開發(fā)團(tuán)隊的責(zé)任更多,所以他們要衡量優(yōu)先級?!?/p>
轉(zhuǎn)譯器不可能給你提供所有新特性,Herman 指出,“某些特性,如 ES 2015 的 Proxy,或者當(dāng)前的 SharedArrayBuffer 提議,基本上不可能通過轉(zhuǎn)譯器來實現(xiàn)。其他的,像 ES 2015 的 Symbol,可以部分實現(xiàn),不過有一些已知的局限。這一類的問題,需要開發(fā)者們多注意,他們必須確保不會依賴那些轉(zhuǎn)譯器無法正確實現(xiàn)的行為?!?/p>
隨著 ECMAScript 標(biāo)準(zhǔn)的發(fā)展,轉(zhuǎn)譯器也不會將你同 JavaScript 的變化隔離開來。“需要提出一點(diǎn)警告,” Terson 提到,“我們會聽取使用轉(zhuǎn)譯器特性的開發(fā)者的反饋,有可能標(biāo)準(zhǔn)會因此變更。針對標(biāo)準(zhǔn),在其完成之前,我們可能做出重大改變,所以當(dāng)你使用超前于標(biāo)準(zhǔn)的特性時,我們會提出警告。”
即便如此,它們能幫助你過渡,Herman 說?!爱?dāng)升級轉(zhuǎn)譯器新版本的時機(jī)到來,讓其因?qū)嶒炚Z言特性不兼容的改變而打破你的代碼,這會很麻煩而且耗時不少。因此,像 Babel 這樣的轉(zhuǎn)譯器允許你設(shè)置對不穩(wěn)定性的容忍度,不過你還需要應(yīng)對更多的流失。另外,你可以采取更加深思熟慮的設(shè)置,以降低不兼容的變化帶來的風(fēng)險,同時限制自己在更小的穩(wěn)定的語言特性集中?!?/p>
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/87800.html
摘要:譯文地址譯唯快不破應(yīng)用的個優(yōu)化步驟前端的逆襲知乎專欄原文地址時過境遷,應(yīng)用比以往任何時候都更具交互性。使用負(fù)載均衡方案我們在之前討論緩存的時候簡要提到了內(nèi)容分發(fā)網(wǎng)絡(luò)。換句話說,元素的串形訪問會削弱負(fù)載均衡器以最佳形式 歡迎關(guān)注知乎專欄 —— 前端的逆襲歡迎關(guān)注我的博客,知乎,GitHub。 譯文地址:【譯】唯快不破:Web 應(yīng)用的 13 個優(yōu)化步驟 - 前端的逆襲 - 知乎專欄原文地...
摘要:然而,臨近規(guī)范發(fā)布時,有建議提及未來的版本號切換為編年制,比如用同來指代在年末前被定稿的所有版本。總得來說就是版本號不再那么重要了,開始變得更像一個萬古長青的活標(biāo)準(zhǔn)。 你不知道的JS(下卷)ES6與之未來 第一章:ES的今與明 在你想深入這本書之前,你應(yīng)該對(在讀此書時)JavaScript的最近標(biāo)準(zhǔn)掌握熟練,也就是ES5(專業(yè)來說是ES 5.1)。在此,我們決定全方面地談?wù)撽P(guān)于將近的...
摘要:在年成為最大贏家,贏得了實現(xiàn)的風(fēng)暴之戰(zhàn)。和他的競爭者位列第二沒有前端開發(fā)者可以忽視和它的生態(tài)系統(tǒng)。他的殺手級特性是探測功能,通過檢查任何用戶的功能,以直觀的方式讓開發(fā)人員檢查所有端點(diǎn)。 2016 JavaScript 后起之秀 本文轉(zhuǎn)載自:眾成翻譯譯者:zxhycxq鏈接:http://www.zcfy.cc/article/2410原文:https://risingstars2016...
摘要:值得慶幸的是,這三款預(yù)處理器語言的語法和語法都差不多。在這一節(jié)中,我們依次來對比一下這三款預(yù)處理器語言各種特性的異同之處,以及使用方法。預(yù)處理器語言支持任何變量例如顏色數(shù)值文本。 一、Sass、LESS和Stylus的語法 每一種語言都有自己一定的語法規(guī)則,CSS預(yù)處理器語言也不例外,在真正使用CSS預(yù)處器語言之前還有一個不可缺少的知識點(diǎn),就是對語法的理解。值得慶幸的是,這三款CSS預(yù)...
摘要:的新特性往往會增加代碼的,這些特性卻有助于緩解當(dāng)前的性能危機(jī),尤其像在手機(jī)設(shè)備這樣的新興市場上。聯(lián)合聲明我們短期目標(biāo)是盡快實現(xiàn)少于倍的性能改善。我們會繼續(xù)針對的特性提升其性能。定期發(fā)布高質(zhì)量文章。 作者:Alon Zakai 編譯:胡子大哈 翻譯原文:http://huziketang.com/blog/posts/detail?postId=58d11a9aa6d8a07e449f...
閱讀 1119·2021-11-18 10:02
閱讀 1374·2021-09-23 11:22
閱讀 2684·2021-08-21 14:08
閱讀 1703·2019-08-30 15:55
閱讀 1786·2019-08-30 13:45
閱讀 3304·2019-08-29 16:52
閱讀 3160·2019-08-29 12:18
閱讀 1707·2019-08-26 13:36