Node.js入門-Node.js 介紹

Node.js 是什麼

Node.js 不是一種獨立的語言,與 PHP,Python 等」既是語言優點平臺「不一樣,它也不是一個 JavaScrip 框架,不一樣於 CakePHP,Django,更不是一個 JavaScript 庫,不能和 jQuery 相提並論。總的來講,Node.js 是一個讓 JavaScript 運行在服務端的開發平臺。html

Node.js 是一個讓 JavaScript 運行在瀏覽器以外的平臺。它實現了注入文件系統、模塊、包、操做系統級別的API、網絡通訊等JavaScript不能作到或者作得很差的功能node

Node.js 能作什麼

使用 Node.js 能夠輕鬆的開發:數據庫

  • 具備複雜邏輯的網站
  • 大規模的 Web 應用
  • Web Socket 服務器 wiki
  • TCP/UDP 套接字應用程序
  • 命令行工具
  • 交互式終端程序
  • 本地應用程序
  • 單元測試工具
  • 客戶端JavaScript編譯器

Node.js 能夠做爲服務器提供服務,他跳過了相似 Apache,IIS 等 HTTP 服務器,內建了 HTTP 服務器支持,無需額外搭建一個 HTTP 服務器,即可以垂手可得地實現網站和服務器的組合。npm

var http=require("http");
http.createServer(function(req,res){
    res.writeHead(200,{"Content-Type":"text/plain"});
    res.end("Hello,CrispElite!\n");
}).listen(3000,"127.0.0.1");//
console.log("服務器已啓動:http://127.0.0.14:3000/");

將代碼保存爲 server.js ,從終端或者CMD中運行這個程序:編程

node server.js // 必須先安裝好Node.js環境

若是成功啓動服務器,那麼在終端或者CMD中能夠看到相似這樣的顯示:瀏覽器

你的服務器已啓動:http://127.0.0.14:3000/

用瀏覽器訪問"http://127.0.0.14:3000/" (代碼中 listen() 指定的地址)
Node server服務器

Node.js 還能夠部署到非網絡應用的環境下,好比命令行。甚至能夠調用 C/C++ 的代碼,充分利用已經擁有的諸多函數庫。網絡

異步式 I/O 與事件驅動

Node.js 最大的特色就是採用異步式 I/O 與事件驅動的架構設計。對於高併發的解決方案,傳統的架構師多線程模型,也就是爲每個業務邏輯提供一個系統線程,經過切換線程彌補同步式 I/O 的事件開銷。Node.js 和 JavaScript 同樣使用的是單線程模型,對於全部的 I/O 請求都採用異步的方式,在執行過程當中維護一個且只有一個事件隊列,程序在執行時進入時間循環等待下一個事件到來,每個異步 I/O 請求完成以後都被添加到事件隊列,等待處理。多線程

什麼是阻塞( block )?線程在執行中若是遇到磁盤讀寫或者網絡通訊( 統稱爲 I/O 操做 ),一般要耗費較長時間,這是才作系統會剝奪這個線程的 CPU 控制權,使其暫停執行,並將資源讓給其餘的工做線程,這種線程調度方法稱爲阻塞。當 I/O 操做完畢時,系統將這個線程的阻塞狀態解除,恢復其對 CPU 的控制權,令其繼續執行。這種 I/O 模式就是一般的同步式 I/O ( Synchronous I/O )或者阻塞式 I/O ( Blocking I/O )架構

好比:你去超市買東西,結帳的櫃檯只有一個,可是排隊結帳的人不少。而你只能排隊結帳。,但是天天排隊的人不少,慢慢的你們開始抱怨天天買點東西搞得像過年過節同樣。超市老闆爲了知足顧客,斥資招人,多開幾個結帳櫃檯。這樣一來,雖然還要排隊,可是隊伍多了,每一個隊伍的等待時間少了。

異步式 I/O ( Asynchronous I/O ) 或者非阻塞式 I/O ( Non-blocking I/O ) 則針對全部 I/O 操做不採用阻塞的策略。當線程遇到 I/O 操做時,只將 I/O 請求發送給操做系統,繼續執行下一條語句。當操做系統完成 I/O 操做時,以事件的形式通知執行 I/O 操做的線程,線程會在特定時候處理這個事件。

