那天去上了IBM以Node.js進行Domino新開發實戰的課程後,
回來本來是想分享一下想法,讓沒去的人也可以有點收穫,但一忙就忘了,今天補了起來,大家就加減看一下。
https://m.box.com/shared_item/https%3A%2F%2Fibm.box.com%2Fv%2Fdomino10nodejs
選擇node.js做為整合的對象,對notes來說是有很大意義,
node.js的語法就是JavaScript,如果有寫Web前端的程式,應該都很熟悉,也很容易上手。
一直以來Notes被詬病為封閉的系統,主要是因為不像其他程式,以RDB資料庫儲存data,任何程式都可以對資料加以新增修改刪除,而Notes卻只能寫好現成的程式讓人呼叫,總是不那麼自由。現在提供了一個module,一個API,在系統整合上算是跨出了一大步。
可惜的是目前只提供了在Linux環境下可使用。我對Linux的認識就停留在只會拼字,其他完全沒概念,所以只好等windows版本出來才能測試了。
回到JavaScript語法,JavaScript可以直接在瀏覽器端操控使用者的頁面,比起後端程式將request傳到Server執行計算結果再傳至瀏覽器,JavaScript的效率根本是個神。
可惜的是,之前認知的JavaScript都只是前端的程式,沒辦法跑在Server端,如果要取得資料,即使是ajax或web service也還是要去呼叫後端的程式來執行。
xPages上的SSJS雖然名字中有JavaScript,是多了很多web觸發的event或部份更新套件,畢竟還是Server端的程式,而不是JavaScript。
但node.js實實在在就是在server端的JavaScript的語法。以那天上課的hello world為例,
console.log('hello
world');
在命令字元上直接執行就可看到hello world的結果了。
開記事本寫入JavaScript程式後,存成xxxx.js的檔案,就變成一個可執行的module,
在程式中若要使用其他模組中的function,只要require("xxxx.js")呼叫即可將其他module的function傳過來,可以想成是在lotus script中用include library後呼叫function。
若是安裝了npm,可以從網路上直接引用別人寫好的module,取之不盡的現成module,是node.js之所以強大的其中一個原因,
而這次domino和node.js能夠整合,也是domino提供了現成的module讓node.js引用,只是目前這模組在網路上應該是找不到的,要自己下載到local端。
那天上課用的express module就是常用的module之一,要架一個web server,不再需要繁複的步驟,只要簡單幾行,全世界最簡便的web server就完成了。
var
express = require('express');
var
app = express();
app.listen(3000,
function(){
console.log('Example app listening on
port 3000!');
});
(這是修改上課的例子,還是要註明一下以免被告)
把以上的程式存成index.js檔,然後在命令提示字元中下指令,
node index.js
就會執行這段程式,把web server架起來了,有沒有超強?
接下來要講的是第二個是我覺得node.js很重要的概念,當你程式執行後就常駐在server,其實並沒有看到任何的呈現,怎麼知道程式有在執行?
我們先回頭來說明一下listen那行的程式,這行的意思就是程式會持續不斷地監聽server port 3000,
在listen那行裡的function,是指當有人透過url連到port 3000時,就會觸發function的執行,
所以你就用browser連到server http://xxxxx:3000
然後在server console上出現 Example app listening on
port 3000!
很酷的是,這支function被當作listen這method的一個參數,也就是當監聽到了就立馬去執行,
甚至也不用給它function name,這就叫做匿名程式,當然給了也可以,或是直接呼叫現成的function,
總之,就是當有人連到server的port 3000時,在server console上就出現 Example app listening on port 3000! 這段字,表示程式執行了。
從一開始在server上以node index.js啟動這支index.js程式後,到最後console出現文字,
我們發現程式的執行是不對等、不同步的。
也就是,程式啟動後先跑了一部份,剩下的等有機會再傳回,這方法就叫做Callback。
和我們以往的概念不同,試想,不管是.NET, PHP或Notes,web程式執行的概念都是以url傳送request至server,
然後Web Server接收到請求後會建立一個procedure,再呼叫對應的程式執行,最後再產出後output,並結束procedure。
這方法最大的問題在於,假設執行的後端程式非常輕量化時,in和out這兩個動作就佔用了超過一半以上的資源和時間。
而每一次的執行,就會再開啟另一個新的procedure。
比起早就等在路上的node.js的程序,這速度根本沒得比。
再借用一下IBM的圖,不要告我!
這支index.js常駐程式就一直監聽著port 3000,反覆地把request後送並傳回,有沒有很聰明?我不明白為什麼翻成事件驅動,但大致上就是這個概念。
我必須要強調的是,「假設執行的後端程式非常輕量化時」,也就是node.js的程式若是要處理的是大數據或要跑上數分鐘以上的大程式,
和in/out所耗用的時間不成比例,用這方法就失去意義了。
node.js是單一執行緒,那天上課也有提到blocking和non-blocking,在說明之前要先強調,也就是說如果你寫的是blocking的程式,一次就只能做一件事,當這支程式被呼叫時,下個呼叫者就必須等到前一次執行結束時才能繼續執行。
因此我們在操作時當然該多使用non-blocking的操作,在node.js裡non-blocking的程式碼運行順序和我們之前認知的有所不同,當你以如上例的callback將function的計算分散進行時,你可以想像成就像我們使用javascript呼叫ajax程式時,現有的程式也是同步併行,而不是以順序執行。
在程式規劃時就可以將更耗費資源的程式丟給另一支function去執行,只要二人約好,等等把執行完的結果丟在前面路口就可以了。
呃。。。不好意思,公司要發湯圓了,剩下的有興趣的人再上網去查資料吧。