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