「乾貨貼」Nuxt Apps中的領域驅動設計實踐

2020-12-11 InfoQ技術實驗室

我在Vue Storefront和Vue Storefront Next中實驗 Vue apps 的領域驅動方法有一段時間了。使用這種方法能顯著改善你的代碼庫的可維護性和複雜度。在這個系列,我想分享一些在 Vue Storefront 中對我們有效,且容易應用到任何 Vue 應用程式中的模式。

我將展示如何在 Nuxt 和「普通」Vue 項目中如何應用這些模式。本文中,我們將聚焦理論和 Nuxt 實現。

什麼是領域驅動設計?

領域驅動設計(Domain-Driven Design,DDD)概念是,將業務概念優先於代碼庫的其它分類類型(例如,按文件類型分組)。這意味著,你應該基於你主要的業務領域(「問題」)及其子領域(問題的細分部分)來組織你的代碼。例如,在電子商務領域,我們有產品目錄、客戶、訂單、庫存等子領域。

雖然 DDD 概念來自面向對象編程,依賴於類及其關係,但其核心理念可以很容易地應用到其它範式。

為什麼領域驅動設計很棒?

領域驅動設計越來越受歡迎最簡單的解釋是,它是一種非常簡單的模式,在大多數情況下,它都會在編程最困難和最痛苦的領域之一——代碼維護性上帶來顯著改善。

我記得,我在思考組織代碼庫的最佳方式時度過的無眠之夜和漫長的淋浴。如果你曾經嘗試過,你就會明白這項任務非常困難,而且結果永遠不會完美,因為你必須考慮到你的項目在將來可能演變的所有可能的方式。隨著時間的推移,我們對試圖解決問題的理解不斷增長,這會帶來更有效的解決問題的方法,從而改變我們最初的方案。

我們都經歷過並且知道,改變最初的架構會付出多大的成本。

這就是領域驅動設計的亮點。基於業務需求對系統進行建模要容易得多,因為這個方案不受技術限制和困難的影響。我們改變核心業務需求的頻率比改變底層技術的頻率要少得多。

此外,領域驅動設計推崇在編寫代碼時考慮實際的業務需求,這意味著我們根據業務功能(例如客戶)而不是技術術語(組件、存儲、服務),來組織我們的代碼和文件結構。這種管理代碼的方式讓代碼更容易維護。

下圖顯示了一個「標準的」Vue 文件結構 vs 基於業務領域的文件結構:

如果與某個功能相關的所有東西都放在一個地方,就會很容易理解它是如何工作的,因為不存在忽略某些部分的風險。完全刪除某個功能也同樣非常簡單,因為這個功能相關的代碼不會分布在整個代碼庫中。

另一個好處是,我們只需查看應用程式的文件夾結構,就能很容易地推斷出其業務和功能。這也很容易找到一個開始上手的地方,因為我們的任務大部分時候是用業務語言編寫的。我能夠給出很多其它例子,但是我確信你已經明白為什麼這個方案現在被認為是更容易維護的了。

領域驅動設計和根據功能組織代碼的最大好處之一,就是限制了不同模塊之間的關聯數量。通常,我們在應用程式中有一組擴展點被所有模塊使用。理想情況下,所有的連接都應該通過一個單獨的地方進行,例如一個共享模塊或事件總線。使用這種方法更容易維護這些模塊,因為連接不同功能的部分通常是導致應用程式複雜性增加最多的地方。如果我們設法避免不必要的複雜性並簡化連接,那麼讓你的代碼庫保持簡單也就非常容易了。

弄清楚如何使你的模塊獨立並封裝,是另外一篇文章(或者是一系列文章)的主題,因此現在如果你想要深入了解這一點,我建議你閱讀hexagonal architecture,並應用這種方法中的大部分有用的理念。

那麼,我們該如何在 Vue 中應用領域驅動設計理念呢?

Nuxt 中的領域驅動設計

我們從 Nuxt 開始介紹,它有了一個很好的內置機制,使得應用這個理念非常容易——模塊。

