Node.js是建立在谷歌Chrome的JavaScript引擎(V8引擎)的Web應(yīng)用程序框架。 它的最新版本是:v0.12.7(在編寫本教程時(shí)的版本)。Node.js在官方網(wǎng)站的定義文件內(nèi)容如下:
Node.js® is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.
Node.js自帶運(yùn)行時(shí)環(huán)境可在Javascript腳本的基礎(chǔ)上可以解釋和執(zhí)行(這類似于JVM的Java字節(jié)碼)。這個(gè)運(yùn)行時(shí)允許在瀏覽器以外的任何機(jī)器上執(zhí)行JavaScript代碼。由于這種運(yùn)行時(shí)在Node.js上,所以JavaScript現(xiàn)在可以在服務(wù)器上并執(zhí)行。
Node.js還提供了各種豐富的JavaScript模塊庫,它極大簡化了使用Node.js來擴(kuò)展Web應(yīng)用程序的研究與開發(fā)。
Node.js庫的異步和事件驅(qū)動的API全部都是異步就是非阻塞。它主要是指基于Node.js的服務(wù)器不會等待API返回的數(shù)據(jù)。服務(wù)器移動到下一個(gè)API調(diào)用,Node.js發(fā)生的事件通知機(jī)制后有助于服務(wù)器獲得從之前的API調(diào)用的響應(yīng)。
非??斓膬?nèi)置谷歌Chrome的V8 JavaScript引擎,Node.js庫代碼執(zhí)行是非常快的。
單線程但高度可擴(kuò)展 - Node.js使用具有循環(huán)事件單線程模型。事件機(jī)制有助于服務(wù)器在一個(gè)非阻塞的方式響應(yīng)并使得服務(wù)器高度可擴(kuò)展,而不是創(chuàng)建線程限制來處理請求的傳統(tǒng)服務(wù)器。Node.js使用單線程的程序,但可以提供比傳統(tǒng)的服務(wù)器(比如Apache HTTP服務(wù)器)的請求服務(wù)數(shù)量要大得多。
沒有緩沖 - Node.js的應(yīng)用從來不使用緩沖任何數(shù)據(jù)。這些應(yīng)用只是輸出數(shù)據(jù)在塊中。
許可證協(xié)議 - Node.js 在 MIT 協(xié)議 下發(fā)布
以下是包含正在使用node.js的項(xiàng)目,應(yīng)用和公司,一個(gè)詳盡的清單請點(diǎn)擊 github維基鏈接查看,這些清單里包括:eBay, General Electric, GoDaddy, Microsoft, PayPal, Uber, Wikipins, Yahoo!, Yammer 并越來越多加入繼續(xù)擴(kuò)大這個(gè)列表:使用NodeJS的項(xiàng)目, 應(yīng)用和公司
下圖描述了 Node.js 的一些重要組成部分,我們將詳細(xì)的在后續(xù)章節(jié)進(jìn)行討論。

