JavaScript 不再像以前那樣

現在很多人都在抱怨:JavaScript 的狀態是多麼混亂,隨着生態系統不斷擴大,一個問題有不同的解決方案,而且似乎沒有一個是社區標準。說到 UI 框架,有十幾種:React Angular、Vue.js、Svelte 等流行框架,以及 Inferno、pReact、Riot、Polymer、Aurelia、Ember、Knockout、Mithril、Dojo 等。

打包工具?CSS 框架?CSS-in-JS 工具?包管理器?測試框架?許多概念蓬勃發展:SPA、SSR、Ant、微前端...

15 年前,Web 不像現在的平臺那麼嚴謹。當時 JavaScript 只是一個操作 DOM 節點併發出 AJAX 請求的玩具。如果你知道如何使用 Vanilla JS 在棋盤中製作動畫,那你就是一個很酷的孩子。JQuery 在 2006 年迅速崛起,它簡化了工作流程,以至於沒有必要再對 JavaScript 提出更多的要求。

這不僅僅是一個框架的問題,JavaScript 本身存在很多問題。缺乏類型系統是很糟糕的,類型的強制是很奇怪的,undefined 和 null 的存在令人困惑。以至於有開發者決定乾脆停止使用 null,類似的問題數不勝數。

Douglas Crockford 曾寫了一本著名的《JavaScript:the good parts》,這是許多經驗豐富的 JavaScript 工程師的重要學習資源。這本書成爲下面這幅著名圖畫的一部分,它展示了一個明確的信息:「整個 JavaScript 只有一個子集是 "好的"。」

動物代表了書的重量

但是,很多人往往會忘了一件事。

JavaScript 已經 26 歲了

1995 年,來自網景公司的 Brendan Eich 在短短 10 天內開發了一種受 Java 啓發的語言。它開始被命名爲 LiveScript、Mocha,最後命名爲 JavaScript。

該語言隨後被嵌入到網景瀏覽器中,而 Microsoft 爲 Internet Explorer 設計了自己的 JScript 語言(ECMA 規範的一種實現),它作爲網景的第一個真正競爭者進入瀏覽器市場。

這就是 Internet Explorer 的開始,它的噩夢在版本 7 達到高潮,當時我們必須爲項目編寫特定的 IE 代碼。2007 年火狐和 Opera 加入了臭名昭著的瀏覽器大戰,Chrome 也在一年後問世。

儘管如此,web 並沒有等待戰爭結束。許多增強功能將被添加到 JavaScript 中,ECMA 委員會有一項職責:不要破壞 web。直到今天,沒有其他語言能像 JavaScript 那樣長久。

從誕生之日起,JavaScript 用了將近 10 年的時間才成爲一種強大的語言,嵌入了客戶端 - 服務器通信,並在 Web 上提供了豐富的動態體驗。

隨着技術的發展,無論是在功能上還是在美學上,web 都有必要緊跟技術的發展。JavaScript 實際上是 Web 的動態客戶端語言,到目前爲止還沒有競爭對手。但它必須接受自己的缺陷,同時向更現代的設計邁進。應用程序變得更重、更復雜,JavaScript 不再是一個玩具。

這就導致了 JavaScript 超集的誕生,即 CoffeeScript 和 TypeScript,後者現在是市場的贏家。將類型引入 JavaScript 可以顯著增強可維護性,並簡化協作。但它在這個過程中添加了一個構建步驟,這在當時還不是 JavaScript 工具包的一部分。

這時出現了一個大玩家,一個將改變一切的人:Node.js。幾年後,NPM 緊隨其後,它最終解決了每種編程語言的一個常見問題:「依賴關係管理」。這一演變成爲了 web 客戶端開發的一個巨大轉變。

正如你所看到的,JavaScript 有一個巨大的背景,它無法擺脫,否則 web 就會崩潰。委員會也別無選擇,只能保留大部分內容,同時添加新功能以彌補缺陷。ECMAScript 2015(ECMA 6.0)將類語法引入 JavaScript,隨後 ECMAScript 2016(ECMA 7.0)和 ECMAScript 2017(ECMA 8.0)將 promise、generators、async/await 添加到 JavaScript 中。

