前段日子看到一篇文章提到MEAN這個詞,什麼是MEAN?
其實MENA就是 MongoDB(非關系數據庫) + Express(模板引擎) + AngularJS(MVC javascript庫) + NodeJS(服務器腳本)的簡稱。
它們共同構造 基於 javascript 的 現代web應用全棧開發工具。
MongoDB:
是一種強大、靈活、可擴展的數據存儲方式。
它擴展了關系型數據庫的眾多有用功能,如輔助索引、范圍查詢、和排序、它內置的對MapReduce式聚合的支持和對地理空間索引的支持。
它將傳統數據庫行(row)的概念換成,文檔(document)模型,所謂文檔模型其實就是一個數組對象。
我們來看一下文檔模型:
{“_id” : 1 , “greeting” : “hello,world!” , “foo” : 3}
每個文檔都會帶有一個_id的字段,該文檔模型代表數據庫中有一條記錄,包含字段 greeting , foo 和 _id;
Express:
關於末班引擎Express,我想用按句話來描述它:
是一個簡潔而靈活的node.jsWeb應用框架, 提供一系列強大特性幫助你創建各種Web應用。
豐富的HTTP工具以及來自Connect框架的中間件隨取隨用,創建強健、友好的API變得快速又簡單
Express 不對 node.js 已有的特性進行二次抽象,我們只是在它之上擴展了Web應用所需的功能
AngularJS:
AngularJS是由google開發的一款js庫,它與backone一樣同為MVC腳本庫。
幾乎每種語言的第一課都是講hello world,按照慣例我們也來一個:
代碼如下:
<!doctype html>
<html ng-app>
<head>
<script src="http://code.angularjs.org/angular-1.0.1.min.js"></script>
</head>
<body>
Hello {{'World'}}!
</body>
</html>
<html ng-app>
聲明了該頁面使用angularJS,當加載該頁時,標記ng-app告訴AngularJS處理整個HTML頁並引導應用。
這個例子在頁面打印hello world,有的人就奇怪了,hello world搞這麼復雜干嘛。
其實{{}}裡內容是一種數據綁定的形式,看完下個例子你就知道它的強大之處了。
我門接著看下一個例子:
代碼如下:
<!doctype html>
<html ng-app>
<head>
<script src="angular-1.0.1.min.js"></script>
</head>
<body>
Your name: <input type="text" ng-model="yourname" placeholder="World">
<hr>
Hello {{yourname || 'World'}}!
</body>
</html>
在浏覽器裡打開這個頁面,然後試著在輸入框輸入隨意字符,你會發現這些輸入的字符立即更新顯示在問候語中。 是不是很神奇?
的念。 輸入框的任何更改會立即反映到模型變量(一個方向),模型變量的任何更改都會立即反映到問候語文本中(另一方向)。
該示例有一下幾點重要的注意事項:
1. 文本輸入指令<input ng-model=”yourname” />綁定到一個叫yourname 的模型變量。
2. 雙大括號標記將yourname 模型變量添加到問候語文本。
3. 你不需要為該應用另外注冊一個事件偵聽器或添加事件處理程序!
NodeJS
是由Ryan Dahl開發的一款高性能服務器js平台。
它是集於V8引擎開發的,V8引擎是google開發的 javascript引擎,不是汽車的V8引擎 – -是一款高性能引擎,它的性能遠遠超越其他腳本語言。
nodeJS使用的是 異步I / O的通信方式,這種方式和AJAX很類似:
代碼如下:
$.post("url", {title:"post請求"}, function(data){
console.log("收到響應");
})
console.log("發送ajax結束");
nodejs的請求方式:
代碼如下:
var fs = require('fs');
fs.readFile("/path", function(err, file){
console.log("讀取文件完成");
});
console.log("發起讀取文件");
我們再看下面這個例子:
當同時執行兩個請求的時候,總耗時取決於耗時最多的那個,而不是兩個請求的耗時總和,因為他們兩個是並行的。
代碼如下:
//第一個請求
var fs = require('fs');
fs.readFile("/path1", function(err, file){
console.log("讀取文件1完成");
});
//第二個請求
fs.readFile("/path2", function(err, file){
console.log("讀取文件2完成");
});
console.log("發起讀取文件");
nodejs高性能的另一個原因是基於事件驅動:
node將前端浏覽器中的 事件 引入後端,配合異步I/O,將事件點暴露給業務邏輯。
事件的變成方式具有輕量級,松耦合,只關注事物點等優勢。