NodeJs是什么我想大家已經很了解了,作為一個前端工程師,想要不斷提升自己,一般都會接觸到后端服務器的技術,NodeJs給我們提供了一個學習成本相對較低的捷徑可走。
我一向不贊成評價到底哪個語言好哪個語言爛,存在即合理似乎是這個世界不變的真理。每個語言都有其特性及適用場景。
既然是這樣,我們先來梳理一下NodeJs的適用場景:
1:高並發、高I/O場景
2:邏輯較少
3:追求響應速度的項目
以上三點是我們使用NodeJs所要考慮的,由於nodejs是單線程、異步I/O的、事件驅動的語言,所以帶來響應速度的基礎上也會有很多坑,鑒於此篇博文是純新手向的,所以並不多闡述回調帶來的代碼混亂問題,
僅致力於帶領讀者入門,可以自行搭建http服務器。
同時 如果你想學習nodejs,建議你掌握javascript的底層知識,包括閉包,原型鏈,OOP等。如果你熟悉commonJS會對你學習nodejs帶來更好的體驗。
———————————————————————————————————正文—————————————————————————————————————
一:安裝
安裝就不多說了 現在網上一搜一大堆教程,Mac的 linux的 windows的都有 大家可以查看一下
二:第一個應用
nodejs有兩種方式可供調試代碼,第一種是直接用控制台交互
安裝完nodejs之后,Ctrl + R打開命令行,輸入node 就回進入到交互界面
在交互界面支持所有js的表達式 和運算符
你可以:
var a = 1,b = 2; //保存變量 a + b //輸出結果 3
支持定義變量和運算 當然 也支持js的調試方法 比如:
console.log("2"); //輸出2 console.log(2); //輸出2 var a = 2; console.log(a); //輸出2 //好吧 為什么都是2。。。
三:搭建http服務器
我相信上面的那些東西 很少有人會喜歡看,根本跟我們要說的沒什么關系嘛!!
當然 我也覺得 不過有時候debug還是有些用處的。
好吧 既然想聽干貨,那我們下面就說說正題,搭建一個web服務器
在nodejs中 基本上所有方法都依賴”模塊“,nodejs中封裝好了很多模塊供我們使用
調用模塊也很方便 利用require方法 將模塊存到變量里 就可以拿來使用了:
var http = require("http"); http.createServer(function(req,res){ }).listen(8888);
如上所示,利用require方法獲得模塊,將模塊賦值到http變量上,require里的值必須是字符串。
這里多插一句話,有些童鞋可能會覺得nodejs是一門新的語言,對模塊、服務器狀態啥啥的搞不懂,這都是個什么玩意?
一如我開頭所說,nodejs作為js在服務器上的運行環境,你可以完全把它看成是js 沒有任何問題,他的數據類型、語法、對象都與js一毛一樣,so 別害怕 其實很簡單。
你可以把模塊看做事一個js的對象,還記得js的對象是什么么? 我們可以把對象看成是一個無序的鍵值對,這樣看起來是不是清晰多了?
你可以暫時將其想象為:
http = { a:function(){}, b:function(){} }
nodejs有兩種模塊形式,一種是原生模塊,即nodejs已定義好的模塊,就像上面的http一樣
第二種是我們自定義的模塊,為了實現某些功能和便於管理,我們經常會將我們的代碼封裝成一個一個的模塊,盡量解耦其間的依賴關系,使代碼可以復用。
在nodejs中,每一個js文件即使一個自定義模塊,引入方法也很簡單:
var server = require("./server");
后面直接加上訪問路徑即可,訪問路徑可以是絕對路徑也可以是相對路徑。
如果你的路徑中沒有此文件,nodejs會向下查找直到找到這個模塊然后引入,所以如果你有兩個相同的模塊(比如兩個服務器模塊),最好還是把路徑寫對的好。
為什么講上面這些呢? 因為我們想要搭建一個http服務器,需要用到http模塊
這里我們可以新建一個server.js文件,將下面的代碼復制進此文件:
var http = require("http"); http.createServer(function(req,res){ res.writeHead(200,{"Content-type":"text/blain"}); res.write("Hello NodeJs"); res.end(); }).listen(8888);
這樣我們就完成了一個http服務器的搭建,我們先來試下效果 打開命令行,進入到項目目錄 也就是server.js的存放目錄,然后輸入:
node server.js //記住這個命令
然后打開瀏覽器,訪問localhost:8888,是不是出現熟悉的Hello NodeJs了呢?
下面我們來一點一點看上面的代碼,力求用最簡單的話來解釋清楚
首先我們看到 我們調用了http的creatServer方法,這個方法就是nodejs用來創建一個http服務器的方法,這個方法本身什么都不會做,只會創建一個http服務器,但是他有且僅有一個回調函數
從這里我們可以看到 nodejs里面會大量的用到callback 即回調函數,熟悉javascript的童鞋應該會很熟悉,尤其是經常使用jquery的朋友。
回調函數,從字面理解就很容易理解的通,在我發送一條請求的時候,不會立即響應,而是在處理完成后調用此函數,此函數會返回結果。
那這個回調函數有什么作用呢? 在這個回調函數里我們看到有兩個參數,req 和res 即request 和 response 翻譯過來也很好理解了,請求和響應。
說到這講點題外話,web服務器是如何工作的呢?大致可以分為幾步:
1:客戶端(即瀏覽器)發送請求
2:服務器接收請求
3:服務器響應請求開始相應邏輯處理
4:最后返回數據給客戶端
5:客戶端渲染數據
上述第一步和第五步就是傳統前端在做的事情,而 2-4步即是nodejs 也就是服務器在做的事情。
知道了web響應過程,我們再來看這兩個參數:
request是請求,即是向服務器發送請求,暫時我們還用不上。
response是響應,我們也可以把它看成是一個對象,有鍵值對,有方法。
上面我們調用了response的三個方法
1:res.writeHead(200,{"Content-type":"text/blain"});
這個方法主要管的是向客戶端發送一個響應頭部 200即是HTTP狀態碼 不懂得朋友可以看下這里:
http://www.daqianduan.com/4280.html
狀態碼后面跟着一個對象,對象里面是一個鍵值對,Content-type代表文檔類型,text/blain代表具體的文檔類型。
我們可以試着回顧一下,web的運行原理,我們發送請求,服務器響應請求返回給我們響應頁面數據,那既然是頁面數據,一定有相應的文檔類型,text、css、heml、等等等等
既然這樣 我們總要指定打印出來的這個數據是個什么東西對么?所以響應頭部中的文檔類型是非常重要的。
2:res.write("Hello NodeJs");
這個方法很一目了然了,我們想要給客戶端發送數據和頁面,總要有一個方法來執行才行,所以我們利用res.write()方法來發送我們想要發送的東西。
3:res.end();
最后調用res.end()方法來為本次響應打上一個句號。有開始有結束。
————————————————————————————————————————結尾分割線——————————————————————————————————————————
這就是我們創建的一個最簡單的HTTP服務器了,其實剛開始寫的時候想把如何制作路由和如何制作響應程序寫在上面的,不過時間關系實在是有點多,也要下班了,所以 剩下的明后天補完,希望大家
一起進步 一起加油。
下一篇我會把我自己總結的路由模塊制作方法和處理程序模塊方法寫完,盡力讓大家走進nodejs的大門,開始新的征程。