Node.js是一套用來編寫高性能網絡服務器的JavaScript工具包,基於 Javascript 做爲前臺的表現語言,它是服務器端的語言。node
Node.js是一個能夠快速構建網絡服務及應用的平臺。該平臺的構建是基於Chrome's JavaScript runtime,也就是說,實際上它是對Google V8引擎(應用於Google Chrome瀏覽器)進行了封裝。express
V8引擎執行Javascript的速度很是快,性能很是好。Node對一些特殊用例進行了優化,提供了替代的API,使得V8在非瀏覽器環境下運行得更好。npm
Node.js 內建了HTTP服務器json
Java - Tomcat, Node.js 不須要。windows
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 進程在同一時刻只會處理一個事件,完成後當即進入事件輪詢並檢查處理後面的事件。
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