node.js只在第一次運行時會讀取文件內容,之後都會直接訪問內存,也就是當文件實時改動時,不會觸發從新編譯文件內容,因此須要使用supervisor、pm2等工具,對node服務進行實時管理php
什麼是阻塞(block)呢?線程在執行中若是遇到磁盤讀寫或網絡通訊(統稱爲 I/O 操做), 一般要耗費較長的時間,這時操做系統會剝奪這個線程的 CPU 控制權,使其暫停執行,同 時將資源讓給其餘的工做線程,這種線程調度方式稱爲 阻塞。當 I/O 操做完畢時,操做系統 將這個線程的阻塞狀態解除,恢復其對CPU的控制權,令其繼續執行。這種 I/O 模式就是通 常的同步式 I/O(Synchronous I/O)或阻塞式 I/O (Blocking I/O)node
異步式 I/O (Asynchronous I/O)或非阻塞式 I/O (Non-blocking I/O)則針對 全部 I/O 操做不採用阻塞的策略。當線程遇到 I/O 操做時,不會以阻塞的方式等待 I/O 操做 的完成或數據的返回,而只是將 I/O 請求發送給操做系統,繼續執行下一條語句。當操做 系統完成 I/O 操做時,以事件的形式通知執行 I/O 操做的線程,線程會在特定時候處理這個 事件。爲了處理異步 I/O,線程必須有事件循環,不斷地檢查有沒有未處理的事件,依次予 以處理。c++
對於須要長時間計算的I/O處理操做web
多線程模式:若是想實現高併發,就必須開啓多個線程 shell
單線程模式:I/O異步,經過事件方式通知線程,便可完成高併發 express
單線程事件驅動的異步式 I/O 比傳統的多線程阻塞式 I/O 究竟好在哪裏呢?npm
Node.js 程序由事件循環開始,到事件循環結束,全部的邏輯都是事件的回調函數,因此 Node.js 始終在事件循環中,程序入口就是 事件循環第一個事件的回調函數。事件的回調函數在執行的過程當中,可能會發出 I/O 請求或 直接發射(emit)事件,執行完畢後再返回事件循環,事件循環會檢查事件隊列中有沒有未 處理的事件,直到程序結束.編程
與其餘語言不一樣的是,Node.js 沒有顯式的事件循環,相似 Ruby 的 EventMachine::run() 的函數在 Node.js中是不存在的。Node.js的事件循環對開發者不可見,由libev庫實現。libev支持多種類型的事件,如 ev_io、ev_timer、ev_signal、ev_idle 等,在 Node.js 中均被 EventEmitter 封裝。libev 事件循環的每一次迭代,在 Node.js 中就是一次 Tick,libev 不 斷檢查是否有活動的、可供檢測的事件監聽器,直到檢測不到時才退出事件循環,進程結束json
Node.js 根 據 CommonJS 規範實現了包機制,開發了 npm來解決包的發佈和獲取需求。 使用以下命令初始化建立npm包數組
npm init
複製代碼
Node.js 的包是一個目錄,其中包含一個 JSON 格式的包說明文件 package.json。嚴格符 合 CommonJS 規範的包應該具有如下特徵:
全局模式的安裝:
npm [install/i] -g [package_name]
爲何要使用全局模式呢?多數時候並非由於許多程序都有可能用到它,爲了減小多 重副本而使用全局模式,而是由於本地模式不會註冊 PATH 環境變量。舉例說明,咱們安裝 supervisor 是爲了在命令行中運行它,譬如直接運行 supervisor script.js,這時就須要在 PATH 環境變量中註冊 supervisor。npm 本地模式僅僅是把包安裝到 node_modules 子目錄下,其中 的 bin 目錄沒有包含在 PATH 環境變量中,不能直接在命令行中調用。而當咱們使用全局模 式安裝時,npm 會將包安裝到系統目錄,譬如 /usr/local/lib/node_modules/,同時 package.json 文 件中 bin 字段包含的文件會被連接到 /usr/local/bin/。/usr/local/bin/ 是在PATH 環境變量中默認 定義的,所以就能夠直接在命令行中運行 supervisor script.js命令了
使用全局模式安裝的包並不能直接在 JavaScript 文件中用 require 獲 得,由於 require 不會搜索 /usr/local/lib/node_modules/
npm 提供了一個有趣的命令 npm link,它的功能是在本地包和全局包之間建立符號鏈 接。咱們說過使用全局模式安裝的包不能直接經過 require 使用,但經過 npm link命令 能夠打破這一限制。舉個例子,咱們已經經過 npm install -g express 安裝了 express, 5 這時在工程的目錄下運行命令: npm link express ./node_modules/express -> /usr/local/lib/node_modules/express 咱們能夠在 node_modules 子目錄中發現一個指向安裝到全局的包的符號連接。經過這種方法,咱們就能夠把全局包當本地包來使用了
除了將全局的包連接到本地之外,使用 npm link命令還能夠將本地的包連接到全局。 使用方法是在包目錄( package.json 所在目錄)中運行 npm link 命令。若是咱們要開發 一個包,利用這種方法能夠很是方便地在不一樣的工程間進行調試和測試
如今有兩個模塊,npm-link-module爲咱們開發的npm包;npm-link-test爲咱們要使用上面的npm包來作測試
cd npm-link-module //進入開發的npm包目錄裏
npm link //將本地的包連接到全局
cd npm-link-test //進入到測試項目中
npm link npm-link-module //將全局包npm-link-module 連接到本地node_modules路徑下,這樣本地就可使用require()引用了
複製代碼
使用node debug xxx.js 便可開啓調試模式