Node.js【4】簡介、安裝和配置、快速入門

來源:互聯網
上載者:User

筆記來自《Node.js開發指南》BYVoid編著

第1章 Node.js簡介

Node.js是一個讓JavaScript運行在服務端的開發平台,它讓JavaScript成為指令碼語言世界的一等公民,在服務端堪與PHP、Python、Perl、Ruby平起平坐。


Node.js可以作為伺服器向使用者提供服務,與PHP、Python、RubyonRails相比,它跳過了Apache、Nginx等HTTP伺服器,直接面向前端開發。


Node.js還可以調用C/C++的代碼,這樣可以充分利用已有的諸多函數庫,也可以將對效能要求非常高的部分用C/C++來實現。


Node.js最大的特點就是採用非同步式I/O與事件驅動的架構設計。對於高並發的解決方案,傳統的架構是多執行緒模式,也就是為每個商務邏輯提供一個系統線程,通過系統線程切換來彌補同步式I/O調用時的時間開銷。Node.js使用的是單執行緒模式,對於所有I/O都採用非同步式的請求方式,避免了頻繁的環境切換。Node.js在執行的過程中會維護一個事件隊列,程式在執行時進入事件迴圈等待下一個事件到來,每個非同步式I/O請求完成後會被推送到事件隊列,等待程式進程進行處理。

【圖】Node.js的架構



第2章 安裝和配置Node.js
Node.js開發環境搭建(Windows、Linux&Mac)
Node.js多版本管理器


第3章 Node.js快速入門
$node-e"console.log('HelloWorld');"
HelloWorld
我們可以把要執行的語句作為node-e的參數直接執行。

REPL(Read-eval-printloop),即輸入—求值—輸出迴圈。運行無參數的node將會啟動一個JavaScript的互動式shell。如果你執行了一個函數,那麼REPL還會在下面顯示這個函數的返回值。如果你輸入了一個錯誤的指令,REPL則會立即顯示錯誤並輸出調用棧。在任何時候,連續按兩次Ctrl+C即可推出Node.js的REPL模式。

【圖】Node.js與PHP的架構


Node.js只有在第一次引用到某部份時才會去解析指令檔,以後都會直接存取記憶體,避免重複載入。supervisor可以協助你實現這個功能,它會監視你對代碼的改動,並自動重啟Node.js。使用方法很簡單,首先使用npm安裝supervisor:
$npminstall-gsupervisor
使用supervisor命令啟動app.js:
$supervisorapp.js

【圖】多線程同步式I/O


【圖】單線程非同步式I/O


單線程事件驅動的非同步式I/O比傳統的多線程阻塞式I/O究竟好在哪裡呢?簡而言之,非同步式I/O就是少了多線程的開銷。對作業系統來說,建立一個線程的代價是十分昂貴的,需要給它分配記憶體、列入調度,同時線上程切換的時候還要執行記憶體換頁,CPU的緩衝被清空,切換回來的時候還要重新從記憶體中讀取資訊,破壞了資料的局部性。

3.1 回呼函數【碼】readfile.js
// readfile.jsvar fs = require('fs');fs.readFile('file.txt', 'utf-8', function(err, data) {if (err) {console.error(err);} else {console.log(data);}});console.log('end.');
【碼】readfilesync.js
// readfilesync.jsvar fs = require('fs');var data = fs.readFileSync('file.txt', 'utf-8');console.log(data);console.log('end.');
在Node.js中,非同步式I/O是通過回呼函數來實現的。

【碼】readfilecallback.js
// readfilecallback.jsfunction readFileCallBack(err, data) {if (err) {console.error(err);} else {console.log(data);}}var fs = require('fs');fs.readFile('file.txt', 'utf-8', readFileCallBack);console.log('end.');
fs.readFile調用時所做的工作只是將非同步式I/O請求發送給了作業系統,然後立即返回並執行後面的語句,執行完以後進入事件迴圈監聽事件。當fs接收到I/O請求完成的事件時,事件迴圈會主動調用回呼函數以完成後續工作。

3.2 事件Node.js所有的非同步I/O操作在完成時都會發送一個事件到事件隊列。在開發人員看來,事件由EventEmitter對象提供。前面提到的fs.readFile和http.createServer的回呼函數都是通過EventEmitter來實現的。

【碼】event.js
//event.jsvar EventEmitter = require('events').EventEmitter;var event = new EventEmitter();// 註冊事件了事件some_event的一個監聽器event.on('some_event', function() {console.log('some_event occured.');});setTimeout(function() {// 發送事件some_eventevent.emit('some_event');}, 1000);
Node.js在什麼時候會進入事件迴圈呢?答案是Node.js程式由事件迴圈開始,到事件迴圈結束,所有的邏輯都是事件的回呼函數,所以Node.js始終在事件迴圈中,程式入口就是事件迴圈第一個事件的回呼函數。

【圖】事件迴圈


3.3 模組和包模組是Node.js應用程式的基本組成部分,檔案和模組是一一對應的。換言之,一個Node.js檔案就是一個模組,這個檔案可能是JavaScript代碼、JSON或者編譯過的C/C++擴充。

在前面的例子中,我們曾經用到了varhttp=require('http'),其中http是Node.js的一個核心模組,其內部是用C++實現的,外部用JavaScript封裝。我們通過require函數擷取了這個模組,然後才能使用其中的對象。

Node.js提供了exports和require兩個對象,其中exports是模組公開的介面,require用於從外部擷取一個模組的介面,即所擷取模組的exports對象。

