用mobx構建大型項目的最佳實踐(2)

上一篇:

用mobx構建大型項目的最佳實踐javascript

有朋友在讀了上篇文章以後,但願我能出個demo。因而我作了一個簡單的項目來實踐上文中所講到的理念。css

倉庫地址

mobx-best-practice-example前端

下面簡要介紹一下項目結構及開發流程,以幫助各位同窗更好的理解項目。java

目錄結構

項目根目錄爲 ./src(可經過package.json內的basePath配置) 頁面目錄爲 pages, 跨頁面通用業務組件目錄爲 components。兩個目錄僅僅業務含義不一樣,但storeaction的組織方式一致。node

pages目錄爲例(components下的組件同理)react

|--pages
      |--aPage
            |--index.tsx
            |--index.scss
            |--aComponet
                  |--index.tsx
                  |--index.scss
            |--actions
                  |--nameaAction.ts
                  |--namebAction.ts
            |--stores
                  |--nameaStore.ts
                  |--namebStore.ts
    |--components
        同pages結構
複製代碼

store或者action的所在頁面名稱和文件名稱暗示了組件內獲取對應實例的路徑
如 在組件文件index.tsx裏,git

@inject(({rootStore, rootAction}) => {
    return {
        storeA: rootStore.aPage.nameaStore,
        actionA: rootAction.aPage.nameaAction
    }
})
class AComponent extends React.Component{
    
}
複製代碼

實現上述功能的核心代碼在mobx目錄內。github

  • 一、mStoremAction裝飾器收集須要註冊的storeactionclass
  • 二、provider根據收集到的storeaction按照頁面劃分結構,並注入到根組件中。
  • 三、各級子組件經過 mobx-react提供的inject來獲取須要的storeaction
  • 四、actionstore按需實例化,action實例化時會傳入當前頁面的storeaction,也能夠經過第三、4個參數拿到rootStorerootAction
  • 藉助zone.js確保store的方法調用只能限制在action

腳手架

添加前端頁面或者組件

node tools/add-page.js [page-path] 
-m   建立mobx相關文件 xxStore,xxAction
-c   建立通用組件,全部文件會生成到components目錄下,其餘沒區別
更多命令經過 node tools/add-page.js -h 查看
# 如
node tools/add-page.js home -m
node tools/add-page.js home/aComponent -m  //建立頁面內的組件
複製代碼

刪除前端頁面目錄或者組件目錄

node tools/rm-page.js [page-path] 
# 如
node tools/rm-page.js home
node tools/rm-page.js home/aComponent
複製代碼

以上兩個命令除了生成或者刪除對應文件,還會更新mobxDependence.js文件對全部storeaction文件的引用. 若是是手動添加刪除,須要手動去引入或刪除對應storeaction文件的引用。json

類型聲明

在用腳手架建立或刪除組件時,均會更新typings/index.d.ts,以便得到更好的代碼提示。ide

ts transformer plugin

所在目錄 ./transformer

能夠發現組件裏storeaction的裝飾器並未顯式的指定自己的訪問路徑(固然也能夠手動指定),這正是這個ts插件所發揮的做用,經過store(action)所在的目錄和文件名暗示store(action)rootStore(rootAction)的訪問路徑。

最後

歡迎star,pr,有什麼問題也能夠提issue

相關文章
相關標籤/搜索