node.js高階程式設計閱讀筆記
- 事件驅動程式設計是指程式的執行流程取決於事件,當感興趣的事情發生時由系統呼叫的函式來取代應用返回值的程式設計風格被稱為事件驅動程式設計或者非同步程式設計,它是Node的顯著特徵之一,這種程式設計風格意味著當前程序在處理I/O操作時不會發生阻塞,因此多個I/O操作可以並行進行,當每個操作結束時,將會分別呼叫其對應的回撥函式,執行緒是一種輕量級的程序。
- 事件驅動程式設計風格和事件迴圈相伴相生,事件迴圈是一個處於不間斷迴圈的結構,該結構主要有兩種功能,事件檢測和事件觸發處理。事件迴圈只是在一個程序中執行的單個執行緒,這意味著當事件發生時,可以不用中斷就執行事件處理程式。有以下兩個特點:
- 在任意時刻,最多執行一個事件處理程式。
- 事件處理程式可以不間斷地執行直到結束。
- js的第一類函式(first-class func),函式可以賦值給變數。
(function(){ var clickCount = 0; $('#mybutton').click(function(){ clickCount ++; alert("a"); }) }()) 複製程式碼
閉包可以避免汙染全域性作用域
- 在js中,函式操作並不是孤立地工作而是會記住它被宣告時所在的上下文,這能讓函式操作其宣告時所在的上下文以及父上下文中的所有變數。即使宣告回撥函式的那個作用域已經返回,回撥函式依然可以操作該作用域和父作用域中的任意變數。
- js是一門強大的語言,因為它具有第一類函式和閉包,所以很適合事件驅動程式設計風格。
載入模組
var module = require('module_name'); 複製程式碼
上面的程式碼會匯入一個核心模組或者由npm安裝的模組,require函式會返回一個物件,該物件表示模組對外暴露Js API。根據模組的不同,該物件可能是任意JavaScript值--可以是一個函式,也可以是一個具有若干屬性的物件,屬性可能是函式、陣列或其他任何型別的javascript物件。
- 在Node中,檔案和模組是一一對應的
function r_squared() { return Math.pow(r,2); } function area() { Math.PI * r_squared() } return { area: area } } 複製程式碼
module是一個變數,它表示當前模組自身,而module.exports表示模組向需要它的指令碼所匯出的物件,它可以是任意物件。
載入核心模組
node中有一些以二進位制形式釋出的模組,這些模組被稱為核心模組,核心模組只能通過模組名引用,不能通過檔案路徑引用,即使已經存在 複製程式碼
一個與其同名的第三方模組,也會優先載入核心模組。 var http = require('http'); 2. 載入檔案模組可以用絕對路徑和相對路徑,還可以使用資料夾路徑來載入模組 var myModule = require('./myModuleDir'); 如此一來,Node就會在指定的資料夾下查詢模組,Node會假定該資料夾是一個包,並試圖查詢包定義,包定義包含在名為package.json的檔案中。如果資料夾中不存在包定義檔案package.json,那麼包的入口點會假定為預設值index.js。反之,如果存在package.json檔案, 那麼Node就會嘗試解析該檔案並查詢main屬性,將main屬性當作入口點的相對路徑。
從node_modules夾載入
如果一個模組名既不是相對路徑,也不是核心模組,那麼Node就會嘗試在當前目錄下的node_modules資料夾中查詢該模組。
快取模組
模組在首次載入時會被快取起來,這意味著如果模組名能被解析為相同的檔名,那麼每次呼叫require('myModule')都會確切的返回 同一模組。
總結
Node取消了js預設的全域性名稱空間,而用CommonJS模組系統取而代之,這樣可以讓你更好地組織程式碼,也因此避免一些安全性問題和錯誤 。可以使用require()函式從檔案或者資料夾載入核心模組、第三方模組或者自定義模組。