打工人最愛技能:JavaScript的未來會走向何方?
本文轉(zhuǎn)載自公眾號“讀芯術(shù)”(ID:AI_Discovery)
作為一個見證了過去17年編程語言發(fā)展的軟件開發(fā)者,筆者試圖在本文中對JavaScript進行一些預(yù)測。
如今,JavaScript無處不在,不僅僅應(yīng)用在前端(瀏覽器)和后端(Node和Deno),也包括手機、電腦桌面軟件,甚至兩者的混合應(yīng)用。它已經(jīng)成為2020年求職人最想擁有的工作技能之一(根據(jù)StackOverflow的開發(fā)者調(diào)查)。
但為何會如此呢?這對JavaScript的未來又意味著什么?JavaScript的發(fā)展是否會順風順水?未來會不會有一個更新更好的語言誕生,從而推翻JavaScript無所不能的地位?本文將探討一下這些可能性。
是什么讓JavaScript如此受歡迎?
不管你是喜歡還是討厭,JavaScript的流行都是毋庸置疑的。根據(jù)TIOBE的流行指數(shù),在排名前十的語言中,JavaScript目前排在第七位。
根據(jù) StackOverflow的2020年開發(fā)者調(diào)查,最受歡迎的編程語言正是Java:
這些不是隨機數(shù)字或有偏見的民意調(diào)查,這些數(shù)據(jù)可以分析出我們的市場,對全球數(shù)以百萬計的開發(fā)者進行調(diào)查,一切都在表明JavaScript是2020年的熱門語言之一,對此你怎么看?
當然,這個問題可能有很多不同的答案,主要取決于你在挑選編程語言時看重什么,這是我的看法:
- 背后有一個龐大的社區(qū)。
圍繞著這樣一個事實,發(fā)生了許多有趣的故事:JavaScript外部框架可能比實際開發(fā)者使用的更多。雖然這可能是一個夸張的說法(注意筆者這里說的是 "可能"),但這源于一個事實,那就是我們有這么多的人,試圖讓這門語言成為我們自己的語言,此舉貢獻巨大。這并不是一件壞事,證明了這是一個充滿生命力并不斷嘗試發(fā)展的社區(qū)。
當筆者不得不使用其他語言時,非常懷念的一件事是,人們可以從原社區(qū)中獲得大量的支持和幫助。這絕對是一個進步的標志,此舉還有待完善,并有望在未來取得更多的成就。
- 適當?shù)陌l(fā)展方式。
撇開框架和庫不談,語言本身也在不斷發(fā)展。不過值得慶幸的是,這種改變并不是由一個實體控制的。
要澄清一下:雖然JavaScript本身(這個術(shù)語)是由Oracle所擁有的,但這門語言是要遵循ECMAScript的規(guī)范。而這些規(guī)范其實是由社區(qū)本身間接控制的,并由TC39委員會來監(jiān)管和組織。
通過考慮所有不同的建議以發(fā)展語言,并不斷運行直到語言足夠成熟。之后,如果想保持兼容的話,就由例行程序來實現(xiàn)這些更新,而且此后瀏覽器之間還存在紛爭。
作為一個開發(fā)者,必須努力保持在兼容性和標準的范圍內(nèi),因為你更希望你的代碼能跨瀏覽器兼容。現(xiàn)在情況已經(jīng)不是這樣了,所有的例行程序都在努力跟上ECMAScript的最新版本。
· 一個生機勃勃的生態(tài)系統(tǒng)。
這與第一點很像。有更多的前端框架可以嘗試,沒必要去學(xué)習(xí)所有的框架。每天僅NPM中分享的模塊就數(shù)以百萬計。
這給剛開始嘗試該編程語言的人制造了很多麻煩,但同時也吸引了更多的人加入,不同的框架和模塊最終都會達成同一件事,只是方式不同而已。而這些不同的方式有助于引起更多個人開發(fā)者的共鳴。畢竟,React、Vue和Angular都能幫助開發(fā)者創(chuàng)建同樣的APP,只需要選擇自己喜歡的那一款即可。
那么,綜合幾年前的情況以及它的發(fā)展歷程,你如何看待JavaScript的未來?
這絕對是一個很難回答的問題,先看看筆者的想法。
近期變化
在過去的幾年里,這門語言正在不斷發(fā)展。如果你是JavaScript的新手,也許還沒有注意到,從ECMAScript 第5版到第6版有一個質(zhì)的飛躍,在未來的版本中應(yīng)該也會發(fā)生許多改動。如果它繼續(xù)保持現(xiàn)在的路徑和發(fā)展速度的話,筆者認為不久之后它可能會這樣……
作為目標語言的JavaScript
即使JavaScript擁有令人驚嘆的社區(qū),為開發(fā)者提供工具和框架做了大量工作,卻仍然有很大一部分人沒有理由地討厭JavaScript。
是的,沒看錯,確實有人討厭它,或者至少不喜歡它的大塊頭,認為自己可以把它做得更好。于是,就有了CoffeeScript和后來的Dart以及現(xiàn)在的TypeScript這樣的項目。
這并不是壞事,事實上,這是一個非常好的機會,讓JavaScript不僅可以直接被全世界的開發(fā)者廣泛使用,還可以成為很多transpiler創(chuàng)造者的目標語言,試圖給開發(fā)者提供其他選擇。
本質(zhì)上,這場運動將為JavaScript打開大門,通向一個不同的浩瀚宇宙。自從Node.js進入市場并流行以來,JavaScript不再是 “前端語言”,允許公司簡化他們的技術(shù)堆棧去形成一個跨領(lǐng)域的單一語言。
想一想,如果你也能用Python或Ruby做到這一點,會發(fā)生什么?這并不是多么瘋狂的想法,過去已經(jīng)有項目試圖實現(xiàn)它,我們可能只是需要更多的時間。
前端開發(fā)的問題(筆者認為這是唯一的問題)是,你需要學(xué)習(xí)JavaScript才能進行工作。這與后端世界完全相反。目前,瀏覽器只允許一種語言為王,那就是JavaScript,如果想要更多的語言,就必須把你的代碼編譯(或者說是移植)成JavaScript。
當然,還有WebAssembly,如果他們有更多的能力去訪問其他領(lǐng)域,如DOM,它很可能會取代JavaScript。但現(xiàn)在它只能在一個非常狹窄的領(lǐng)域發(fā)揮作用:前端的大量計算。這是一個性能工具,而不是一個完全獨立的前端開發(fā)環(huán)境。
演變的例子
JavaScript發(fā)展到現(xiàn)在的另一個方式是通過社區(qū)開發(fā)的框架看到社區(qū)的需求。如果你已經(jīng)使用JavaScript有一段時間了,特別是從ECMAScript 5開始,你可能會記得lodash和underscore等庫。
對項目來講,這些庫都是必要的,因為它們?yōu)檎Z言增加了額外的功能,如map、some、find、reduce、get、set、merge等方法。雖然在最近的更新中,有些功能已經(jīng)滲透進語言本身,但這些庫依舊有存在的必要性。
比如ECMAScript 6,增加了很多數(shù)組方法,給編程算法帶來了相當大的提升??蛇x鏈使得 get 方法被淘汰,或者說幾乎被淘汰。傳播操作符也幾乎淘汰了merge 方法,而這個列表還在繼續(xù)更新。一個功能越是流行,TC39委員會就越會嘗試將其納入到語言中。
另一個明顯的例子是如何引入類。JavaScript試圖在一個面向使用者的世界中保持初心,但它失敗了。要么是因為沒有足夠的擁護者,要么是因為沒有正確的文檔化。但是有那么多的開發(fā)者試圖強行在上層建立一個OOP模型,于是最終在上層添加了一個薄薄的OOP層。
起初這很浮于表面,但隨著不久之后私有字段的加入,它正在慢慢演變成一個更成熟的模型。道阻且長,這只是語言演變的一個例子,說明這門語言是如何發(fā)展的,盡管違背了它的初衷,但開發(fā)者社區(qū)的力量在支持它。
最后一個新增的框架是Svelte框架,它試圖將反應(yīng)性的概念帶入語言本身,不像其他框架,比如React,它反而試圖為開發(fā)者提供工作方法,將JavaScript還沒有準備好的概念強加給他們。
使用Svelte框架,可以編寫這樣的代碼:
- <script>
- let count =0;
- functionhandleClick() {
- count +=1;
- }
- </script>
- <buttonon:click={handleClick}>
- Clicked {count} {count ===1?'time':'times'}
- </button>
有一個按鈕,點它標簽值就會更新。當然,目前這需要編譯成實際的JavaScript,你估計需要多長時間才能將類似的例子吸收到合適的ECMAScript規(guī)范中?