More Related Content Similar to Noder eyes for frontend guys Similar to Noder eyes for frontend guys (20) Noder eyes for frontend guys3. 關於題目
● 源自 "Queer eyes for straight guys"
● 澄清一下
○ 寫node.js不表示比較厲害,只是希望能讓熟悉瀏覽器
的Javascript coder可以知道進入node.js需要的知識跟
常見的難點
○ I'm not queer, but I do have some friends.
● 另外...
10. global物件到底能做什麼
● 只有:
○ 操作TypedArray需要的相關物件
○ process物件
○ Buffer constructor
○ setTimeout/setInterval相關函數
○ console物件,用來作stdio
● 檢查一下:test002.js
● 接下來咧?好像沒啥東西...
12. 我可以使用jQuery嗎?
● 通常我會想:別傻了,你在寫伺服器程式
● 不是沒有解(JSDom...)
● 但除了做蜘蛛,通常不會用到
● 下一個問題也有不少人問...就是...
14. 其實,single thread是寫Javascript的必備
知識
● 參考
○ Resig: How JavaScript Timers Work
○ Zakas: Professional Javascript for Web
Developers: p. 598 Advanced Timers
○ Opera: Timing and Synchronization in
Javascript
○ HTML5: HTML5 Spec - 6.1.4 Event loops
○ YDN: Understanding event loops and
writing great code for Node.js
16. 所以,Javascript到底怎麼跑?
● 可以把Javascript的執行過程想像成
a. 執行top most的程式碼(主要是global scope,以及此時
執行的函數)
b. 進入event loop
c. 一有有事件程式放進event queue,event loop就會取出
來執行
■ 由timer觸發的,不會在時間到之前執行,但是可能
會更慢
■ 由event觸發的,就是儘快執行
● node.js的特異功能
a. process.nextTick():會盡量排在event queue前面讓他
可以先執行,而不是從後面填入
17. 這不是例外,但其實你有機會碰到別的
thread
● 在網頁端:
○ frame/iframe
○ web worker
● 在node.js
○ sub process
○ threads-a-gogo模組(這是真的thread,只能透過
message溝通,目前還無法做什麼事)
● 測試:test644.html(WebWorker的global跟網頁中完全不同)
18. 在底層,還有更多東西必須使用thread
● 寫Javascript不會直接接觸...但是在機制上
○ 瀏覽器:XMLHttpRequest底層
■ onreadystatuschange
● 網路I/O在另外一個thread跑,根據處理的狀態
變化,才把叫onreadystatuschange事件處理函
數塞進event queue
○ node.js:I/O底層
■ fs.read
■ fs.write
● 所以,single thread是對Javascript Coder必須的概念,但是
引擎實作並不是這樣
22. 所以有些事可以慢點做
● 程式打死結(ex. 無窮迴圈),是一定沒救
● 但是某個事件處理程式跑太久,還是會阻礙別
人
● 在Browser跟node.js解法都一樣,make it async
by do something later
● 使用setTimeout()/setInterval()
● 使用process.nextTick()
● 在single thread中跑的程式,就像DOS時代的合
作式多工...
25. hello world...然後我要做什麼?
● hello world總是很美好XD
● 但是很遺憾...http模組幫你做的事情不多
● 因為他沒做,所以你需要基本的http知識
○ http request
○ http headers
○ session相關
■ cookie header
■ setcookie header
■ 怎麼做出伺服器端session
○ MIME
○ ...
● 另外,沒人幫你map靜態檔案
● ...
27. 模組管理工具:NPM
● NPM(Node Package Manager)
● 原本是第三方的解決方案
● 目前已納入node.js的binary distribution中
● 怎麼找模組?
○ `npm search KEYWORD` (常會用完記憶體)
○ http://search.npmjs.org/ (官網,但是很慢)
○ https://github.
com/joyent/node/wiki/modules (這是分門別類的目
錄,但是更新可能比較慢)
○ nipster (很快,而且用評分排序)
28. node怎麼找到模組
● 之前測試過...test003.js可以看到一些線索
● 模組預設搜尋路徑
○ 目前工作目錄下的node_modules目錄
○ require.main.paths陣列中的目錄
● npm list -g顯示的路徑加上node_modules
○ 預設
■ UNIX: /usr/lib or /usr/local/lib
■ Windows: %APPDATAnpm
● 用npm安裝/管理模組會使用的路徑
○ 沒有加-g:目前路徑
○ 有加-g:npm list -g顯示的路徑
31. node.js的模組載入機制與注意事項
● require是同步執行的
○ 呼叫require時,要等到模組載入完畢,才會執行下一行
程式
● module是在沙箱中跑的
○ 所以,模組裡面沒有辦法動到主程式
○ 主程式要用到的東西,全部都要export(module.exports
或exports)
● 執行過一次require後,模組就會被cache起來
○ 所以,修改過的module,要重新啟動程式才會有作用
33. 但是,我需要AMD的話怎麼辦?
● 參考:require.js
● 其實,你可以自己做
● 例如:node-amd-loader
● 重點:
○ node只提供了核心模組
○ 沒人告訴你其他的不能自己做
○ 忘記那些爭論吧(阿?有爭論?)
34. 我需要物件導向嗎?
● node.js常用的作法:
○ 使用util.inherits(),這是給constructor來用的喔
○ 最常使用的地方:需要使用到事件機制,就要繼承
EventEmitter
● 其他...就任意...Javascript有多種作法
● 參考一下良葛格的意見
○ 程式語言的特性本質(三)-從消弭重複性看封裝、繼
承、多型
● 再來是另一個常被問到的問題...
37. 什麼是flow control?
● 函數在Javascript是一等公民,所以可以用函
數來處理函數
● 測試一下:test006.js
○ 執行三個函數
○ 全部執行完畢,才執行某個函數來處理結果
● 除了使用flow control,要能使用flow control的
函數,通常要改寫成cps的形式
● cps (continuation passing style)
○ 簡單地說就是傳入一個callback
○ 在函數結束時(可能不只一處),呼叫這個callback,有
返回值時,需要把返回值傳給它
38. 關於flow control的好文章
● Tim Caswell
○ Control Flow in Node
○ Control Flow in Node Part II
○ Control Flow in Node Part III
● Mixu's tech blog
○ Essential Node.js patterns and snippets
○ 我的例子用這個改的,因為邏輯最簡單
● 一些模組
○ https://github.com/creationix/step
○ https://github.com/caolan/async
○ https://github.com/laverdet/node-fibers
39. 另外一個讓程式碼更有結構又乾淨的方
式
● CoffeeScript
● ...我沒在用,我已經太習慣Javascript了XD
● 早上有人講這個喔(高見龍 / 龍哥)
● 另外一個寫伺服器會發現的,是關於...
40. gloal variables
● 以http server為例,每個request是一個事件
● 要維護cross request的狀態(ex. session),用
global variable就可以做到(其實不一定,要看
事件處理函數定義的位置)
● 不過當需要scale的時候,這個作法就會出問題
(ex. cluster)
● 所以,共享的狀態,儘量用外部實現比較好
(memcache, mongodb etc.)
● 好,終於要來看怎麼解決無法利用多核心cpu
的...
41. cluster模組
● since v0.6.x
● 解決single thread無法充分利用多核心的系統
優勢的問題
● 使用多個sub process,共享同一個port
● master/worker之間,透過message來溝通
● 測試一下?(之前測過了XD)
43. 我要怎樣debug?
● 建議把邏輯集中到function,放進module,做單
元測試(這是基本的refactoring)
● 簡單的邏輯bug,用console.log、console.dir就可
以解決
● 如果需要做profiling、找出memory leak,再來使
用debug工具,例如
○ Using Eclipse as Node Applications Debugger
○ other solutions: node-inpector, ndb etc.
45. 兩三事代替總結
● 這些主題,有很多是在nodejs group上常見的
● 而且,裡面有些東西是火藥庫
● node.js開發team的目標,是一個精簡而可靠
的核心,所以會放棄很多用第三方模組就可以
做到的功能
● 有需求的地方,就是可以自己插手的地方,畢
竟node.js還很年輕
● 後面某一場,Ben會分享他為什麼要開發自己
的framework,大家可以聽一聽他的心得
47. 我最近的出沒地點
● 我的Facebook
● 我的噗浪
● facebook Javascript.tw group
● facebook nodejs.tw group
● facebook PHP 台灣 group
● Zen of Friends讀書會以及Web Dev Party
● 我的部落格 (自從用噗浪以後就少出沒了)
● 歡迎來交朋友...