Nuxt 模塊通常用於在你的應用程式中包含第三方功能,例如授權或 i18n。雖然編寫第三方代碼是最常用的利用它們的方法,但是 Nuxt 模塊也可以很好地在我們的內部架構中發揮作用。

因為 Nuxt 模塊可以掛接到應用程式的不同部分,例如路由或 Vuex store,所以我們能很容易地使它成為一個特定子領域與我們的應用程式連接的唯一地方!

看看這個簡單的 Nuxt 模塊:

// index.jsmodule.exports = function ProductCatalogModule (moduleOptions) { this.extendRoutes((routes) => { routes.unshift({ name: 'product', path: '/p/:slug/', component: path.resolve(themeDir, 'pages/Product.vue') }); ); // we can't register stores through Nuxt modules so we have to make a plugin this.addPlugin(path.resolve(__dirname, 'plugins/add-stores.js'))// plugins/add-stores.jsimport CategoryStore from '../stores/category.js'import ProductStore from '../stores/product.js'export default async ({ store }) => { store.registerModule(CategoryStore) store.registerModule(ProductStore)};…有如下文件:

.├── pages| |── Category.vue │ └── Product.vue├── components| |── ProductTile.vue│ └── ProductGallery.vue├── plugins│ └── add-stores.js├── store| |── category.js│ └── product.js└── index.js我們這裡就是一個小的 Nuxt.js 應用程式,專注於我們的應用程式的某一個子領域。現在,當我們想要在應用程式中包含所有目錄相關的功能時,我們只需要一行代碼就可以做到這一點!

// nuxt.config.jsexport default { modules: [ '~/modules/product-catalog/index.js', ]}現在,每當我們在 Jira 中看到產品目錄相關的問題時,我們就會立即知道從哪裡開始改。而且,使用這種模塊化方案,新來的人也能很快知道我們應用程式中有什麼功能,因此可以更快地理解業務和技術背景!

.├── pages│ └── index.vue├── modules| |── product-catalog| |── orders| |── payment| |── shipping| |── inventory│ └── customers└── index.js總結與展望

基於業務領域及其子領域來組織代碼,是使應用程式更易於維護的最簡單有效的方法之一。儘管還有一些已知的挑戰,例如不同模塊之間的通信,了解基礎知識就足以為代碼庫帶來巨大的好處。應用本文中的模式不需要高級編程技巧,這讓所有層次的開發人員都可以使用它。

原文連結:

https://vueschool.io/articles/vuejs-tutorials/domain-driven-design-in-nuxt-apps/

延伸閱讀:

前端周報:微軟發布基於Chromium的Microsoft Edge預覽版;Nuxt發布v2.9.0;npm 發布v6.11.0-InfoQ

關注我並轉發此篇文章,私信我「領取資料」,即可免費獲得InfoQ價值4999元迷你書,點擊文末「了解更多」,即可移步InfoQ官網,獲取最新資訊~

