MEAN開發框架的資料很是少。基本的資料仍是來自於learn.mean.io站點上的介紹。javascript
因而抱着一種零基礎學習的心態,在瞭解的過程當中,經過翻譯加上理解將MEAN框架一點點消化並且吸取,一步一步來。慢慢地記錄我學習MEAN的點點滴滴。css
$ mean user <email> $ mean user <email> --addRole <role>; $ mean user <email> --removeRole <role>;二、MEAN可以列舉也可以安裝和卸載模塊
$ mean list $ mean install <module> $ mean uninstall <module>
四、核心包中有:
system:基本頁面、整體頁面佈局、渲染引擎、靜態文件、client到服務端的路由等。html
user:提供用戶註冊數據庫模型以及登陸和註冊的相關驗證。
access:管理權限以及中間件,它包括了很是多受權方法依賴user包。前端
theme:有關CSS以及圖片和背景資源。java
articles:可以當作是博客以及CMS管理內容的一個起點,在client以及服務端它包括了完整的增刪改查操做(GRUD)。node
五、所有的包都有它們相應的client和服務端部分。client部分在public目錄中,當中有:
asset:Javascript代碼、CSS以及圖片等;
controllers:前端框架Angular的控制器。jquery
config:包括了路由文件。
services:Angular服務(還有directives和filter目錄)
views:Angular視圖
服務端部分在Server目錄中,當中有:
config:配置文件
controllers:Angular控制器
models:數據庫Schema模型
routes:REST API路由端
views:基於SWIG的html渲染
六、依賴注入(Dependency Injection)
MEAN的依賴注入能夠在你聲明你所需要的依賴時本身主動解析系統所擁有的包來爲你解析所有的依賴。不論什麼註冊過的包,都會在你聲明依賴的時候變得可用。
比方說。在某個包的根文件夾下,有app.js文件,這當中包括的註冊方法中。就用到了依賴注入。
這裏MyPackage在註冊的時候。依賴了名爲Tokens的包。
數據庫
// Example of registering the tokens package MyPackage.register(function(app, auth, database, Tokens) { // I can make use of the tokens within my module MyPackage.someExampleFunction('some parameter'); // I can override functions MyPackage.someExampleFunction = function(param) { //my custom logic goes here }; });
// Example of adding an angular dependency of the ngDragDrop to the MyPackage.angularDependencies(['ngDragDrop']);
Javascript腳本、CSS和圖片能被聚合到全局的聚合文件裏。默認所有Javascript腳本會包裹在匿名的函數中。除非{global:true}沒有放置在被包括的域中。
前端框架
<pre name="code" class="javascript">//Adding jquery to the mean project MyPackage.aggregateAsset('js','jquery.min.js'); //Adding another library - global by default is false MyPackage.aggregateAsset('js','jquery.min.js', {global:true}); //Adding some css to the mean project MyPackage.aggregateAsset('css','default.css');沒有放在assets目錄中的Javascript文件會被聚合和注入到mean項目中。
假設不像這麼作,那麼應當放置在public/assets/js目錄中。app
聚合操做支持控制聚合代碼所放的位置。一般需要加入一個weight和group變量來肯定它是否在正確的位置。
MyPackage.aggregateAsset('js','first.js',{global:true, weight: -4, group: 'header'});
可以經過settings這個函數來獲取和保存持久信息。比方說:
MyPackage.settings({'someSetting':'some value'}, function (err, settings) { // You will receive the settings object on success }); // Another save settings example this time with no callback // This writes over the last settings. MyPackage.settings({'anotherSettings':'some value'}); // Get settings. Retrieves latest saved settings MyPackage.settings(function (err, settings) { // You now have the settings object });當存入信息的時候,第一個參數是JSON格式信息,第二個參數是回調函數。
回調函數用來推斷信息是否存入,第二個參數是可選的。當讀取信息的時候,僅僅需要一個參數就能夠。這個參數就是回調函數。
十、Express路由
所有到服務端控制器的路由都是由Express控制的。包系統將會沿着包的對象一直傳遞到路由文件。
通常是/server/routes/myPackages.js。
默認的話routes函數有其餘的一些參數:
MyPackage.routes(app, auth, database);
如下是位於server/routes/myPackage.js的樣例:
// The Package is past automatically as first parameter module.exports = function(MyPackage, app, auth, database) { // example route app.get('/myPackage/example/anyone', function (req,res,next) { res.send('Anyone can access this'); }); };
$stateProvider .state('myPackage example page', { url: '/myPackage/example', templateUrl: 'myPackage/views/index.html' });
如下是介紹怎樣在app.js中爲菜單加入連接的。
//We are adding a link to the main menu for all authenticated users MyPackage.menus.add({ title: "myPackage example page", link: "myPackage example page", roles: ["authenticated"], menu: "main" });
視圖存在於包中的server/views目錄中。並且以.html做爲結尾。
如下是一個簡單渲染html的樣例。
app.get('/myPackage/example/render', function (req,res,next) { MyPackage.render('index', {packageName:'myPackage'}, function (err, html) { //Rendering a view from the Package server/views res.send(html); }); });
如下是一個覆蓋默認系統佈局而不是使用在包內的本地佈局的樣例:
MyPackage.register(function(system, app) { app.set('views', __dirname + '/server/views'); // ...
angular.module('mean.mycustompackage', ['mean.system']) .config(['$viewPathProvider', function($viewPathProvider) { $viewPathProvider.override('system/views/index.html', 'mycustompackage/views/myhomepage.html'); }]);
1六、建立本身的包
$ mean package <packageName>
$ mean uninstall myPackage
$ mean register # register to the mean network (see below) $ cd <packages/custom/pkgName> $ mean publish