以下是Node.js證明自己完美的技術(shù)的合作伙伴的領(lǐng)域。
I/O 綁定應(yīng)用程序
數(shù)據(jù)流應(yīng)用
數(shù)據(jù)密集型實(shí)時(shí)應(yīng)用(DIRT)
JSON API的應(yīng)用程序
單頁面應(yīng)用
不建議使用Node.js的就是針對CPU密集型應(yīng)用。
如果愿意安裝設(shè)置Node.js環(huán)境,需要計(jì)算機(jī)上提供以下兩個(gè)軟件:
一、文本編輯器
二、Node.js二進(jìn)制安裝包
這將用來編寫程序代碼。 一些編輯器包括:Windows記事本,OS Edit命令,Brief, Epsilon, EMACS和VIM或vi。
文本編輯器的名稱和版本的在不同的操作系統(tǒng)可能不太相同。例如,記事本可用在Windows,VIM或vi可以在Windows以及Linux或UNIX上使用。
編輯器創(chuàng)建的文件稱為源文件并包含程序的源代碼。 對于Node.js的程序的源文件名通常命名擴(kuò)展是 ".js".
在開始編程之前,請確保文本編輯器可用,并且有足夠的經(jīng)驗(yàn)來寫計(jì)算機(jī)程序,將其保存在一個(gè)文件,如:helloworld.js,編譯并執(zhí)行。
編寫源文件中的源代碼只需知道了解JavaScript。Node.js解釋器將用于解釋和執(zhí)行JavaScript代碼。
Node.js的發(fā)行版以二進(jìn)制安裝在SunOS,Linux,Mac OS X和Windows的32位(386)和64位(AMD64)的x86處理器架構(gòu)操作系統(tǒng)。
以下部分將指導(dǎo)如何將Node.js的二進(jìn)制分發(fā)版安裝在各種操作系統(tǒng)上。
下載最新版本Node.js的安裝歸檔文件在: Node.js 下載. 在寫這篇教程的時(shí)候,下載的是 node-v0.12.7-x64.msi 并復(fù)制到“桌面”。
| OS | Archive name |
|---|---|
| Windows | node-v0.12.7-x64.msi |
| Linux | node-v0.12.7-linux-x86.tar.gz |
| Mac | node-v0.12.7-darwin-x86.tar.gz |
| SunOS | node-v0.12.7-sunos-x86.tar.gz |
解壓縮下載歸檔文件到 /usr/local, 創(chuàng)建一個(gè)NodeJs樹 /usr/local/nodejs. 例如:
tar -C /usr/local -xzf node-v0.12.0-linux-x86.tar.gz
添加 /usr/local/nodejs 到PATH環(huán)境變量。
| OS | 輸出 |
|---|---|
| Linux | export PATH=$PATH:/usr/local/nodejs |
| Mac | export PATH=$PATH:/usr/local/nodejs |
| FreeBSD | export PATH=$PATH:/usr/local/nodejs |
使用MSI文件,并按照提示安裝node.js,默認(rèn)情況下,安裝程序?qū)?Node.js 發(fā)行到 C:\Program Files\nodejs. 但這里我們需要修改安裝路徑到:D:\yiibai_worksp\nodejs,并將 D:\yiibai_worksp\nodejs 目錄添加到Window系統(tǒng)的PATH環(huán)境變量中。重新啟動打開命令提示符,以使更改生效。
第一步:雙擊下載的 “node-v0.12.7-x64.msi" 文件,出現(xiàn)提示安裝界面:


第二步:選擇安裝目錄,這里安裝在目錄 D:\yiibai_worksp\nodejs 中,如下圖:


第三步:選擇安裝的模塊和功能,這里全部安裝,并添加到系統(tǒng)環(huán)境變量,如下圖所示:


最后一步:安裝完成!

創(chuàng)建一個(gè)js文件名為test.js 在 D:\>yiibai_worksp\nodejs.
File: test.js
console.log("Hello World")
現(xiàn)在運(yùn)行test.js看到的結(jié)果:
D:\yiibai_worksp\nodejs> node test.js
驗(yàn)證輸出結(jié)果:


在使用 Node.js 創(chuàng)建 Hello World ! 應(yīng)用程序之前, 讓我們看看Node.js的應(yīng)用程序的組成部分。Node.js應(yīng)用程序由以下三個(gè)重要部分組成:
導(dǎo)入所需模塊: 使用require指令來加載javascript模塊
創(chuàng)建一個(gè)服務(wù)器: 服務(wù)器這將聽監(jiān)聽在Apache HTTP服務(wù)器客戶端的請求。
讀取請求并返回響應(yīng): 在前面的步驟中創(chuàng)建的服務(wù)器將響應(yīng)讀取由客戶機(jī)發(fā)出的HTTP請求(可以是一個(gè)瀏覽器或控制臺)并返回響應(yīng)。
步驟 1:導(dǎo)入所需的包
使用require指令來加載 HTTP 模塊。
var http = require("http")
步驟 2:使用http.createServer方法創(chuàng)建HTTP服務(wù)器。通過參數(shù)函數(shù)請求并響應(yīng)。編寫示例實(shí)現(xiàn)返回“Hello World”。服務(wù)器在8081端口監(jiān)聽。
http.createServer(function (request, response) {
// HTTP Status: 200 : OK
// Content Type: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
// send the response body as "Hello World"
response.end('Hello World\n');
}).listen(8081);
// console will print the message
console.log('Server running at http://127.0.0.1:8081/');
步驟 3: 創(chuàng)建一個(gè) js 文件在 helloworld.js 在 D:\>yiibai_worksp.
File: helloworld.js
var http = require("http")
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');
}).listen(8081);
console.log('Server running at http://127.0.0.1:8081/');
現(xiàn)在運(yùn)行 helloworld.js 看到結(jié)果:
D:\yiibai_worksp\nodejs>node helloworld.js
驗(yàn)證輸出,服務(wù)器應(yīng)用已經(jīng)啟動!
Server running at http://127.0.0.1:8081/
打開瀏覽器(IE),在地址欄中輸入:http://127.0.0.1:8081/ 在瀏覽器中,看看下面的結(jié)果。

