停止過度設(shè)計(jì)中等規(guī)模的前端應(yīng)用程序
開發(fā)一個小型應(yīng)用程序很簡單。另一方面,開發(fā)大規(guī)模應(yīng)用程序極其困難,但至少有大量可用的資源可以指導(dǎo)你。
然而,大多數(shù)實(shí)際應(yīng)用存在的中間地帶,卻鮮少受到關(guān)注。在軟件開發(fā)領(lǐng)域,不陷入過度工程化的陷阱,寫出可維護(hù)的代碼的做法,已經(jīng)越來越少見了。
讓我們探索哪些流行的成分可能對中型應(yīng)用有益,并評估它們是否會幫助你管理復(fù)雜性,或者是否會制造出比解決的問題更多的問題。
Typescript
YES ?
首先,我們來解決這個問題?,F(xiàn)在是2023年,對于不在你的開發(fā)流程中使用TypeScript,實(shí)在沒有任何借口。所有頂級的前端框架都推薦使用它,而且它們的構(gòu)建過程使得開始使用變得非常容易。
Typescript是JavaScript的超集,它增加了類型注解、接口以及其他功能,使編寫可維護(hù)和可擴(kuò)展的代碼變得更加容易。它可以幫助在開發(fā)過程的早期捕捉錯誤,并且可以使得隨著應(yīng)用程序的增長,重構(gòu)代碼變得更加容易。
狀態(tài)管理
YES ?
狀態(tài)管理是任何中等規(guī)模前端應(yīng)用的另一個重要考慮因素。隨著你的應(yīng)用復(fù)雜度的增長,管理狀態(tài)變得越來越困難。有許多庫和框架可以幫助解決這個問題,例如Redux,MobX,Vuex和Pinia。這些工具可以幫助你維護(hù)一個一致的應(yīng)用狀態(tài),并使添加新的功能和特性變得更容易。然而,要注意全局狀態(tài)會產(chǎn)生耦合,你應(yīng)該強(qiáng)烈考慮將你的存儲分割成多個模塊。另外,避免濫用它來處理那些不應(yīng)全局可用的事物,如組件狀態(tài)。
功能標(biāo)志
YES ?
功能標(biāo)志,也被稱為功能切換,允許我們在運(yùn)行時和無需新的部署中切換代碼庫中的特定功能。這是一種強(qiáng)大的技術(shù),有助于發(fā)布新功能,進(jìn)行A/B測試,并有效管理開發(fā)和部署過程。它們可以帶來更大的靈活性,更快的發(fā)布,以及與部署新功能相關(guān)的風(fēng)險降低。有各種庫和工具可用于在不同的語言和框架中實(shí)現(xiàn)功能標(biāo)志。
測試
YES & NO ?
測試是任何應(yīng)用程序開發(fā)過程的重要部分。單元測試、集成測試和端到端測試是一些常用的測試方法,它們可以提高代碼質(zhì)量,并在長期內(nèi)節(jié)省時間??蓽y試的代碼通常是更好的代碼,而在開發(fā)早期創(chuàng)建測試用例可以確保應(yīng)用程序會有更少的錯誤,并且在新人加入時會更容易。
另一方面,在大規(guī)模應(yīng)用中,你可能會遇到許多在較小代碼庫中可能并不必要的測試類型。其中包括變異測試、負(fù)載測試、壓力測試、性能測試、視覺測試、快照測試等等。
在處理中等規(guī)模的應(yīng)用程序時,找到在編寫足夠的測試以確保穩(wěn)定性和不過度工程化測試過程之間的平衡非常重要。我們應(yīng)該專注于創(chuàng)建一個堅(jiān)實(shí)的單元測試和集成測試基礎(chǔ)來覆蓋應(yīng)用程序。
CI/CD
YES ?
現(xiàn)代軟件開發(fā)的另一個重要部分是持續(xù)集成和交付。通過CI/CD,我們可以自動化構(gòu)建、測試和部署過程,節(jié)省時間并減少錯誤。使用一個好的CI/CD工具可以使我們的開發(fā)過程更高效,并確保我們的應(yīng)用程序始終準(zhǔn)備好進(jìn)行部署。
領(lǐng)域驅(qū)動設(shè)計(jì)
NO ??
領(lǐng)域驅(qū)動設(shè)計(jì)是一種軟件開發(fā)方法,強(qiáng)調(diào)對核心業(yè)務(wù)領(lǐng)域的建模,構(gòu)建開發(fā)人員和利益相關(guān)者共享的普遍語言,并根據(jù)領(lǐng)域的復(fù)雜性設(shè)計(jì)軟件組件。雖然在具有復(fù)雜業(yè)務(wù)邏輯和多個團(tuán)隊(duì)協(xié)作的大型應(yīng)用程序中,DDD可能非常有用,但對于中型應(yīng)用程序來說,可能會過度。
對于中等規(guī)模的應(yīng)用程序,簡潔的架構(gòu)和注重清晰、模塊化代碼的重點(diǎn)往往足以確??删S護(hù)性和可擴(kuò)展性。DDD可能會增加不必要的開銷和復(fù)雜性,這可能不會為項(xiàng)目帶來顯著的好處。相反,考慮采用更簡單的架構(gòu)模式和實(shí)踐,以促進(jìn)代碼組織、關(guān)注點(diǎn)分離和可重用性。
Hexagonal Architecture 六邊形架構(gòu)
NO ??
六邊形架構(gòu),也被稱為端口和適配器,是另一種旨在在應(yīng)用程序的核心業(yè)務(wù)邏輯和其外部依賴(如數(shù)據(jù)庫、API和用戶界面)之間創(chuàng)建清晰分離的架構(gòu)模式。這種分離允許更大的靈活性、可測試性和可維護(hù)性。
與DDD類似,實(shí)施六邊形架構(gòu)對于具有復(fù)雜業(yè)務(wù)邏輯和眾多外部依賴的大型應(yīng)用程序可能是有益的,但對于中型應(yīng)用程序來說,這絕對是過度設(shè)計(jì)。
微前端
NO ??
微前端是一種流行的架構(gòu)模式,它將大型應(yīng)用程序分割成基于特性或領(lǐng)域的較小、獨(dú)立的應(yīng)用程序。這些較小的應(yīng)用程序可以獨(dú)立開發(fā)、測試和部署,從而實(shí)現(xiàn)更大的可擴(kuò)展性和靈活性。
然而,對于中等規(guī)模的應(yīng)用程序,引入微前端可能并不必要,反而可能增加復(fù)雜性和開銷,超過其帶來的好處。更傳統(tǒng)的單體架構(gòu),結(jié)合良好組織的代碼庫和適當(dāng)?shù)慕M件使用,可能更適合大多數(shù)中等規(guī)模的應(yīng)用程序。如果將來有需要,可以重新考慮過渡到微前端的決定。
CDN
YES ?
使用CDN是一種快速、簡單且成本效益高的方法,通過緩存內(nèi)容并從離終端用戶更近的服務(wù)器提供服務(wù),可以提高您的應(yīng)用程序的性能和可靠性。
Linting
YES ?
Linting是一種分析代碼以檢測潛在錯誤、不一致性和偏離已建立編碼標(biāo)準(zhǔn)的過程。這是一種維護(hù)代碼質(zhì)量、提前捕獲問題以及提高整體可讀性和可維護(hù)性的簡單快速的方法。
Observability 可觀察性
YES ?
中等規(guī)模的應(yīng)用程序是觀察性開始變得至關(guān)重要,并可能節(jié)省大量時間和金錢的時候。通過在您的應(yīng)用程序中設(shè)置觀察性,我們可以輕松監(jiān)控、理解并排除系統(tǒng)性能和整體健康狀況的問題。
有多種工具和技術(shù)可用于在你的應(yīng)用程序中構(gòu)建可觀察性,例如日志記錄、度量收集和分布式追蹤。目標(biāo)是快速識別并解決問題,保持應(yīng)用程序的性能,并盡量減少停機(jī)時間。
Accessibility 無障礙性
YES ?
無障礙并不僅僅是一個選項(xiàng),它更是一項(xiàng)責(zé)任!確保你的應(yīng)用程序?qū)λ杏脩?,包括那些有殘疾的用戶,都是可訪問的,這不僅是正確的做法,而且在某些國家,這也是法律要求。作為前端工程師,我們有責(zé)任創(chuàng)建無障礙的網(wǎng)站,并且我們應(yīng)該將其作為我們工作流程的一部分,納入我們的完成定義中。
Design system 設(shè)計(jì)系統(tǒng)
NO ??
設(shè)計(jì)系統(tǒng)是一套可復(fù)用的組件、指南和設(shè)計(jì)原則的集合,用于在多個應(yīng)用程序或平臺上設(shè)計(jì)一致的用戶界面。雖然對于擁有多個產(chǎn)品和團(tuán)隊(duì)的大型組織來說,實(shí)施設(shè)計(jì)系統(tǒng)可能非常有益,但對于中等規(guī)模的應(yīng)用程序來說,這可能是不必要的。
而不是投入時間和資源去創(chuàng)建一個全面的設(shè)計(jì)系統(tǒng),你應(yīng)該專注于根據(jù)你的需求配置現(xiàn)有的組件庫,并在你的應(yīng)用程序中建立一套指南和可重復(fù)使用的組件,以保持一致性并提高開發(fā)者的效率。
總結(jié)
過度工程化是所有惡的根源。當(dāng)涉及到中等規(guī)模的應(yīng)用開發(fā)時,我們大多數(shù)人都有罪。有些工具和技術(shù)是至關(guān)重要的,而有些則不值得投入,但重要的是要設(shè)定并維持一種通用的編碼風(fēng)格,利用自動化防止錯誤進(jìn)入生產(chǎn)環(huán)節(jié),并保持技術(shù)債務(wù)的低水平。