用mobx構建大型項目的最佳實踐javascript
有朋友在讀了上篇文章以後,但願我能出個demo
。因而我作了一個簡單的項目來實踐上文中所講到的理念。css
下面簡要介紹一下項目結構及開發流程,以幫助各位同窗更好的理解項目。java
項目根目錄爲 ./src
(可經過package.json
內的basePath
配置) 頁面目錄爲 pages
, 跨頁面通用業務組件目錄爲 components
。兩個目錄僅僅業務含義不一樣,但store
和action
的組織方式一致。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
mStore
和mAction
裝飾器收集須要註冊的store
和action
的class
provider
根據收集到的store
和action
按照頁面劃分結構,並注入到根組件中。mobx-react
提供的inject
來獲取須要的store
和action
action
和store
按需實例化,action
實例化時會傳入當前頁面的store
和action
,也能夠經過第三、4個參數拿到rootStore
和rootAction
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
文件對全部store
和action
文件的引用. 若是是手動添加刪除,須要手動去引入或刪除對應store
和action
文件的引用。json
在用腳手架建立或刪除組件時,均會更新typings/index.d.ts
,以便得到更好的代碼提示。ide
所在目錄 ./transformer
能夠發現組件裏store
和action
的裝飾器並未顯式的指定自己的訪問路徑(固然也能夠手動指定),這正是這個ts
插件所發揮的做用,經過store(action)
所在的目錄和文件名暗示store(action)
在rootStore
(rootAction
)的訪問路徑。
歡迎star
,pr
,有什麼問題也能夠提issue
。