在命令行鍵入node命令,後面沒有文件名,就進入一個Node.js的REPL環境(Read–eval–print loop,」讀取-求值-輸出」循環),能夠直接運行各類JavaScript命令。node
REPL是Node.js與用戶互動的shell,各類基本的shell功能均可以在裏面使用,好比使用上下方向鍵遍歷曾經使用過的命令。shell
Node採用V8引擎處理JavaScript腳本,最大特色就是單線程運行,一次只能運行一個任務。這致使Node大量採用異步操做(asynchronous opertion),即任務不是立刻執行,而是插在任務隊列的尾部,等到前面的任務運行完後再執行。npm
因爲這種特性,某一個任務的後續操做,每每採用回調函數(callback)的形式進行定義。緩存
Node約定,若是某個函數須要回調函數做爲參數,則回調函數是最後一個參數。另外,回調函數自己的第一個參數,約定爲上一步傳入的錯誤對象。服務器
這是由於回調函數主要用於異步操做,當回調函數運行時,前期的操做早結束了,錯誤的執行棧早就不存在了,傳統的錯誤捕捉機制try…catch對於異步操做行不通,因此只能把錯誤交給回調函數處理。異步
若是沒有發生錯誤,回調函數的第一個參數就傳入null。這種寫法有一個很大的好處,就是說只要判斷回調函數的第一個參數,就知道有沒有出錯,若是不是null,就確定出錯了。另外,這樣還能夠層層傳遞錯誤。async
Node提供兩個全局變量,都以兩個下劃線開頭。函數
__filename:指向當前運行的腳本文件名。工具
__dirname:指向當前運行的腳本所在的目錄。oop
http:提供HTTP服務器功能。
url:解析URL。
fs:與文件系統交互。
querystring:解析URL的查詢字符串。
child_process:新建子進程。
util:提供一系列實用小工具。
path:處理文件路徑。
crypto:提供加密和解密功能,基本上是對OpenSSL的包裝。
核心模塊老是最優先加載的。若是你本身寫了一個HTTP模塊,require('http')加載的仍是核心模塊
全部代碼都運行在模塊做用域,不會污染全局做用域。
模塊能夠屢次加載,可是隻會在第一次加載時運行一次,而後運行結果就被緩存了,之後再加載,就直接讀取緩存結果。要想讓模塊再次運行,必須清除緩存。
模塊加載的順序,按照其在代碼中出現的順序。
require方法有一個main屬性,能夠用來判斷模塊是直接執行,仍是被調用執行。
直接執行的時候(node module.js),require.main屬性指向模塊自己。
require.main === module // true
調用執行的時候(經過require加載該腳本執行),上面的表達式返回false。
注意,從npm v2.6.1 開始,npm update只更新頂層模塊,而不更新依賴的依賴,之前版本是遞歸更新的。若是想取到老版本的效果,要使用下面的命令。
$ npm --depth 9999 update