今年年初,我抱著誠懇的態(tài)度嘗試了一下 React。我自己以前是 Angular 用戶,所以在嘗試的過程中對這個庫所展示的理念一直抱有開放的態(tài)度。
剛開始用 React 的感覺很奇怪——這個世界里的所有事物都要以一種特殊的方式來構(gòu)造,其中需要用自動化處理程序來處理數(shù)據(jù)流。涉及到數(shù)據(jù)時,React 總有自己的一套強制單向數(shù)據(jù)流機制。
但這些并不是我放棄 React 的原因——是社區(qū)中那些玻璃心的狂熱信徒讓我受不了的。也許是因為我的 Angular 用戶背景,我會仔細(xì)觀察,在兩者間做出許多對比,結(jié)果引來了這幫人(他們大部分只會用 React),氣勢洶洶地要找我較量。有那么幾個月他們贏了,我撤退到了自己安全的 Angular 世界里。但是最近,我有機會在工作中用上了 React Native,所以想寫一寫自己對這個話題的誠實看法。
React 是一個庫——而庫必須與其他庫搭配使用才能解決特定問題。React 的問題解決能力主要體現(xiàn)在渲染前端界面和管理經(jīng)常變化的數(shù)據(jù)上。
React 的優(yōu)勢在于單向數(shù)據(jù)流,在面對突變和意外繼承時可以確保高度穩(wěn)定性和可預(yù)測性。React 非常討人喜歡的另一個因素是它處理關(guān)注點分離的方式。它顛覆了傳統(tǒng)的筒倉(silo)方法,也就是將 CSS、JavaScript 和 HTML 分離成單獨的文檔文件,并將它們放在同一個空間中以備處理。
從理論上講,在 Angular 中也可以實現(xiàn)基于關(guān)系的關(guān)注點分離,但不會像 React 中那樣是默認(rèn)方法,也沒那么直觀。
React 之所以能實現(xiàn)這一目標(biāo),是因為其原則是代碼組件都要維持在足夠小的體積上,從而使這些組件的域和邊界都易于檢測和理解。但這不是硬性規(guī)定,組件的最終大小是由開發(fā)者確定的。
React 的流行主要是因為市面上缺少像樣的起步架構(gòu),人們很需要這種架構(gòu)來上手。React 與 Angular 是不一樣的,在 Angular 中需要用 CLI 來為框架生成必要的設(shè)置,而 React 需要的準(zhǔn)備工作非常少。
但很多人在對比它們的時候都會犯一個錯誤。React 是一個庫,這意味著它體積很小,功能專一,且有針對性。但 Angular 是一個框架,這意味著它是符合同一套規(guī)則的一系列庫的集合。因此,說 Angular 臃腫是不公平的,因為它倆并不是同一類事物。
框架決定了開發(fā)代碼的方式,并充當(dāng)所有關(guān)聯(lián)庫的協(xié)調(diào)者。它根據(jù)一組原則或規(guī)則確保所有部分均按預(yù)期工作。這是必要的,因為當(dāng)你有多個庫需要搭配使用時,為了讓程序平穩(wěn)運行,你需要有某種共同的基礎(chǔ)。
React 不是干這個的。
它從來都不是為這個目標(biāo)設(shè)計的——因為它的唯一目的就是將事物渲染到屏幕上,并讓你的數(shù)據(jù)以干凈的方式連接到 DOM。這就是為什么要將狀態(tài)管理委派給 Redux 的原因。如果你想做的事情不只是處理數(shù)據(jù)和 DOM,就需要找第三方應(yīng)用程序來解決問題。
這也沒錯。這就是 React 的機制,這就是 React 的用途所在。
Angular 與 React 的爭論似乎持續(xù)了很長時間。但這本質(zhì)上不是誰更好的問題,而是誰更適合你開發(fā)需求的問題。
我看到很多人最后都會拿出來的論點,就是說 React 是由 Facebook 創(chuàng)造的。但并不是所有事情上 Facebook 的出身都有那么大的意義。是的,它是由 Facebook 創(chuàng)造的,但 React 也不是他們唯一使用的技術(shù)。在他們的后端,也許還有前端,還有其他很多東西。
如果我們要談出身,那么 Angular 與 Google 有關(guān),Java 來自 Oracle,.Net 還是 Microsoft 的心血呢。
需要承認(rèn),React 比 Angular 更容易上手——特別是對于開發(fā)新手來說,他們對前端代碼并沒有清晰的認(rèn)識。他們可能是自學(xué)成才的,或者可能是其他領(lǐng)域經(jīng)驗豐富的工程師轉(zhuǎn)型過來的。不管用戶是什么水平,React 都像是 JavaScript 剛誕生時的樣子——上手很簡單,但是用法幾乎沒什么限制。
React 作為一個庫所面臨的問題是沒有結(jié)構(gòu)上的約束——只有語法的約束。這可能導(dǎo)致應(yīng)用結(jié)構(gòu)松散,缺乏命名約定,文件夾結(jié)構(gòu)(如果有這種東西)隨意混亂,生產(chǎn)部署中還可能打包進去很多冗余文件。
從理論上講,如果你不遵守那些最佳的編程方式,那么做出來的任何事物都可能落得這樣的下場。可是這些最佳方法并沒有在代碼中通過約束固定下來。
React 是 JSX,它是 JavaScript 的一種變體,這意味著你仍然需要了解 JavaScript 的實際機制。React 可能比 Angular 更接近 JavaScript,Angular 在結(jié)構(gòu)上更像是通過 TypeScript 實現(xiàn)類型轉(zhuǎn)換和控件的傳統(tǒng)編程語言。
這就是為什么你需要對 JavaScript 的機制有深入的了解,才能成為一名高水平、高效率的 React 開發(fā)人員。你需要深入研究的還有其他一些事物,其中包括狀態(tài)和數(shù)據(jù)流的概念——因為這是 React 所打交道,并且優(yōu)勢很大的兩大主題。
一旦你從菜鳥階段成長起來,架構(gòu)模式和結(jié)構(gòu)就變得越來越重要。做電商應(yīng)用時,你不能把整個銷售系統(tǒng),包括單品推薦、交叉推薦和歷史購買推薦的代碼都塞進根文件夾里面。
React 的入門教程并不會教這些內(nèi)容。實際上,大多數(shù)在線編程教程并沒有認(rèn)真去講架構(gòu),也不會教你如何實現(xiàn)與框架或庫相關(guān)的元事物。
https://medium.com/better-programming/a-comprehensive-guide-on-the-meta-knowledge-you-need-to-accelerate-your-code-creation-process-d0f5f3b67473
雖然代碼編譯后就沒人能看到這些東西了,但是你的開發(fā)同事或接手你代碼的人是會看到的——如果你的代碼一團糟,改起來要人命,他們會發(fā)瘋的。
React 作為一個庫,意味著具有高度可移植性。你隨便把它放在哪里都能正常工作——就像 jQuery 和 Ajax 那樣。有時我們需要做微前端,抑或是處理一些和舊式系統(tǒng)有著密切聯(lián)系的過渡型應(yīng)用,這時 React 的可移植優(yōu)勢就非常有用了。
它與 React Native 的關(guān)系也是一個優(yōu)點,它們改變了漸進式 Web 應(yīng)用的制作方式。與其他基于 JavaScript 的框架(例如 Ionic)不同的是,Ionic 基本上就是打包你的 Angular、Vue 或 React 代碼以生成能發(fā)布到商店的應(yīng)用,而 React Native 則更進一步,會將代碼轉(zhuǎn)換為蘋果和谷歌要求的原生語言。
因此,React Native 不會把網(wǎng)站偽裝成應(yīng)用程序,而是將其轉(zhuǎn)變?yōu)閷嶋H的應(yīng)用程序——從而提供更好的整體性能,以及更好的途徑來訪問設(shè)備上的原生功能(如地圖、指南針、圖像和相機等)。代碼本身還是以 React 為主,但是變成了適應(yīng)各種移動設(shè)備的 React 版本。
作為從 Angular 住民踏入 React 世界的用戶,我最煩 React 的事情之一,就是它缺乏很多常用功能,例如自動數(shù)據(jù)綁定等。而且為了給它開路,你得找來幾乎所有基于 JavaScript 的庫才行。作為對比,Angular 這邊你只要選一個已經(jīng)打包進 Angular 的可用庫即可。你只要記得導(dǎo)入它,然后就萬事大吉!一切都很順利,很正常。但 React 很大程度上要依賴第三方庫,這些庫可能彼此之間看不對眼,或者不能很好地與 React 搭配工作。
在 React 社區(qū)中,關(guān)于組件設(shè)計和組件組織的討論也很少——或者只是我沒找對地方?隨著項目的發(fā)展,你經(jīng)常會發(fā)現(xiàn)自己毫無必要地把狀態(tài)推到樹上面去了,結(jié)果在全局空間造成了意外的污染。一般會用 Redux 來解決這個問題——但是 Redux 并不是 React,前者是一個完全獨立的實體。
先聲明一下,這些都只是我個人的看法,都是基于我對這個庫已有的經(jīng)驗。總的來說,React 的社區(qū)非常棒,但我在其中遇到的一些敵意在 Angular 世界中并不那么常見。
那么 React 被過譽了嗎?
這實際上取決于你要與哪些圈子的粉絲打交道,而且什么事物都有自己的怪癖。React 并不是前端解決方案的終極圣杯,但它已經(jīng)做得夠好了,所以非常有用。
當(dāng)我也成長為老一代開發(fā)者,看過了那么多項目花開花謝,我再學(xué)習(xí)新技術(shù)時就不會把它們當(dāng)成已有事物的終極解決方案了,而只會把它們看作是升級更新,并加入到我自己的知識庫里。
React 本身也不是全新的東西。它只是將 JavaScript、HTML 和 CSS 打包在一起的另一種途徑。Angular 剛出來的時候用的也是這種方法,之前的 jQuery 也一樣。
業(yè)界永遠(yuǎn)都在追捧下一個熱點,但最佳方法就是學(xué)習(xí)如何正確地編寫代碼,然后把這件事做好即可——因為不管現(xiàn)在的熱點是什么框架、庫、支架之類花哨的東西,都是無關(guān)緊要的。作為開發(fā)人員,你的水平取決于你能以多快的速度,憑借良好的編程基礎(chǔ)來適應(yīng)當(dāng)前的需求和環(huán)境。
感謝你的閱讀。
原文鏈接:https://medium.com/better-programming/is-react-overrated-c7f8efb75e3e