相關焦點

  • 領域驅動設計在前端中的應用
    真實業務案例為了讓讀者能夠更直觀的理解領域驅動設計的思想,我們用一個多頁面應用來舉一些例子,同時為了體現出普通設計與領域驅動設計的區別,我們會用兩種設計方式來實現同一需求,並且每個需求都由團隊中的 A B C D 成員完成,成員的技術水平與代碼風格各不相同,我們會分析在普通設計下,會出現哪些使得代碼複雜度失控的行為。
  • 與多摩美環境設計學科畢業設計師聊聊「空間」與「家具」
    「空間」與「家具」的關係在近一百年以來一直發生著變化,「家具」最初是僅是作為「空間」的附屬品,然而隨著人類文明的進化,「家具」逐漸的成為建立「空間系統」的必要元素。家具設計作為對空間的再設計來說,「家具」與「空間」成為一個整體,兩者相互制約、不可分割卻又互相獨立,換言之,通過家具之間的組合,可以使得空間呈現出新的機能和面貌。
  • AppsFlyer 年度經常性收入首超1億美元
    我們非常高興地看到更多的頂尖品牌、代理商和開發者選擇 AppsFlyer 幫助他們做出更合理的營銷決策,保護其廣告支出免受作弊侵害,並推動其數據驅動下的營銷創新。」  AppsFlyer 的業績表現得益於該公司在業界贏得的廣泛讚譽和基於多個重要指標的強勁增長。
  • You can't be serious.不是「你別這麼嚴肅」!弄錯意思就尷尬了!
    這個句子裡,can't 的/t/的音,在口語裡常常是省略掉不發出來的。但是為了區分 can 和 can't,通常會強調 can't,在否定句裡,把發音的重讀部分放在 ___ 上。如果有人跟你講了讓人難以置信的消息,你覺得太不可思議了,就可以說 You can't be serious!
  • 「回顧」1206廣州場設計大爆炸都聊了啥
    01設計引領美好生活現場乾貨滿滿,我們邀請了佳簡幾何創始人兼 CEO 魏民,石川設計事務所創始人石川 、本土創造創始人許剛 ,以及 ZAN DESIGN 負責人李贊文 ,四位大咖嘉賓出席本次活動,分享不同視角對主題「設計驅動美好生活」的理解,滿滿乾貨。
  • 創投周報 Vol.39|「蛋殼」、「房多多」上市,「NEIWAI內外內衣」獲...
    在周報中,我們重點呈現新項目、新趨勢、新觀點——A輪及以前的創業項目,用以呈現醞釀之中風向,在有意思·項目集中,是我們認為具有潛力的獨角獸候選人。最後一個部分,則是創投圈的每周精選,創投圈是36氪正在創建的創投人自己的朋友圈,內含大量乾貨&深度思考的分享。既然你看到這裡了,那請Enjoy下面的內容。
  • 重新開始「遊戲化設計」
    本文分4部分,涵蓋「理論 – 方法 -實踐」完整的知識閉環:土壤/水/空氣: 正確的遊戲觀樹根: 遊戲化的背景知識樹幹: 遊戲化設計方法論樹枝: 遊戲化設計實踐一、正確的遊戲觀: 如何看待遊戲決定遊戲化設計的視角遊戲化不明思議是將遊戲設計中的理論和原理應用到「非遊戲」場景中,遊戲化是基於「遊戲」理解進行設計,因此對遊戲的正確認識是遊戲化設計的根基。
  • 36氪首發|在線設計平臺「創客貼」獲近千萬美元A+輪融資,由金山...
    36氪獲悉,在線設計平臺「創客貼」已完成近千萬美元A+輪融資,本輪由金山辦公戰略投資,老股東戈壁創投跟投。據創客貼創始人兼CEO 寶臣介紹,本輪融資將主要用於產品研發、市場推廣、版權內容等方面。創客貼是36氪多次報導的一家在線設計平臺,用戶可通過平臺提供的圖片、字體、圖形、模板等設計素材,以拖拉拽的形式進行設計,設計應用範圍包括公眾號文章頭圖、海報傳單、新聞配圖、賀卡、電商圖片等。除了靜態的圖片,創客貼現已支持GIF動圖和視頻等動態圖像的設計。
  • 選課 | 中科大設計創新
    關於我們的「課程」   《設計創新》課程與史丹福大學「設計創新」課程、斯坦福國際高校設計聯盟(SUGAR)、中國美術學院跨界聯合設計課程等開展深度合作,旨在培養理工科學生創新設計的思維與實踐方法。
  • 真正的中臺價值,「炒作」之後才被看見
    金磊 發自 凹非寺量子位 報導 | 公眾號 QbitAI中臺,不再「火」了。如果你是從2015年直接穿越而來的人,很難想像過去5年裡,圍繞這「中臺」、「要不要建」、「適不適合」,「怎麼建」,曾有過一連串熱議和討論。
  • 每日小乾貨 | 竟然有人要買「馬桶水」?「 toilet water 」 到底是...
    Let's go~ Introduce 「上廁所」其實有好幾種說法 雖然都是英文,但是不同的文化對「廁所」有不同的說法。
  • 自然農法創始人「福岡正信」vs 樸門永續設計之父「比爾·莫裡森」
    )是日本農民和哲學家福岡正信建立一種的生態農業手法,他在1975年出版的「一根稻草的革命」一書中,對此進行了介紹。「無III自然農法─實踐篇」一書是福岡正信在1972年,實踐自然農法25年後自費出版。直到1985年,日本春秋社才替他編成「無」三部曲:「無Ⅰ神的革命─宗教篇」、「無Ⅱ無的哲學─哲學篇」、「無Ⅲ自然農法─實踐篇」。
  • ​「關於設計中的跨界與融合」:「University Maker-設計領域的教育行動」
    「關於設計中的跨界與融合」:「University Maker-設計領域的教育行動
  • 專業人士如何看待「動森」中的博物館設計?
    動物森友會》的博物館之旅中,我們一行人相繼飛往了 Monisa Ahmed 的小島。在飛機上,可以俯瞰到島上規整地種了一茬茬果樹,每棵樹旁邊還塗了一個自定義圖案,標記著它會長出哪種果實。Ahmed 表示:「如果你好奇我們是什麼樣的設計者,工作內容又是怎樣的。沒錯,我們就是那種會給自家果樹貼介紹標籤的人。」
  • 《設計》專訪|戴端:設計與科技在融合再造中驅動教育新格局
    將課堂教學、創新實踐等內容有機結合,引導學生更加開放的了解和應用科技手段解決實際問題,在教學過程、設計實踐中有效的嘗試了設計與科技融合的創新探索。科技創新驅動戰略背景下,設計走向了一個更加開放、系統、智能的文化環境中,設計教育尤其強調其跨學科、跨領域、跨文化的課程管理特色,並在整體運作的鏈式驅動中進行設計與科技的深度融合與再造。
  • 10T資源合集包!你想要的這都有
    本課程幫助設計師建立一個清晰且堅實的架構作為設計自主性的基礎,撐起空間設計作品的內容,打破對空間設計的局限,激起每個人身上更加個人化的空間經驗,可以讓我們對空間設計產生更加豐富的探索和實踐。 微云:https://share.weiyun.com/GKmnC5Am2021物聯網最新教程 BSP及驅動開發通俗易懂
  • 清華大學劉知遠:在 NLP 領域「做事」兼「發聲」
    而除了在學術領域有所貢獻外,劉知遠更為人熟悉的另一個身份是「知乎達人」。在劉知遠的不少高質量回答中,他在深入淺出回答技術問題時頻頻引經據典,旁徵博引,充分展現了他的學術和文學涵養。作為自然語言處理、深度學習、機器學習的優秀回答者,從 2013 年開始玩知乎的他,累積關注者超過 25000 人,收穫了 22206 次贊同,包括 3666 次感謝和 11109 次收藏。
  • 業務變化不息 架構演進不止 第四屆領域驅動設計峰會線上開啟
    2020年12月19日,第四屆領域驅動設計峰會(DDD Conference)再度開啟。不同於往屆的線下舉行形式,本屆峰會採取線上的形式,致力於打造一場架構設計和技術實踐的盛宴。作為軟體架構設計新的潮流,領域驅動設計(Domain Driven Design,簡稱DDD)強調業務和技術的統一性,為複雜領域軟體工程的設計決策提供實踐框架,幫助企業不斷拓展數位化業務。
  • 業務變化不息,架構演進不止 第四屆領域驅動設計峰會線上開啟
    2020年12月19日,第四屆領域驅動設計峰會(DDD Conference)再度開啟。不同於往屆的線下舉行形式,本屆峰會採取線上的形式,致力於打造一場架構設計和技術實踐的盛宴。作為軟體架構設計新的潮流,領域驅動設計(Domain Driven Design,簡稱DDD)強調業務和技術的統一性,為複雜領域軟體工程的設計決策提供實踐框架,幫助企業不斷拓展數位化業務。
  • 重溫「實踐是檢驗真理的唯一標準」
    年初,我們制定了本集團今年的基本策略是「集中力量辦要事」,如何在當前複雜多變的環境中找準「要事」、辦好「要事」,有必要重溫第三三二期旭日之聲所介紹和引用的主題文章