JavaScript 的遺留問題是無法在沒有不可估量的後果的情況下改變的。我們對此無能爲力。JavaScript 註定會保留其舊的缺陷。

而好消息是:避免這些缺陷是比較容易的。

JavaScript 被高估的痛苦

在 Twitter 上有很多關於奇怪強制、浮點錯誤、undefined 實際上是兩個值(要麼是屬性不存在,要麼是屬性存在但未定義)等問題。

但它並沒有就此止步,所有的這些缺點都是出了名的糟糕。但作爲一個初學者,我們中有多少人真正遭受過浮點轉換的痛苦?大多數問題只會影響到少部分開發者。解決強制問題只需要再加一個等號,使用嚴格的等式,然後完全消除強制。

開發人員確實不應該與語言的缺陷作鬥爭,但不幸的是,事實就是這樣。然而,就我的工作而言,我還沒有遇到語言本身的問題,它所需要的只是避免不好的部分。

JavaScript 很有趣

我甚至要說一些可能會冒犯純粹主義者的話:我用 JavaScript 編程很有趣。首先,我是一名 C 語言程序員。與 JavaScript 相比,該語言更簡單(不是更容易),但互動性要差得多。我也做了很多 PHP,即使在今天,這種語言的結構也不如 JavaScript 優雅:傳遞迴調、使用 Promise、在數組上鍊接方法,所有這些都是傳統 PHP 中的一個大禁忌。

但在 JavaScript 中,通過其集成的垃圾收集器,一切都變得簡單:

所有這些功能不一定是 JavaScript 獨有的,但是使用它們非常有趣。如果仔細應用一些編程風格的原則,比如 SOLID 原則或 GoF 設計模式,再加上函數式編程範式和對 JavaScript 怪癖的理解,那麼就爲可維護性鋪平了道路。我堅信開發人員快樂的最重要因素仍然是在現有代碼庫上便利的工作,因爲這是我們每天都要處理的問題。我們厭倦了嗎?

我們有很多框架,它們或多或少都在做同樣的事情,儘管有所不同。這些選擇讓我們很多人陷入困惑,因爲在工作中我們需要時間去評估一個工具表現如何。我們是有選擇權的,就像給嬰兒多個玩具玩一樣。這就是創新的驅動方式。

我們不需要學習相關的每個框架和每個工具。在過去的四年裏,我主要使用 React、 Angular 和 Vue.js,還有一些 Svelte。我瞭解足夠多的 Webpack 和 Babel 來讓我的應用程序正常工作,這已經足夠了。

「學習工具的原理和概念比使用它更有意義。」

JavaScript 不再像以前那樣

「JavaScript 不再是人們可以嘲笑的玩具」。它正在爲每個網站來提供豐富的交互,這些都是現在司空見慣的事情。

的確,JavaScript 有缺點,而且它不會很快擺脫這些缺點。幸運的是,只要稍加小心,就很容易避免這些問題。

是的,有很多框架,時不時會有新的框架出現,我們被反覆告知要保持最新狀態。但是在過去的十年裏發生了多少重大突破?

舉幾個例子:Angular(SPA)、Babel(Transpiler)、React(聲明式 SPA)、Webpack(打包)、Svelte(靜態生成站點)和 JAM Stack、React-Native/NativeScript(用於構建原生應用程序的 JS )。

大多數框架和庫都或多或少地圍繞着相同的想法,這當然需要時間來掌握,「但是一旦學會,這些知識不需要再次學習就可以與其他工具一起使用」

與此同時,有些人仍在使用 jQuery,並對它感到滿意。看起來那些人並沒有因爲疲勞而筋疲力盡。

「JavaScript 不再像以前那樣了」。它長大了,但還沒有成熟。

作者:Anthony Cyrille

譯者:CUGGZ

原文:https://javascript.plainenglish.io/javascript-is-not-what-it-used-to-be-de4c623f3db5

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/MZFlAyd4eUYgHMWEAR4Vfw