3.3.1 單次載入require不會重複載入模組,也就是說無論調用多少次require,獲得的模組都是同一個。

【碼】loadmodule.js
var hello1 = require('./module');hello1.setName('ichenxiaodoa');hello1.sayHello();var hello2 = require('./module');hello2.setName('ichenxiaodao2');hello1.sayHello();hello2.sayHello();/** * 因為hello1和hello2指向的是同一個執行個體, * 所以hello2.setName覆蓋hello1.setName, * 最終輸出 Hello ichenxiaodao2 */
3.3.2 覆蓋exports有時候我們只是想把一個對象封裝到模組中。

【碼】singleobject.js
function Hello() {var name;this.setName = function(thyName) {name = thyName;};this.sayHello = function() {console.log('Hello ' + name);};};exports.Hello = Hello;
此時我們在其他檔案中需要通過require('./singleobject').Hello來擷取Hello對象,這略顯冗餘,可以用下面方法稍微簡化:
【碼】hello.js
function Hello() {var name;this.setName = function(thyName) {name = thyName;};this.sayHello = function() {console.log('Hello ' + name);};};module.exports = Hello;
這樣就可以直接獲得這個對象了:
【碼】gethello.js
var Hello = require('./hello');var hello = new Hello();hello.sayHello();hello.setName('ichenxiaodao');hello.sayHello();
注意,模組介面的唯一變化是使用module.exports=Hello代替了exports.Hello=Hello。在外部參考該模組時,其介面對象就是要輸出的Hello對象本身,而不是原先的exports。

事實上,exports本身僅僅是一個普通的Null 物件,即{},它專門用來聲明介面,本質上是通過它為模組閉包的內部建立了一個有限的提供者。因為它沒有任何特殊的地方,所以可以用其他東西來代替,譬如我們上面例子中的Hello對象。

3.3.3 建立包包是在模組基礎上更深一步的抽象,Node.js的包類似於C/C++的函數庫或者Java/.Net的類庫。它將某個獨立的功能封裝起來,用於發布、更新、依賴管理和版本控制。Node.js根據CommonJS規範實現了包機制,開發了npm來解決包的發布和擷取需求。

Node.js的包是一個目錄,其中包含一個JSON格式的包說明檔案package.json。嚴格符合CommonJS規範的包應該具備以下特徵:
➢ package.json必須在包的頂層目錄下;
➢ 二進位檔案應該在bin目錄下;
➢ JavaScript代碼應該在lib目錄下;
➢ 文檔應該在doc目錄下;
➢ 單元測試應該在test目錄下。

Node.js對包的要求並沒有這麼嚴格,只要頂層目錄下有package.json,並符合一些規範即可。當然為了提高相容性,我們還是建議你在製作包的時候,嚴格遵守CommonJS規範。

【碼】somepackage/index.js
exports.hello=function(){console.log('Hello');}

【碼】getpackage.js

varsomepackage=require('./somepackage');somepackage.hello();

在前面例子中的somepackage檔案夾下,我們建立一個叫做package.json的檔案,內容如下所示:

{"main":"./lib/interface.js"}

然後將index.js重新命名為interface.js並放入lib子檔案夾下。以同樣的方式再次調用這個包,依然可以正常使用。


Node.js在調用某個包時,會首先檢查包中package.json檔案的main欄位,將其作為包的介面模組,如果package.json或main欄位不存在,會嘗試尋找index.js或index.node作為包的介面。

package.json是CommonJS規定的用來描述包的檔案。詳細的設定看這裡。

3.3.4 Node.js包管理器本地安裝:npm[install/i][package_name]
全域安裝:npm[install/i]-g[package_name]

當我們要把某個包作為工程運行時的一部分時,通過本地模式擷取,如果要在命令列下使用,則使用全域模式安裝。

把全域包連結到本地:
在工程目錄下運行:npmlink[package_name]

把當地套件連結到全域:
在包目錄中運行:npmlink

3.3.5 發布包1、通過npminit互動式回答產生一個符合標準的package.json。
2、建立一個index.js作為包的借口。
3、使用npmadduser根據提示輸入使用者名稱、密碼、郵箱,等待帳號建立完成。
4、完成後可以使用npmwhoami測驗是否已經取得了帳號。
5、在package.json所在目錄下運行npmpublish,稍等片刻就可以完成發布了。

如果該包日後有更新,只需要在package.json檔案中修改version欄位,然後重新使用npmpublish命令就行了。

如果你對發行的包不滿意,可以使用npmunpublish命令來解除發佈。

3.3.6 調試 命令列調試
nodedebug[script.js]

遠端偵錯
node--debug[=port]script.js
node--debug-brk[=port]script.js

使用Eclipse調試Node.js
安裝外掛程式:ChromeDeveloper

使用node-inspector調試
1、安裝node-inspector:npminstall-gnode-inspector
2、啟動node-inspector
3、啟動指令碼:node--debug-brk=5858debug.js
4、在瀏覽器中開啟http://127.0.0.1:8080/debug?port=5858

node-inspector使用了WebKitWebInspector,因此只能在Chrome、Safari等WebKit核心的瀏覽器中使用,而不支援Firefox或InternetExplorer。


文檔資訊

  • 著作權聲明:自由轉載-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
  • 原文網址:http://blog.csdn.net/cdztop/article/details/33130969
  • 最後修改時間:2014年06月22日 03:24

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.