好比:你仍是去超市買東西,可是你要的東西超市採購的貨還在路上,因而到櫃檯諮詢。客服要求你留下聯繫方式,貨到以後聯繫你。過了幾天,超市工做人員打電話給你,告訴你你要的貨到了。而後你屁顛屁顛跑去超市拿貨。

阻塞模式下,一個線程只能處理一項任務,想提升吞吐量必須經過多線程。而非阻塞模式下,一個線程永遠在執行計算操做, I/O 以事件的方式通知。多線程帶來的好處僅僅是在多核 CPU 的狀況下利用更多核,而 Node.js 的單線程也能帶來一樣的好處。這就是爲何 Node.js 使用了單線程,非阻塞的事件編程模式。

單線程事件驅動的異步I/O 比傳統的多線程阻塞式 I/O 的好處在於:異步式 I/O 少了了多線程的開銷。具體細節請看link

好比:簡單的數據庫查詢操做,按照傳統的方式實現的代碼以下:

res=db.query("SELECT * from someTable");
res.output();

執行到第一行的時候,線程會阻塞,直到數據庫返回查詢結果。而後再繼續處理。當涉及到磁盤讀寫,網絡通訊時,時延可能很是大,線程會阻塞等待結果返回。對於高併發的訪問,一方面線程長期阻塞等待,另外一方面爲了應付新的請求而不斷增長線程,所以浪費大量系統資源。而對於 Node.js 來講,是這樣的

db.query("SELECT * from someTable",function(res){
    res.output();
});

進程在執行到 db.query 時,不會等待結果返回,而是直接繼續執行後面的語句,直到進入事件循環。

Node.js 的模塊( Module )和包( Package )

模塊( Module )和包( Package )是 Node.js 最重要的支柱。經過 npm 安裝須要的模塊,使用 require 函數來調用其餘模塊。
npm 是 Node.js 的包管理器。容許咱們下載、安裝、升級、刪除包。npm 之於 Node.js ,就像 pip 之於 Python,gem 之於 Ruby。
安裝好 npm 以後,能夠從終端或者CMD開始安裝模塊。

npm install [module_name]

模塊安裝成功後,會被放置在當前目錄的 node_modules 文件夾中。在使用 npm 安裝包的時候,有兩種模式:本地模式全局模式。默認狀況下使用 npm install 命令就是本地模式,將包安裝到當前目錄的 node_modules 子文件夾中。另一種被稱爲全局模式:npm install -g [modules_name] 。本地模式僅僅將包安裝到 node_modules 文件夾中,並不會註冊 PATH 環境變量,即沒法在命令行中直接使用,在 window 上 會提示「不是內部命令」之類的。而使用全局模式的時候,包會安裝在系統目錄中,在 window 中會安裝到 "C:\Users\yourUserName" 中,同時能夠在命令行中直接使用命令。可是使用全局模式安裝的包並不能直接在 JavaScript 文件中使用 require 得到。

總而言之,當須要將某個包做爲工程運做時的一部分時,經過本地模式獲取,若是要在命令行中使用,則使用全局安裝。

關於調試

我愛F5

在開發 Node.js 實現的 HTTP 應用時,不管修改了代碼的哪一部分,都必須從新運行才能奏效。由於 Node.js 只有在第一次引用到某部分時纔會解析腳本文件,以後都會直接訪問內存,避免重複載入,以提升速度。 supervisor 能夠監視代碼的修改,並自動重啓Node.js。使用 npm 以全局模式安裝 supervisor 以後,能夠直接在命令行中使用下面的命令啓動 server.js。

supervisor server.js

調試方法

調試的方法有:命令行調試,使用 Eclipse 調試等。我的傾向使用 node-inspector 進行調試。

使用 node-inspector

npm install -g node-inspector //命令安裝 node-inspector

而後在終端或者CMD中敲入

node --debug-brk=5858 filename.js  //鏈接你要測試的腳本的調試服務器
node-inspector                  //另開一個窗口,啓動 node-inspector 。

在瀏覽器中打開 「http://127.0.0.1:3000/debug?port=5858」 ,即可以看到調試工具。
具體能夠點這裏

我的筆記,僅供參考

參考: