繼續學習 Node.js html
== 文件操做 == 前端
NodeJS 對比瀏覽器中的 js 重點(進步)是能操做文件... 經過內模塊 `fs' (文檔...) node
實驗一下, 進入 node 交互命令行: web
> var fs = require('fs'); // 引入 fs 模塊 undefined // node 響應 > fs // 顯示一下 fs 這個對象 ... ... ... 大量內容, 對象被顯示出來... > var temp = fs.readFileSync('hell.txt'); > temp; // 顯示讀入的是什麼 <Buffer 12 34 56 ... 一大堆二進制表示的字節吧... > (至少能快速實驗一下) 後面又實驗了一下, fs 彷佛初始就有此變量, 不須要 require ...?
API 蜻蜓點水 shell
能夠看官方文檔(估計須要再去查), 如 https://nodejs.org/api/buffer.html 編程
彷佛(缺省?)可用對象: assert, buffer, child_process, cluster, console, ... (內建?) 設計模式
NodeJS 帶一個內建的調試器: api
$ node debug hello.js < Debugger listening on port xxxx debug> . ok ... debug>help Commands: run (r), cont (c), next (n), step (s), out (o), backtrace (bt), setBreakpoint (sb), clearBreakpoint (cb), watch, unwatch, watchers, repl, restart, kill, list, scripts, breakOnException, breakpoints, version debug>
雖然有點簡陋, 但總比沒有強... 數組
NodeJS 最精華的異步 IO 模型在 fs 模塊中有體現: 瀏覽器
fs.readFile(filename, function(err, data) { if (err) deal-with-error; else deal-with-data; });
示例: 經過 同步讀取目錄/文件 => 遞歸 => 回調 實現 travel(dir, callback) -- 目錄遍歷函數.
也有異步版本, 要是沒有必要, 仍是暫時不學異步版了.
== 網絡操做 ==
NodeJS 能夠編寫一些服務器端程序來協助前端開發和測試. (例如作 WebSocket 服務器)
實現 hello-world 的 web-server 例子(略).
對應模塊有 http, https, url, querystring, net, socket 等.
這裏不少須要 socket, http協議知識. (知識太多,學不過來...)
zlib 模塊可能也須要, 對於那些帶壓縮的 http 數據.
== 進程管理 ==
經過產生新進程, nodejs 可以調用(別的)終端命令(或程序) 來作事情(像 shell,批處理)
(這是一種強大的思想和能力, 本身花時間作不如用別人現成的, 現成沒有或不足用再本身幹...)
var worker = require('child_process'); worker.exec('copy x y', callback() { print('Work complete~'); });
注: 子進程是異步運行的(應該說是本身獨立運行的), 經過回調函數返回執行結果.
進程間通訊: 若是父子進程都是 nodejs 進程, 則可經過 IPC 雙向傳遞數據.
process.on('message', callback(msg) { ... }); 收到(父進程傳遞來的)該消息時作處理... (這裏像 websocket)
msg 在發送端用 JSON.stringify 序列化, 接收端用 JSON.parse 反序列化.
== 異步編程 ==
NodeJS 最大的賣點 --- 事件機制,異步IO.
直接體現是回調. (前面見到不少了)
異步編程有特有的代碼設計模式.
同步下: 異步下:
函數返回值 --> 回調函數
遍歷數組 --> 串行處理(若是可並行處理, 需更多特定標誌)
異常處理 --> 回調中額外帶 err (catch 住的異常)參數.
異常增長了編程複雜度. (若是沒有效益, 仍是少用爲好...)
== 域 ==
NodeJS 提供 domian 模塊, 能夠簡化異步代碼的異常處理. 簡而言之, 一個域是一個 JS 運行環境.
NodeJS 的大量 API 使用 C/C++ 實現的, 若是運行過程當中出現異常可能會打斷正常代碼執行流程,
致使 C/C++ 部分有異常, 進而致使xxx. 最好處理完異常後重啓程序...
== 一個大的示例 ==
經過屢次迭代開發(演示)一個簡單靜態文件合併 server. (略)
原做者建議:
1. 要熟悉官方 API 文檔.
2. 要先設計再實現.
3. 要實現後再設計. (意思是要迭代)
4. 要充分利用三方包.
5. 不要迷信三方包.
(END)