研究 Node.js 和 Express.js 有感

簡單來說網頁設計,就是設計ㄧ個讓在給了Key 後把相關資料轉換成網頁的 function。
Node 提供ㄧ個可以用 JS 與其溝通的 non-blocking http server。Express 在上面提供了簡易建立 RESTFUL API、在頁面間 (在 server 上) 傳遞資料的方法。
從外部來看,就是一個 JavaScript 程式,然後你對它送一些 Request,他就會吐 http response 回來。
Http response 包含了資料 ( ex: 文章、作者、照片、標題、按鈕文字 ) 和 UI/排板 ( CSS / HTML / client-side JavaScript )。通常資料是不重複的。但根據不同的資料,UI 很多重複的地方就變成用 UI Template/UI 元件來表示。
傳統產生網頁的方式是把資料和 UI 原件混成一個個各別的網頁然後傳給 Browser 畫出來;最近流行的方式是把資料和UI原件分別傳給 Browser,在 client-side browser 再用 JavaScript 把資料和 UI 原件組合成網頁。
近年流行的 json 是一顆用 ( key:value or array ) pair建起來的關聯式資料樹。因此後端資料庫不再用關聯式資料庫,用簡單 NoSql 資料庫 ( 即 dictionary ) 就夠了。
簡單來說現代的網頁開發就是開發一個程式:從後端抓一顆 json 資料樹,然後轉成前端美美的 DOM Tree。就是模組化的 Data Visualization,這樣想一切都輕鬆多了。
這樣的想法很自然的催生了一堆 UI 的程式庫,像是 Angular.js 和 react.js,然後還有 mobile上的 react native。

Node.js 的發明人 Ryan Dahl 在 Yahoo 介紹 Node.js (2010)

Node.js主要專注在Performance。Node的特點是對I/O有特別的處理方式,特別快。 在有100個client下,每次回應1MB的Benchmark node  822 reqs/secs nginx 7xx reqs/secs others  1x reqs/secs node用javascript寫,但居然跑的比純C寫的nginx還要快!!! nginx快的原因是它不用一個Process來接處理一個 client,而是用Event Loop。 All about non-blocking I/O non-blocking I/O:   L1 / L2 / L3/Memory <             250 cycles blocking I/O:          disk / network           > 41,000,000 cycles (ex: select .. from database) 應該用不同的方式來處理這兩種I/O,他們從根本上根本不一樣。L1 cache像是拉開抽屜拿東西,存取memory像是到樓下買個東西回來,但從硬碟上拿東西像是跳上飛機、飛到地球的另一邊再飛回來一樣。 要用non-blocking I/O,就要全部的API Call都用non-blocking I/O,即時用了第三方的程式庫去存取資料庫,可能就變成blocking I/O了。要實現的方法有幾種,event loop、using callback function。 database_query("select ...",  callback function); //應該這樣做 但是大部份的語言都不預設這種寫程式的方式,如果要達成這種功能,通常要花很大的心力,最後大部份程式員最多就做到多個執行緒,然用用一個執行緒去處理一個I/O Operation。 但Javascript是個特別的例外,因為這語言從第一天就一直在處理瀏覽器的Event Loop,**callback function、anonymous function、Closure **是在平常也不過的方法了。Javascript的文化就是Event Programming。 Node.js 就是讓你單純只用Event、non-blocking的infrastructure來寫高度concurrent的程式。設計的目標是任何的function都不能直接存取I/O,一定要用callback的function來處理。其他特性還有專注在Low level、什麼都用串流、不強迫buffering、提供DNS/HTTP/TLS的內建支援。 HTTP包含: Chunked encoding, Pipelined message, hanging message. Node的API要用client side JS Programmer熟悉的慣例,幾乎100% MIT/BSD Licensed。(唯一例外是openssl) 架構 Javascript               Node standard library ------------------------------------------------------------                                Node binding C                             -------------------------------------                                V8   Thread pool & event pool

努力把使用者關在non-blocking的環境,用C語言當作屏障… XD

Node execution stack : only one stack

load(index.html) &nbsp; &nbsp;
http_parse(1) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;

socket_readable(1)
ev_loop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| |
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;V

file_loaded() &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
ev_loop &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;

然後是一大堆的小段程式範例。
包含web server和 file system的non-blocking I/O.
然後是2010年接下來的 Road Map。