REPL代表讀取評估和演示打印循環(huán),它就像 Window 下的控制臺的計(jì)算機(jī)環(huán)境,或 Unix/Linux 系統(tǒng)的 Shell命令輸入響應(yīng)輸出。 Node.js或Node 捆綁了一個(gè)REPL環(huán)境。可執(zhí)行以下任務(wù)。
讀取- 讀取用戶的輸入,解析輸入的JavaScript數(shù)據(jù)結(jié)構(gòu)并存儲在內(nèi)存
計(jì)算- 采取并評估計(jì)算數(shù)據(jù)結(jié)構(gòu)
打印- 打印結(jié)果
循環(huán) - 循環(huán)上面的命令,直到用戶按Ctrl-C兩次終止
Node 的REPL 與 Node.js 的實(shí)驗(yàn)代碼非常有用,用于調(diào)試JavaScript代碼。
REPL可以通過簡單地在shell/控制臺運(yùn)行node不帶任何參數(shù)來啟動。
D:\yiibai_worksp\nodejs> node
可以看到REPL 命令提示符:
D:\yiibai_worksp\nodejs> node >
讓我們嘗試在REPL命令提示符下執(zhí)行簡單的數(shù)學(xué)運(yùn)算:
D:\yiibai_worksp\nodejs>node > 1 + 3 4 > 1 + ( 2 * 3 ) - 4 3 >
使用變量儲存值后并打印。如果不使用var關(guān)鍵字,那么值存儲在變量并打印。而如果使用var關(guān)鍵字存儲值,那么不會打印。稍后,可以使用這兩個(gè)變量。使用console.log()打印來任何東西
D:\yiibai_worksp\nodejs> node
> x = 10
10
> var y = 10
undefined
> x + y
20
> console.log("Hello World")
Hello Workd
undefined
Node REPL支持類似于JavaScript的多表達(dá)。請參閱下列do-while循環(huán):
D:\yiibai_worksp\nodejs> node
> var x = 0
undefined
> do {
... x++;
... console.log("x: " + x);
... } while ( x < 5 );
x: 1
x: 2
x: 3
x: 4
x: 5
undefined
>
... 當(dāng)按下進(jìn)入自動打開來后括號。Node自動檢查表達(dá)式的連續(xù)性。
使用_得到最后的結(jié)果。
D:\yiibai_worksp\nodejs> node > var x = 10 undefined > var y = 20 undefined > x + y 30 > var sum = _ undefined > console.log(sum) 30 undefined >
ctrl + c - 終止當(dāng)前命令
ctrl + c twice - 終止 Node REPL
ctrl + d - 終止 Node REPL
Up/Down Keys - 查看命令歷史記錄和修改以前的命令
tab Keys - 當(dāng)前命令列表
.help - 列出所有命令
.break - 退出多行表達(dá)
.clear - 從多行表達(dá)式退出
.save - 當(dāng)前 Node REPL會話保存到一個(gè)文件
.load - 加載文件的內(nèi)容到當(dāng)前Node REPL會話
D:\yiibai_worksp\nodejs> node > var x = 10 undefined > var y = 20 undefined > x + y 30 > var sum = _ undefined > console.log(sum) 30 undefined > .save test.js Session saved to:test.js > .load test.js > var x = 10 undefined > var y = 20 undefined > x + y 30 > var sum = _ undefined > console.log(sum) 30 undefined >
npm 表示節(jié)點(diǎn)程序包管理器。npm 提供以下兩個(gè)主要功能:
Node.js包/模塊的在線軟件倉庫,可通過搜索 search.nodejs.org
命令行實(shí)用程序安裝包,作為Node.js版本管理和依賴包管理。
Node.js v0.6.3版本后才開始捆綁 npm 安裝。為了驗(yàn)證,打開控制臺,然后輸入以下命令并查看結(jié)果:
D:\yiibai_worksp\nodejs>npm --version 2.11.3
默認(rèn)情況下,NPM安裝在任何依賴性的本地模式。在這里,本地模式指的是包在安裝目錄node_modules,位于Node應(yīng)用的文件夾中。本地部署的包都可以通過require() 訪問 。
全局安裝的軟件包/依賴存儲在<用戶目錄>/npm目錄。 這種依賴關(guān)系可以在命令行中使用Node.js的(命令行界面)任何功能,但不能使用require()在Node直接應(yīng)用導(dǎo)入。
我們來開始安裝明確,使用本地來安裝一個(gè)流行的Web框架。
D:\yiibai_worksp\nodejs>npm install express express@4.11.2 node_modules\express |-- merge-descriptors@0.0.2 |-- utils-merge@1.0.0 |-- methods@1.1.1 |-- escape-html@1.0.1 |-- fresh@0.2.4 |-- cookie@0.1.2 |-- range-parser@1.0.2 |-- media-typer@0.3.0 |-- cookie-signature@1.0.5 |-- vary@1.0.0 |-- finalhandler@0.3.3 |-- parseurl@1.3.0 |-- serve-static@1.8.1 |-- content-disposition@0.5.0 |-- path-to-regexp@0.1.3 |-- depd@1.0.0 |-- qs@2.3.3 |-- debug@2.1.1 (ms@0.6.2) |-- send@0.11.1 (destroy@1.0.3, ms@0.7.0, mime@1.2.11) |-- on-finished@2.2.0 (ee-first@1.1.0) |-- type-is@1.5.7 (mime-types@2.0.9) |-- accepts@1.2.3 (negotiator@0.5.0, mime-types@2.0.9) |-- etag@1.5.1 (crc@3.2.1) |-- proxy-addr@1.0.6 (forwarded@0.1.0, ipaddr.js@0.1.8)
一旦NPM完成下載,可以通過查看 D:\yiibai_worksp\nodejs\node_modules 的內(nèi)容驗(yàn)證,或鍵入以下命令:
D:\yiibai_worksp\nodejs> npm ls D:\yiibai_worksp\nodejs |-- express@4.11.2 |-- accepts@1.2.3 | |-- mime-types@2.0.9 | | |-- mime-db@1.7.0 | |-- negotiator@0.5.0 |-- content-disposition@0.5.0 |-- cookie@0.1.2 |-- cookie-signature@1.0.5 |-- debug@2.1.1 | |-- ms@0.6.2 |-- depd@1.0.0 |-- escape-html@1.0.1 |-- etag@1.5.1 | |-- crc@3.2.1 |-- finalhandler@0.3.3 |-- fresh@0.2.4 |-- media-typer@0.3.0 |-- merge-descriptors@0.0.2 |-- methods@1.1.1 |-- on-finished@2.2.0 | |-- ee-first@1.1.0 |-- parseurl@1.3.0 |-- path-to-regexp@0.1.3 |-- proxy-addr@1.0.6 | |-- forwarded@0.1.0 | |-- ipaddr.js@0.1.8 |-- qs@2.3.3 |-- range-parser@1.0.2 |-- send@0.11.1 | |-- destroy@1.0.3 | |-- mime@1.2.11 | |-- ms@0.7.0 |-- serve-static@1.8.1 |-- type-is@1.5.7 | |-- mime-types@2.0.9 | |-- mime-db@1.7.0 |-- utils-merge@1.0.0 |-- vary@1.0.0
上面列出的內(nèi)容很長,這里省略了一部分。
現(xiàn)在,讓我們嘗試安裝明確,使用全局安裝流行Web框架。
D:\yiibai_worksp\nodjs> npm install express - g
一旦NPM完成下載,可以通過查看<用戶目錄>/nmp/node_modules中的內(nèi)容來驗(yàn)證?;蜉斎胍韵旅睿?/p>
D:\yiibai_worksp\nodejs> npm ls -g
安裝模塊很簡單,只要鍵入以下命令。
D:\yiibai_worksp\nodejs> npm install express
現(xiàn)在,可以在 js 文件中使用它,如下:
var express = require('express');
package.json是存在于任何Node應(yīng)用程序/模塊的根目錄,并用于定義一個(gè)包的屬性。 讓我們打開 package.json express包在 D:\yiibai_worksp\nodejs\node_modules\express\
{
"name": "express",
"description": "Fast, unopinionated, minimalist web framework",
"version": "4.11.2",
"author": {
"name": "TJ Holowaychuk",
"email": "tj@vision-media.ca"
},
"contributors": [
{
"name": "Aaron Heckmann",
"email": "aaron.heckmann+github@gmail.com"
},
{
"name": "Ciaran Jessup",
"email": "ciaranj@gmail.com"
},
{
"name": "Douglas Christopher Wilson",
"email": "doug@somethingdoug.com"
},
{
"name": "Guillermo Rauch",
"email": "rauchg@gmail.com"
},
{
"name": "Jonathan Ong",
"email": "me@jongleberry.com"
},
{
"name": "Roman Shtylman",
"email": "shtylman+expressjs@gmail.com"
},
{
"name": "Young Jae Sim",
"email": "hanul@hanul.me"
}
],
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/strongloop/express"
},
"homepage": "http://expressjs.com/",
"keywords": [
"express",
"framework",
"sinatra",
"web",
"rest",
"restful",
"router",
"app",
"api"
],
"dependencies": {
"accepts": "~1.2.3",
"content-disposition": "0.5.0",
"cookie-signature": "1.0.5",
"debug": "~2.1.1",
"depd": "~1.0.0",
"escape-html": "1.0.1",
"etag": "~1.5.1",
"finalhandler": "0.3.3",
"fresh": "0.2.4",
"media-typer": "0.3.0",
"methods": "~1.1.1",
"on-finished": "~2.2.0",
"parseurl": "~1.3.0",
"path-to-regexp": "0.1.3",
"proxy-addr": "~1.0.6",
"qs": "2.3.3",
"range-parser": "~1.0.2",
"send": "0.11.1",
"serve-static": "~1.8.1",
"type-is": "~1.5.6",
"vary": "~1.0.0",
"cookie": "0.1.2",
"merge-descriptors": "0.0.2",
"utils-merge": "1.0.0"
},
"devDependencies": {
"after": "0.8.1",
"ejs": "2.1.4",
"istanbul": "0.3.5",
"marked": "0.3.3",
"mocha": "~2.1.0",
"should": "~4.6.2",
"supertest": "~0.15.0",
"hjs": "~0.0.6",
"body-parser": "~1.11.0",
"connect-redis": "~2.2.0",
"cookie-parser": "~1.3.3",
"express-session": "~1.10.2",
"jade": "~1.9.1",
"method-override": "~2.3.1",
"morgan": "~1.5.1",
"multiparty": "~4.1.1",
"vhost": "~3.0.0"
},
"engines": {
"node": ">= 0.10.0"
},
"files": [
"LICENSE",
"History.md",
"Readme.md",
"index.js",
"lib/"
],
"scripts": {
"test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/",
"test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/",
"test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/",
"test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/"
},
"gitHead": "63ab25579bda70b4927a179b580a9c580b6c7ada",
"bugs": {
"url": "https://github.com/strongloop/express/issues"
},
"_id": "express@4.11.2",
"_shasum": "8df3d5a9ac848585f00a0777601823faecd3b148",
"_from": "express@*",
"_npmVersion": "1.4.28",
"_npmUser": {
"name": "dougwilson",
"email": "doug@somethingdoug.com"
},
"maintainers": [
{
"name": "tjholowaychuk",
"email": "tj@vision-media.ca"
},
{
"name": "jongleberry",
"email": "jonathanrichardong@gmail.com"
},
{
"name": "shtylman",
"email": "shtylman@gmail.com"
},
{
"name": "dougwilson",
"email": "doug@somethingdoug.com"
},
{
"name": "aredridel",
"email": "aredridel@nbtsc.org"
},
{
"name": "strongloop",
"email": "callback@strongloop.com"
},
{
"name": "rfeng",
"email": "enjoyjava@gmail.com"
}
],
"dist": {
"shasum": "8df3d5a9ac848585f00a0777601823faecd3b148",
"tarball": "http://registry.npmjs.org/express/-/express-4.11.2.tgz"
},
"directories": {},
"_resolved": "https://registry.npmjs.org/express/-/express-4.11.2.tgz",
"readme": "ERROR: No README data found!"
}
name - 包的名稱
version - 包的版本
description - 包的描述
homepage - 包的網(wǎng)站主頁
author - 包的作者
contributors - 包的貢獻(xiàn)者的名稱列表
dependencies - 依賴性列表。npm自動安裝所有在node_module文件夾中的包提到的依賴關(guān)系。
repository - 包的存儲庫類型和URL