----------------------------Nodejs是個什么東西
javascript是一門完整的語言,可以運行在不同的上下文環境中.
我們平時都在瀏覽器中運行javascript代碼,瀏覽器為js提提供了一個上下文,它定義了使用JavaScript可以做什么
Node.js事實上就是另外一種上下文,它允許在后端(脫離瀏覽器環境)運行JavaScript代碼。
要實現在后台運行JavaScript代碼,代碼需要先被解釋然后正確的執行。Node.js的原理正是如此,它使用了Google的V8虛擬機(Google的Chrome瀏覽器使用的JavaScript執行環境),來解釋和執行JavaScript代碼。
---------------------------------技巧
- node安裝以后可以用 $ node app 命令執行。
- 如果直接用輸入node回車,會進入持續的node環境,可運行javascript代碼,按兩次ctrl+c退出
- 前幾天摸索的mongodb也有這個功能,因為mongodb的shell是基於javascript的
- 兩者的連續輸入模式都可以輸入,運行javascript代碼。
- node的模塊只能加載一次,quire導入模塊的時候,會先從require.cache 中檢查模塊是否已經加載,如果沒有加載,才會從硬盤中查找模塊腳本並加載。 require支持相對路徑查找模塊,例如上面代碼中require('./moduleExample')中的“./”就代表在當前目錄下查找。
-----------------------------Nodejs是事件驅動的
不過這是Node.js原生的工作方式。它是事件驅動的,這也是它為什么這么快的原因。
事件驅動的異步服務器端JavaScript和它的回調啦!
1 function onRequest (request,response) { 2 console.log('Request received'); 3 response.writeHead(200,{"Content-Type":"text/plain"}); 4 response.write("Hello World"); 5 response.end(); 6 } 7 8 http.createServer(onRequest).listen(8888); 9 10 console.log('Server has started');
http.createServer(onRequest).listen(8888);
onRequest是我們傳遞進去的回調函數,當我們請求頁面的時候調用,會傳入兩個參數,這兩個參數都是對象.
這兩個參數對象可以包含請求的細節(request),和我們返回給用戶的內容(response)
當收到請求時,使用 response.writeHead() 函數發送一個HTTP狀態200和HTTP頭的內容類型(content-type),使用 response.write() 函數在HTTP相應主體中發送文本“Hello World"。
response.end()完成響應.
---------------------------------nodejs 模塊
var http = require('http') //http模塊
這里我們請求了一個http模塊,返回了一個擁有所有http模塊共有方法的對象,賦值給了變量。
一般變量名和模塊名一致。
---------------------------------nodejs 編譯型的?
我修改了js中的一些內容,必須重新node server.js才能實現,是不是變成了java的編譯的,后續看看他能不能動態接收參數。
叫重啟服務器,具體內容還未知
--------------------------------傳參強大之處
就像這樣,我們傳遞一個東西,然后服務器利用這個東西來完成一些事。嗨那個叫路由的東西,能幫我把這個路由一下嗎?
我僅僅是需要拿你來執行一個動作,你不需要名詞,只需要動詞。即參數傳遞的是直接要用的動詞函數.
--------------------------------阻塞與非阻塞
因為Node一向是這樣來標榜自己的:“在node中除了代碼,所有一切都是並行執行的”。
這句話的意思是說,Node.js可以在不新增額外線程的情況下,依然可以對任務進行並行處理 —— Node.js是單線程的。它通過事件輪詢(event loop)來實現並行操作,對此,我們應該要充分利用這一點 —— 盡可能的避免阻塞操作,取而代之,多使用非阻塞操作。
然而,要用非阻塞操作,我們需要使用回調,通過將函數作為參數傳遞給其他需要花時間做處理的函數(比方說,休眠10秒,或者查詢數據庫,又或者是進行大量的計算)。
child_process。之所以用它,是為了實現一個既簡單又實用的非阻塞操作:exec()。
當exec()在后台執行的時候,Node.js自身會繼續執行后面的代碼。並且我們這里假設傳遞給exec()的回調函數,只會在“find /”命令執行完成之后才會被調用。
請求處理程序 -> 請求路由 -> 服務器 這樣方式傳遞值,最后給用戶