隨著Meteor1.3 正式版的臨近臂港,我們再來回顧一下Mantra,并講一下使用它的原因。Mantra是Meteor 1.3+React的一種應(yīng)用架構(gòu)規(guī)范垂蜗,它包含了一系列的規(guī)范和約定,如果你遵循Mantra規(guī)范解幽,那么你的應(yīng)用將更加容易構(gòu)建和擴展贴见。
當(dāng)我們最初看到Mantra的時候,會覺得它給Meteor應(yīng)用增加了不少復(fù)雜度躲株。為什么我們需要這么多額外的目錄和文件呢片部?隨著你認識的深入,你會逐漸意識到這些模塊化組織結(jié)構(gòu)的優(yōu)勢所在霜定,它能讓我們方便地了解應(yīng)用的內(nèi)部機制档悠。同時廊鸥,它也將讓我們更方便地修改應(yīng)用或者添加新的功能特性。
Mantra只要分為兩大部分:模塊(Modules)和組件(Components)站粟。組件進一步分為容器組件(Container Components)和UI組件(UI Components)黍图。我們來逐一看一下這些東西。
模塊 - 模塊構(gòu)建了我們的應(yīng)用主體部分奴烙。每個應(yīng)用都應(yīng)該有一個核心模塊(Core Module)助被,這個模塊會處理應(yīng)用的核心功能。如果只是一個小型應(yīng)用的話切诀,只需要一個核心模塊即可揩环。一旦我們的應(yīng)用有多個主函數(shù)后,我們需要把它們拆分成不同模塊幅虑。舉個例子丰滑,一個
items
模塊可以是TodoList應(yīng)用的模塊,所有與items相關(guān)的功能都會放到這個模塊中倒庵。組件 - 組件是模塊的獨立部分褒墨。比方說,在
items
模塊里面擎宝,我們可能會有ItemList
郁妈,NewItem
,Item
和EditItem
這幾個組件绍申。每個組件都有兩部分構(gòu)成:一個容器組件和一個UI組件噩咪。容器組件負責(zé)獲取數(shù)據(jù),通過props傳入子組件來渲染UI組件极阅。我們可以使用React-Komposer來使這個過程更簡單胃碾。如何創(chuàng)建容器組件和UI組件可以參見這篇文章。
這些就是Mantra的基本構(gòu)件筋搏,我們基于這些基本構(gòu)件來創(chuàng)建應(yīng)用仆百。
另一個關(guān)于Mantra的重點,你一開始可能會困惑拆又,就是所有的代碼關(guān)系都通過imports和exports來構(gòu)建儒旬,并且以單一入口的形式。所以我們創(chuàng)建模塊帖族、組件和動作(actions)后都要導(dǎo)出它們栈源,然后導(dǎo)入到index.js
文件中,這些index.js
再被導(dǎo)入到main.js
中去竖般∩蹩眩客戶端和服務(wù)器端分別只有一個main.js
文件。它們是整個應(yīng)用的真實入口。
下面艰亮,我們談?wù)剟幼鳎╝ctions)闭翩。動作是Mantra中應(yīng)用邏輯書寫的地方。動作位于模塊里面迄埃,和組件并列疗韵。任何實際上交互的組件,除了僅僅渲染數(shù)據(jù)的組件外侄非,都應(yīng)有一個對應(yīng)的動作蕉汪。所以我們的EditItem
和NewItem
組件,都會有一個對應(yīng)的動作來處理數(shù)據(jù)操作逞怨。這些動作會調(diào)用服務(wù)器端的Meteor方法者疤。
我們來看一下mantra-sample-blog-app的目錄結(jié)構(gòu):
.
├── CHANGELOG.md
├── LICENSE
├── README.md
├── client
│ ├── configs
│ │ └── context.js
│ ├── main.js
│ └── modules
│ ├── comments
│ │ ├── actions
│ │ │ ├── comments.js
│ │ │ ├── index.js
│ │ │ └── tests
│ │ │ └── comments.js
│ │ ├── components
│ │ │ ├── comment_list.jsx
│ │ │ ├── create_comment.jsx
│ │ │ ├── style.css
│ │ │ └── tests
│ │ │ ├── comment_list.js
│ │ │ └── create_comment.js
│ │ ├── configs
│ │ │ └── method_stubs
│ │ │ ├── comments.js
│ │ │ └── index.js
│ │ ├── containers
│ │ │ ├── comment_list.js
│ │ │ ├── create_comment.js
│ │ │ └── tests
│ │ │ ├── comment_list.js
│ │ │ └── create_comment.js
│ │ └── index.js
│ └── core
│ ├── actions
│ │ ├── index.js
│ │ ├── posts.js
│ │ └── tests
│ │ └── posts.js
│ ├── components
│ │ ├── main_layout.jsx
│ │ ├── navigation.jsx
│ │ ├── newpost.jsx
│ │ ├── post.jsx
│ │ ├── postlist.jsx
│ │ ├── style.css
│ │ └── tests
│ │ ├── main_layout.js
│ │ ├── navigations.js
│ │ ├── newpost.js
│ │ ├── post.js
│ │ └── postlist.js
│ ├── configs
│ │ └── method_stubs
│ │ ├── index.js
│ │ └── posts.js
│ ├── containers
│ │ ├── newpost.js
│ │ ├── post.js
│ │ ├── postlist.js
│ │ └── tests
│ │ ├── newpost.js
│ │ ├── post.js
│ │ └── postlist.js
│ ├── index.js
│ └── routes.jsx
├── lib
│ └── collections.js
├── package.json
├── server
│ ├── configs
│ │ └── initial_adds.js
│ ├── main.js
│ ├── methods
│ │ ├── index.js
│ │ └── posts.js
│ └── publications
│ ├── index.js
│ └── posts.js
└── wallaby.js
更多信息,可以參見World of Mantra叠赦。