天天看點

Node.js

Node.js是一套用來編寫高性能網絡伺服器的JavaScript工具包,基于 Javascript 作為前台的表現語言,它是伺服器端的語言。

Node.js是一個可以快速建構網絡服務及應用的平台。該平台的建構是基于Chrome's JavaScript runtime,也就是說,實際上它是對Google V8引擎(應用于Google Chrome浏覽器)進行了封裝。

V8引擎執行Javascript的速度非常快,性能非常好。Node對一些特殊用例進行了優化,提供了替代的API,使得V8在非浏覽器環境下運作得更好。

Node.js 内建了HTTP伺服器

Java - Tomcat, Node.js 不需要。

NodeJS 單線程

Node.js 中的JavaScript是在單線程上執行。在高并發請求中,單線程執行運算形成的瓶頸,拖慢了I/O的效率,無法很好利用多核CPU。

Node也提供了child_process.fork來建立Node的子程序。在一個Node程序就能很好的解決密集I/O的情況下,fork出來的其餘Node子程序可以當作常駐服務來解決運算阻塞的問題(将運算分發到多個Node子程序中上去,與Apache建立多個子程序類似)。單線程可避免線程上下文切換帶來的性能損失。

NodeJS 異步IO,事件驅動

Node.js可以在不新增額外線程的情況下,依然可以對任務進行并行處理 —— Node.js是單線程的。它通過事件輪詢(event loop)來實作并行操作,對此,我們應該要充分利用這一點 —— 盡可能的避免阻塞操作,取而代之,多使用非阻塞操作。

一般的程式調用都是執行一個指令之後,線程阻塞,一直等到指令成功之後,才會去執行下面的事情。NodeJS 所有的IO,網絡通信,磁盤操作都是由事件來控制的,Nodejs 程序在同一時刻隻會處理一個事件,完成後立即進入事件輪詢并檢查處理後面的事件。

Node.js

NodeJS和CommonJS之間的關系

CommonJS API定義很多普通應用程式(主要指非浏覽器的應用)使用的API,進而填補了這個空白。它的終極目标是提供一個類似Python,Ruby和Java标 準庫。CommonJS是一種規範,NodeJS是這種規範的實作。

搭建 Node.js

1. http://nodejs.org/,下載下傳 node-v0.10.22-x86.msi 并安裝到 D:\nodejs。

2. 配置環境變量:D:\nodejs 添加到 PATH

3. cmd - 輸入 node 指令

C:\Documents and Settings\Administrator>node
> console.log("hello world")
hello world
> console.log(process.version)        --Node.js版本
v0.10.22
> console.log(process.platform)       --作業系統版本
win32
> console.log("Hi,%d.",2013)
Hi,2013.      

在 D 盤編輯 demo.js

var args = process.argv;
for(var i=0;i<args.length;i++){
    console.log("arg%d : %s",i,args[i]);
}      

在 cmd 執行 node 指令,結果為

D:\>node demo.js a=1 b=2 c=3
arg0 : node
arg1 : D:\demo.js
arg2 : a=1
arg3 : b=2
arg4 : c=3      

對于 process.argv ,它的第一個參數永遠是 node,第二個參數是檔案的絕對路徑,從第三個參數開始才是傳的腳本參數。

process 子產品提供的屬性和方法非常多,傳回程式的傳回碼:process.exit(1); 給特定的程序發送信号:process.kill(process.pid,'SIGTERM')

> process.pid
6692
> process.kill(6692,'SIGTERM')      

4. NPM ( Node Package Manager )

在 windows 的安裝包才不到10M,Node.js 擁有龐大的第三方軟體庫,通過 npm 可以 install、update、uninstall package,類似 Linux 的 rpm。

假設我們隻知道包的關鍵字 socket,通過 npm 搜尋包

D:\>npm find socket      

通過以上指令顯示一行行具體的包名和描述,找到你所要的包并安裝。(-g 表示作為全局使用)

D:\>npm install -g socket.io      

檢視 socket.io 詳細資訊

D:\>npm info socket.io      

NPM 解決了包之間的依賴關系,通過 package.json,在 npm info 指令檢視了該子產品的具體資訊,顯示長長的清單,内容就來源于package.json 檔案。package.json 是一個JSON 格式的文本檔案,它包含一些屬性用于描述包的功能。package.json是每 個子產品必須具有的,即每個子產品開發人員在釋出包的時候會手動建立這個檔案。如 Json 格式中有 dependencies,說明該包有依賴于其它包。

3. Express

Express 是整個 Node.js 之中最為常見的一個架構(開發包),可以幫助我們快速建構一個WEB項目。(http://expressjs.com)

在 F 盤建立 nodejsdemo,cd nodejsdemo ,執行

npm install express      

在 F:\nodejsdemo 下有了個 node_modules 目錄,在目前目錄建立 loadModeul.js

module.exports = require('express');      

執行

F:\nodejsdemo>node loadjs.js      

Node.js 的子產品加載對開發者來說很簡單,調用 require 即可,require 類似 Java 的 import 。

當require 加載的子產品不是核心子產品時或者不以路 徑為參數,它就會以你腳本所在的路徑為目前路徑并試圖尋找此路徑下是否有一個叫做 node_modules 的目錄,如果沒有這個目錄(node_modules),則往此目錄的父目錄中尋找。 反複執行這一過程,直到你的根目錄,如果還沒有就報錯了。

加載自定義子產品,建立 printf.js 

console.log('maths pi');
var PI = 3.14;
exports.perimeter = function (r){
return 2 * PI * r;
};
exports.area = function (r){
return PI * r * r;
};      

修改 loadModeul.js,console.dir() 可顯示一個對象所有的屬性和方法。

var c = require('./printf.js');
console.dir(c.perimeter(5));
console.dir(c.area(5));      
F:\nodejsdemo>node loadModeul.js
maths pi
31.400000000000002
78.5