SlideShare a Scribd company logo
1




    飛鴿傳書 Node.js
      前端工程開發實務訓練 (6/8)

          講師:蔣定宇 / josephj




        Copyright © 2012 FITPI. All rights reserved.
2



            Agenda
    ๏ Node.js 是什麼
     ❖ 網站:Facebook, Plurk...
     ❖ PHP + Apache?
    ๏ 為什麼這麼流行
     ❖ Event-driven, 模組化, JavaScript,
       即時、新、快。

              Copyright © 2012 FITPI. All rights reserved.
3



       什麼是 Node.js

    ๏ 讓 JavaScript 不只運行在瀏覽器上。
     ❖ 跟 ASP, PHP, JSP, 有相同的地位。
     ❖ 例行性作業、工具的 Shell Script。

    ๏ 可獨自成為一台 Web Server。
    ๏ Event-driven 事件驅動。
    ๏ Non-blocking 非堵塞。


                 Copyright © 2012 FITPI. All rights reserved.
4


                Hello <Who>!
      http://f2eclass.com/lab/nodejs/hello.js
                    寫一個基本的 Shell Script
    var argv = process.argv,
        who = (typeof argv[2] !== "undefined") ? argv[2] : "World";
                                                                     
                                                                     
    console.log("Hello " + who + "!");


                > node hello.js “Awoo”

             http://nodejs.org/docs/latest/api/index.html

            未來工作排程也能用 JavaScript 來寫了!
                         Copyright © 2012 FITPI. All rights reserved.
5



          Hello <Who>! (2)
       http://f2eclass.com/lab/nodejs/http.js
                      快速建立 Web 伺服器!
    var http = require("http");

    http.createServer(function (req, res) {
        res.setHeader("Content-Type", "text/html");
        res.write("Hello World!");
        res.end();
    }).listen(8000);

    console.log("Server running at http://localhost:8000");


                 http://localhost:8000

               http://nodejs.org/api/http.html#http_http
                         Copyright © 2012 FITPI. All rights reserved.
6



           Node.js 的地位
    在 Yahoo! 的基礎技術架構是由 LAMP 構成的

              LAMP
    Linux   Apache                MySQL                        PHP
    作業系統    網頁伺服器                      資料庫                    後端程式語言




               Node.js 扮演了兩種角色、且功能更強大!

               Copyright © 2012 FITPI. All rights reserved.
7



           有什麼好處?
    ๏ 統一 Web 程式語言:前後端都寫 JS。
     ❖ 將前端工程師從瀏覽器解放,後端一樣有能力開發!
     ❖ 可利用 JavaScript Event-driven 的特性。
     ❖ 瀏覽器關閉 JavaScript 仍然可以跑 JavaScript @@

    ๏ CommonJS 規範:比瀏覽器更有結構。
    ๏ NPM 套件管理:非常容易安裝管理套件。
    ๏ 活躍的社群。
    ๏ 開發更為即時的網站應用程式。

                  Copyright © 2012 FITPI. All rights reserved.
CommonJS
8




                 http://f2eclass.com/lab/nodejs/commonjs.js
             http://f2eclass.com/lab/nodejs/commonjs-module.js

                       require 載入外部 JavaScript
commonjs.js                                           commonjs-module.js
// 透過 require 將外部 JavaScript 載入                      // 並不會是全域變數
var mod = require("./commonjs-module.js");           var foo = function () {
                                                         console.log("foo is invoked");
mod.bar();                                           };

                                                     // 所有要被外部存取的方法或屬性都需要用 exports
                                                     exports.bar = function () {
                                                         console.log("bar is invoked");
                                                     };




                        > node commonjs.js

                  解決了全域變數與外部資源管理的問題
                               Copyright © 2012 FITPI. All rights reserved.
NPM 套件管理
9




    ๏ Node.js Package Management
    ๏ 朴灵:「一個解決方案比詢問問題還多的社群」
    ๏ 用 Node.js 寫 Shell Script、部落格系統沒好處?
     ❖ 可用的資源太多了,將大大減少開發時間!


                Copyright © 2012 FITPI. All rights reserved.
10



     使用 LiveReload
         感受 npm 的強大與方便!

     ๏ 目錄檔案一但變動,網頁就會重新整理
      ❖ 按 Ctrl + F5 手動重新整理很痛苦

     ๏ 安裝 Node.js 版的 LiveReload 伺服器
       > npm install -g simple-livereload

     ๏ 啟動 LiveReload 伺服器
       > cd <工作目錄>;
       > simple-livereload <port>

     ๏ 安裝 LiveReload 的客戶端
       Google 搜尋“Chrome LiveReload”就會找到


                  Copyright © 2012 FITPI. All rights reserved.
11



     使用 LiveReload
      檔案有修改                                  Chrome 的 LiveReload 設定
     瀏覽器也會更新




     監聽   案變動並回報                                     收到變動就重新載入

          伺服器                                                  瀏覽器
                           持續連線
                                <port>
                Copyright © 2012 FITPI. All rights reserved.
12



            有什麼壞處?

     ๏ 太新了。還不夠穩定、API 也常在更新。
     ๏ 網頁有任何修改都得重新執行 node.exe。
     ๏ 會因為一個 JavaScript Error 就讓 Server 掛掉。
     ๏ 靜態檔案處理不易,得存取 FileSystem API。
     ๏ 有很多非同步的處理(Callback Pattern)。


                 Copyright © 2012 FITPI. All rights reserved.
一個錯誤就會掛掉
13




     commonjs.js                                             commonjs-module.js
     // 透過 require 將外部 JavaScript 載入                        // 並不會是全域變數
     var mod = require("./commonjs-module.js");             var foo = function () {
                                                                console.log("foo is invoked");
     // foo(); // 未定義的函式!                                   };
     foo();
                                                            // 所有要被外部存取的方法或屬性都需要用 exports
                                                            exports.bar = function () {
                                                                console.log("bar is invoked");
                                                            };




                          > node commonjs.js

                   碰到未定義的 foo 函式就會立刻掛掉
                  其他的程式語言頂多出錯、不會全部死掉

                                  Copyright © 2012 FITPI. All rights reserved.
14

                 不適合靜態檔案的存取
                           http://f2eclass.com/lab/nodejs/html.js
                           http://f2eclass.com/lab/nodejs/html.html
     html.js                                                     html.html
     var http = require("http"),                                 <!DOCTYPE html>
         fs = require("fs");                                     <html>
                                                                 <head>
     // 必須採用 fs.readFile 將    案讀入                                <meta charset="utf-8">
                                                                 <title>Node.js - 測試網頁</title>
     fs.readFile("./html.html", function (err, html) {
                                                                 <style type="text/css">
         if (err) {                                              div {
             throw err;                                              background: red;
         }                                                       }
                                                                 </style>
         // 建立 Web 伺服器                                           </head>
                                                                 <body>
         http.createServer(function (request, response) {
                                                                     <div>
             response.writeHeader(200, {
                                                                         Hello! 這是 Node.js 的測試網頁。
                 "Content-Type": "text/html"
             });                                                     </div>
             response.write(html);                               </body>
             response.end();                                     </html>
         }).listen(8000);
     });



                                       > node html.js
         一旦把 Web Server 跑起來,再怎麼改 html.html 都不會生效。一定要重啟才行。

                                           Copyright © 2012 FITPI. All rights reserved.
15



               解決方法
     ๏ 別忘了這是個很活躍的社區,一個問題
      至少有三個以上的解答 XD
     ❖ node-server
       https://github.com/cloudhead/node-static
     ❖ paperboy
       https://github.com/felixge/node-paperboy
     ❖ http-server
       https://github.com/nodeapps/http-server

                Copyright © 2012 FITPI. All rights reserved.
16


        node 介紹小結
     這是一個很新的「程式語言 + 伺服器」,問題是很
     多的,但是由於活躍的社群、解答也出乎想像地
     多。

     若你採用此技術作為開發,會看到許多最新的概
     念,但同時也必須不斷地去面對問題、逼迫自己不
     斷 Study,是很有挑戰性的。

     以 Node.js 的本身語言特性與先天優秀的架構,它
     必定是未來幾年內最重要的程式語言之一,是很值
     得花時間投資的。

             Copyright © 2012 FITPI. All rights reserved.
17




      Web 即時通訊
        過去、現在、未來的幾種作法


     最古老、不夠即時、干擾度很高的聊天室
     到最近噗浪、臉書很即時且流暢的通知
       他們各自是用什麼原理達成的呢?


      這堂課讓你了解原理、引用現成工具
     未來就可以輕鬆開發 Web 的即時訊息了!


          Copyright © 2012 FITPI. All rights reserved.
18


                  輪詢 Polling




             馬上結束                把請求保留住                                 請求永遠保持
                                 有資料再回傳
                                 斷掉再發新的
     前兩種都有可能漏訊息
       http://www.slideshare.net/amix3k/comet-with-nodejs-and-v8
                         Copyright © 2012 FITPI. All rights reserved.
19


              輪詢 Polling
      不斷地向伺服器發送請求,詢問是否有新訊息




            伺服器的負擔:請求數量過多

     http://f2eclass.com/lab/node/polling.html
                  Copyright © 2012 FITPI. All rights reserved.
20


          長時間的 Polling
      不斷地向伺服器發送請求,詢問是否有新訊息




     伺服器的負擔:請求數量仍多、而且連線時間長
     http://f2eclass.com/lab/node/long-polling.html

                    Copyright © 2012 FITPI. All rights reserved.
21




     Copyright © 2012 FITPI. All rights reserved.
22




     Copyright © 2012 FITPI. All rights reserved.
23



               關於輪詢
     Long-polling 在傳統像是 Apache 的網站伺服器
     是非常吃記憶體的,最好還是採用 nginx 或 node

             兩種 Polling 都是單向的:
     由 Browser 向 Server 詢問是否有新訊息 (pull)
     而非有新訊息就由 Server 推向 Browser (push)



                Copyright © 2012 FITPI. All rights reserved.
24



            Web Socket
                    建立雙向通道




     有資料的時候才互相傳遞,效能最好的作法!


     http://f2eclass.com/lab/node/websocket.html

                  Copyright © 2012 FITPI. All rights reserved.
25


            即時通訊小結
     WebSocket 是 HTML5 所帶來的新協定,瀏覽器
     實作不一,所以沒辦法畢其功於一役。我們仍得針
     對較差的瀏覽器採用 Long-polling、甚至採用過渡
     時期的 Flash WebSocket。

     要看瀏覽器支援度與是否安裝 Flash、實作 Long-
     polling, Flash WebSocket, WebSocket(前後端
     都要改),這也太辛苦了吧!



                 Copyright © 2012 FITPI. All rights reserved.
26



         最佳解決方案!



       Socket.io 也是 Node.js 的一個套件
     可以自行偵測瀏覽器環境、決定要採用何種方案
        你的程式只要寫一份就可以啦 :D

            http://socket.io/
              Copyright © 2012 FITPI. All rights reserved.
27



         在不同瀏覽器執行
     http://f2eclass.com/lab/node/socket-io.js




     觀察看看瀏覽器是採用何種方法取得新訊息的。




                  Copyright © 2012 FITPI. All rights reserved.
28



           YUI in Node.js
             YUI 與 Node.js 的完美結合




           Write it once, use everywhere!
          讓你寫的 YUI 在前後端都能夠執行!

      https://github.com/davglass/nodejs-yui3
     http://www.youtube.com/watch?v=quMt0w7aK4s
                   Copyright © 2012 FITPI. All rights reserved.
29



     實作照片網站的通知


       當有人上傳了一張新照片
     其他正在線上的人都能收到通知




        Copyright © 2012 FITPI. All rights reserved.
30



               相關資源
     ๏ 固定聚會:Node.js Taiwan Party
      http://nodejs.tw/

     ๏ Node.js 台灣社群協作電子書
      http://book.nodejs.tw/

     ๏ CNode: Node.js 专业中文社區
      http://cnodejs.org

     ๏ Node Packaged Modules
      https://npmjs.org/
                Copyright © 2012 FITPI. All rights reserved.

More Related Content

PDF
Javascript 入門 - 前端工程開發實務訓練
Joseph Chiang
 
PDF
NodeJS基礎教學&簡介
GO LL
 
PDF
Node.js 淺談socket.io
Simon Su
 
PDF
Java script 全面逆襲!使用 node.js 打造桌面環境!
Fred Chien
 
PDF
學好 node.js 不可不知的事
Ben Lue
 
PDF
Koa 正在等一個人
Fred Chien
 
PDF
Node.js從無到有 基本課程
Simon Su
 
PDF
用最潮的 Java script 盡情開發 kde qt 程式
Fred Chien
 
Javascript 入門 - 前端工程開發實務訓練
Joseph Chiang
 
NodeJS基礎教學&簡介
GO LL
 
Node.js 淺談socket.io
Simon Su
 
Java script 全面逆襲!使用 node.js 打造桌面環境!
Fred Chien
 
學好 node.js 不可不知的事
Ben Lue
 
Koa 正在等一個人
Fred Chien
 
Node.js從無到有 基本課程
Simon Su
 
用最潮的 Java script 盡情開發 kde qt 程式
Fred Chien
 

What's hot (20)

PDF
Npm 套件管理 & 常用開發工具介紹
wantingj
 
PDF
App house
Fred Chien
 
PDF
Node.js 進攻桌面開發
Fred Chien
 
PDF
Gulp.js 自動化前端任務流程
洧杰 廖
 
PPTX
使用 Visual Studio Code 建構 JavaScript 應用程式
Will Huang
 
PPTX
Node.js中间件 connect模块深入浅出
Eric Xiao
 
PDF
Non-MVC Web Framework
Fred Chien
 
PPTX
第三方内容开发最佳实践
taobao.com
 
PPTX
猴子也能懂的Node.js
HopenglishRD
 
PDF
SeaJS - 前端模块化开发探索与网站性能优化实践
lifesinger
 
PDF
前端的未來 - 前端工程實務訓練
Joseph Chiang
 
PDF
Continuous Delivery with Ansible x GitLab CI (2e)
Chu-Siang Lai
 
PPTX
Getting started with test automation
Ivan Wei
 
PDF
MakerBoard: MT7688 Emulator
Fred Chien
 
ODP
五行完成網頁多國語系
amostsai
 
PDF
不一樣的Web server... coServ
Ben Lue
 
PPTX
模块化和组件化Css
Wu tianhao
 
PDF
使用Javascript及HTML5打造協同運作系統
Hsu Ping Feng
 
PDF
webpack 入門
Anna Su
 
PDF
程式人雜誌 2015年五月
鍾誠 陳鍾誠
 
Npm 套件管理 & 常用開發工具介紹
wantingj
 
App house
Fred Chien
 
Node.js 進攻桌面開發
Fred Chien
 
Gulp.js 自動化前端任務流程
洧杰 廖
 
使用 Visual Studio Code 建構 JavaScript 應用程式
Will Huang
 
Node.js中间件 connect模块深入浅出
Eric Xiao
 
Non-MVC Web Framework
Fred Chien
 
第三方内容开发最佳实践
taobao.com
 
猴子也能懂的Node.js
HopenglishRD
 
SeaJS - 前端模块化开发探索与网站性能优化实践
lifesinger
 
前端的未來 - 前端工程實務訓練
Joseph Chiang
 
Continuous Delivery with Ansible x GitLab CI (2e)
Chu-Siang Lai
 
Getting started with test automation
Ivan Wei
 
MakerBoard: MT7688 Emulator
Fred Chien
 
五行完成網頁多國語系
amostsai
 
不一樣的Web server... coServ
Ben Lue
 
模块化和组件化Css
Wu tianhao
 
使用Javascript及HTML5打造協同運作系統
Hsu Ping Feng
 
webpack 入門
Anna Su
 
程式人雜誌 2015年五月
鍾誠 陳鍾誠
 

Viewers also liked (20)

PDF
前端工程開發實務訓練
Joseph Chiang
 
PDF
阿盤的 Beamer 中英字型配方
Chen-Pan Liao
 
PDF
2016.3.22 從車庫的舊pc到百萬台伺服器
Chung-Hsiang Ofa Hsueh
 
PPTX
浏览器工作原理浅析
癸鑫 张
 
PDF
Learning React - I
Mitch Chen
 
PDF
Web of Things (wiring web objects with Node-RED)
Francesco Collova'
 
PPTX
Bigger
gordon-zhiyong
 
PPT
Bluemix Node-Red Part II
Joseph Chang
 
PDF
01 Node-RED Basic
Mr.Nukoon Phimsen
 
PPT
Bluemix node red-part iii
Joseph Chang
 
PPT
Bluemix Node-Red Part I
Joseph Chang
 
PDF
暴走漫画数据挖掘从0到1
Michael Ding
 
PDF
用十分鐘學會 《微積分、工程數學》及其應用
鍾誠 陳鍾誠
 
PDF
我編譯故我在:誰說 Node.js 程式不能編成 binary
Fred Chien
 
PDF
Using Node-RED for building IoT workflows
Aniruddha Chakrabarti
 
PPTX
教材摘要版 -Big data-海量資料的資料採礦方法-三星課程網陳景祥顧問-20130521
Beckett Hsieh
 
PDF
20161024 R語言資料分析實務 (3)
羅左欣
 
PDF
機率統計 -- 使用 R 軟體
鍾誠 陳鍾誠
 
PDF
用十分鐘將你的網站送上雲端
鍾誠 陳鍾誠
 
PDF
20161003 R語言資料分析實務 (1)
羅左欣
 
前端工程開發實務訓練
Joseph Chiang
 
阿盤的 Beamer 中英字型配方
Chen-Pan Liao
 
2016.3.22 從車庫的舊pc到百萬台伺服器
Chung-Hsiang Ofa Hsueh
 
浏览器工作原理浅析
癸鑫 张
 
Learning React - I
Mitch Chen
 
Web of Things (wiring web objects with Node-RED)
Francesco Collova'
 
Bluemix Node-Red Part II
Joseph Chang
 
01 Node-RED Basic
Mr.Nukoon Phimsen
 
Bluemix node red-part iii
Joseph Chang
 
Bluemix Node-Red Part I
Joseph Chang
 
暴走漫画数据挖掘从0到1
Michael Ding
 
用十分鐘學會 《微積分、工程數學》及其應用
鍾誠 陳鍾誠
 
我編譯故我在:誰說 Node.js 程式不能編成 binary
Fred Chien
 
Using Node-RED for building IoT workflows
Aniruddha Chakrabarti
 
教材摘要版 -Big data-海量資料的資料採礦方法-三星課程網陳景祥顧問-20130521
Beckett Hsieh
 
20161024 R語言資料分析實務 (3)
羅左欣
 
機率統計 -- 使用 R 軟體
鍾誠 陳鍾誠
 
用十分鐘將你的網站送上雲端
鍾誠 陳鍾誠
 
20161003 R語言資料分析實務 (1)
羅左欣
 

Similar to Node.js 入門 - 前端工程開發實務訓練 (20)

PDF
COSCUP 2010 - node.JS 於互動式網站之應用
ericpi Bi
 
PDF
D2_node在淘宝的应用实践_pdf版
Jackson Tian
 
PPT
Node.js在淘宝的应用实践
taobao.com
 
KEY
D2_Node在淘宝的应用实践
Jackson Tian
 
PDF
Noder eyes for frontend guys
Hsu Ping Feng
 
PPTX
Node js feat pegasus
cnfi
 
PDF
北護樂學程式冬令營 2017
Hamilton Wong
 
PPTX
快速入坑 Node.js - 0613 SITCON 雲林定期聚
Lorex L. Yang
 
PDF
Class 20170126
Ivan Wei
 
PDF
Node js q-con
q3boy
 
PPTX
180518 ntut js and node
Peter Yi
 
PPT
Node Web开发实战
fengmk2
 
PPT
Node Web开发实战
fengmk2
 
PPTX
NODEjs Lesson1
3dmodeldiy
 
PPTX
深入淺出Node.JS
國昭 張
 
PDF
Debugging - 前端工程開發實務訓練
Joseph Chiang
 
PDF
Node.js Quick Tour
myzykj
 
PDF
Browser vs. Node.js Jackson Tian Shanghai
Jackson Tian
 
PDF
KSDG meet-up #1
ericpi Bi
 
PDF
Nodejs & NAE
q3boy
 
COSCUP 2010 - node.JS 於互動式網站之應用
ericpi Bi
 
D2_node在淘宝的应用实践_pdf版
Jackson Tian
 
Node.js在淘宝的应用实践
taobao.com
 
D2_Node在淘宝的应用实践
Jackson Tian
 
Noder eyes for frontend guys
Hsu Ping Feng
 
Node js feat pegasus
cnfi
 
北護樂學程式冬令營 2017
Hamilton Wong
 
快速入坑 Node.js - 0613 SITCON 雲林定期聚
Lorex L. Yang
 
Class 20170126
Ivan Wei
 
Node js q-con
q3boy
 
180518 ntut js and node
Peter Yi
 
Node Web开发实战
fengmk2
 
Node Web开发实战
fengmk2
 
NODEjs Lesson1
3dmodeldiy
 
深入淺出Node.JS
國昭 張
 
Debugging - 前端工程開發實務訓練
Joseph Chiang
 
Node.js Quick Tour
myzykj
 
Browser vs. Node.js Jackson Tian Shanghai
Jackson Tian
 
KSDG meet-up #1
ericpi Bi
 
Nodejs & NAE
q3boy
 

More from Joseph Chiang (20)

PDF
不断归零的前端人生 - 2016 中国软件开发者大会
Joseph Chiang
 
PDF
Let's Redux!
Joseph Chiang
 
PDF
Automatic Functional Testing with Selenium and SauceLabs
Joseph Chiang
 
PDF
From Hacker to Programmer (w/ Webpack, Babel and React)
Joseph Chiang
 
PDF
JavaScript Promise
Joseph Chiang
 
PDF
F2E for Enterprise
Joseph Chiang
 
PDF
JavaScript Code Quality
Joseph Chiang
 
PDF
F2E, the Keystone
Joseph Chiang
 
PDF
Performance 入門 - 前端工程開發實務訓練
Joseph Chiang
 
PDF
YUI 教學 - 前端工程開發實務訓練
Joseph Chiang
 
PDF
CSS 入門 - 前端工程開發實務訓練
Joseph Chiang
 
PDF
HTML 入門 - 前端工程開發實務訓練
Joseph Chiang
 
PDF
模块加载策略 - 2012 SDCC, 北京
Joseph Chiang
 
PDF
YUI is Sexy (for JSDC.tw)
Joseph Chiang
 
PDF
YUI is Sexy - 使用 YUI 作為開發基礎
Joseph Chiang
 
KEY
Git - The Social Coding System
Joseph Chiang
 
PDF
miiiCasa is Fun
Joseph Chiang
 
PDF
分享無名小站 API
Joseph Chiang
 
PDF
yui3 is Sexy - 使用 YUI 3 的 Sexy Part !
Joseph Chiang
 
PDF
建立前端開發團隊 - 2011 中華電信訓練所版
Joseph Chiang
 
不断归零的前端人生 - 2016 中国软件开发者大会
Joseph Chiang
 
Let's Redux!
Joseph Chiang
 
Automatic Functional Testing with Selenium and SauceLabs
Joseph Chiang
 
From Hacker to Programmer (w/ Webpack, Babel and React)
Joseph Chiang
 
JavaScript Promise
Joseph Chiang
 
F2E for Enterprise
Joseph Chiang
 
JavaScript Code Quality
Joseph Chiang
 
F2E, the Keystone
Joseph Chiang
 
Performance 入門 - 前端工程開發實務訓練
Joseph Chiang
 
YUI 教學 - 前端工程開發實務訓練
Joseph Chiang
 
CSS 入門 - 前端工程開發實務訓練
Joseph Chiang
 
HTML 入門 - 前端工程開發實務訓練
Joseph Chiang
 
模块加载策略 - 2012 SDCC, 北京
Joseph Chiang
 
YUI is Sexy (for JSDC.tw)
Joseph Chiang
 
YUI is Sexy - 使用 YUI 作為開發基礎
Joseph Chiang
 
Git - The Social Coding System
Joseph Chiang
 
miiiCasa is Fun
Joseph Chiang
 
分享無名小站 API
Joseph Chiang
 
yui3 is Sexy - 使用 YUI 3 的 Sexy Part !
Joseph Chiang
 
建立前端開發團隊 - 2011 中華電信訓練所版
Joseph Chiang
 

Node.js 入門 - 前端工程開發實務訓練

  • 1. 1 飛鴿傳書 Node.js 前端工程開發實務訓練 (6/8) 講師:蔣定宇 / josephj Copyright © 2012 FITPI. All rights reserved.
  • 2. 2 Agenda ๏ Node.js 是什麼 ❖ 網站:Facebook, Plurk... ❖ PHP + Apache? ๏ 為什麼這麼流行 ❖ Event-driven, 模組化, JavaScript, 即時、新、快。 Copyright © 2012 FITPI. All rights reserved.
  • 3. 3 什麼是 Node.js ๏ 讓 JavaScript 不只運行在瀏覽器上。 ❖ 跟 ASP, PHP, JSP, 有相同的地位。 ❖ 例行性作業、工具的 Shell Script。 ๏ 可獨自成為一台 Web Server。 ๏ Event-driven 事件驅動。 ๏ Non-blocking 非堵塞。 Copyright © 2012 FITPI. All rights reserved.
  • 4. 4 Hello <Who>! http://f2eclass.com/lab/nodejs/hello.js 寫一個基本的 Shell Script var argv = process.argv,     who = (typeof argv[2] !== "undefined") ? argv[2] : "World";                                                                     console.log("Hello " + who + "!"); > node hello.js “Awoo” http://nodejs.org/docs/latest/api/index.html 未來工作排程也能用 JavaScript 來寫了! Copyright © 2012 FITPI. All rights reserved.
  • 5. 5 Hello <Who>! (2) http://f2eclass.com/lab/nodejs/http.js 快速建立 Web 伺服器! var http = require("http"); http.createServer(function (req, res) {     res.setHeader("Content-Type", "text/html");     res.write("Hello World!");     res.end(); }).listen(8000); console.log("Server running at http://localhost:8000"); http://localhost:8000 http://nodejs.org/api/http.html#http_http Copyright © 2012 FITPI. All rights reserved.
  • 6. 6 Node.js 的地位 在 Yahoo! 的基礎技術架構是由 LAMP 構成的 LAMP Linux Apache MySQL PHP 作業系統 網頁伺服器 資料庫 後端程式語言 Node.js 扮演了兩種角色、且功能更強大! Copyright © 2012 FITPI. All rights reserved.
  • 7. 7 有什麼好處? ๏ 統一 Web 程式語言:前後端都寫 JS。 ❖ 將前端工程師從瀏覽器解放,後端一樣有能力開發! ❖ 可利用 JavaScript Event-driven 的特性。 ❖ 瀏覽器關閉 JavaScript 仍然可以跑 JavaScript @@ ๏ CommonJS 規範:比瀏覽器更有結構。 ๏ NPM 套件管理:非常容易安裝管理套件。 ๏ 活躍的社群。 ๏ 開發更為即時的網站應用程式。 Copyright © 2012 FITPI. All rights reserved.
  • 8. CommonJS 8 http://f2eclass.com/lab/nodejs/commonjs.js http://f2eclass.com/lab/nodejs/commonjs-module.js require 載入外部 JavaScript commonjs.js commonjs-module.js // 透過 require 將外部 JavaScript 載入 // 並不會是全域變數 var mod = require("./commonjs-module.js"); var foo = function () {     console.log("foo is invoked"); mod.bar(); }; // 所有要被外部存取的方法或屬性都需要用 exports exports.bar = function () {     console.log("bar is invoked"); }; > node commonjs.js 解決了全域變數與外部資源管理的問題 Copyright © 2012 FITPI. All rights reserved.
  • 9. NPM 套件管理 9 ๏ Node.js Package Management ๏ 朴灵:「一個解決方案比詢問問題還多的社群」 ๏ 用 Node.js 寫 Shell Script、部落格系統沒好處? ❖ 可用的資源太多了,將大大減少開發時間! Copyright © 2012 FITPI. All rights reserved.
  • 10. 10 使用 LiveReload 感受 npm 的強大與方便! ๏ 目錄檔案一但變動,網頁就會重新整理 ❖ 按 Ctrl + F5 手動重新整理很痛苦 ๏ 安裝 Node.js 版的 LiveReload 伺服器 > npm install -g simple-livereload ๏ 啟動 LiveReload 伺服器 > cd <工作目錄>; > simple-livereload <port> ๏ 安裝 LiveReload 的客戶端 Google 搜尋“Chrome LiveReload”就會找到 Copyright © 2012 FITPI. All rights reserved.
  • 11. 11 使用 LiveReload 檔案有修改 Chrome 的 LiveReload 設定 瀏覽器也會更新 監聽 案變動並回報 收到變動就重新載入 伺服器 瀏覽器 持續連線 <port> Copyright © 2012 FITPI. All rights reserved.
  • 12. 12 有什麼壞處? ๏ 太新了。還不夠穩定、API 也常在更新。 ๏ 網頁有任何修改都得重新執行 node.exe。 ๏ 會因為一個 JavaScript Error 就讓 Server 掛掉。 ๏ 靜態檔案處理不易,得存取 FileSystem API。 ๏ 有很多非同步的處理(Callback Pattern)。 Copyright © 2012 FITPI. All rights reserved.
  • 13. 一個錯誤就會掛掉 13 commonjs.js commonjs-module.js // 透過 require 將外部 JavaScript 載入 // 並不會是全域變數 var mod = require("./commonjs-module.js"); var foo = function () {     console.log("foo is invoked"); // foo(); // 未定義的函式! }; foo(); // 所有要被外部存取的方法或屬性都需要用 exports exports.bar = function () {     console.log("bar is invoked"); }; > node commonjs.js 碰到未定義的 foo 函式就會立刻掛掉 其他的程式語言頂多出錯、不會全部死掉 Copyright © 2012 FITPI. All rights reserved.
  • 14. 14 不適合靜態檔案的存取 http://f2eclass.com/lab/nodejs/html.js http://f2eclass.com/lab/nodejs/html.html html.js html.html var http = require("http"), <!DOCTYPE html>     fs = require("fs"); <html> <head> // 必須採用 fs.readFile 將 案讀入 <meta charset="utf-8"> <title>Node.js - 測試網頁</title> fs.readFile("./html.html", function (err, html) { <style type="text/css">     if (err) { div {         throw err;     background: red;     } } </style>     // 建立 Web 伺服器 </head> <body>     http.createServer(function (request, response) {     <div>         response.writeHeader(200, {         Hello! 這是 Node.js 的測試網頁。             "Content-Type": "text/html"         });     </div>         response.write(html); </body>         response.end(); </html>     }).listen(8000); }); > node html.js 一旦把 Web Server 跑起來,再怎麼改 html.html 都不會生效。一定要重啟才行。 Copyright © 2012 FITPI. All rights reserved.
  • 15. 15 解決方法 ๏ 別忘了這是個很活躍的社區,一個問題 至少有三個以上的解答 XD ❖ node-server https://github.com/cloudhead/node-static ❖ paperboy https://github.com/felixge/node-paperboy ❖ http-server https://github.com/nodeapps/http-server Copyright © 2012 FITPI. All rights reserved.
  • 16. 16 node 介紹小結 這是一個很新的「程式語言 + 伺服器」,問題是很 多的,但是由於活躍的社群、解答也出乎想像地 多。 若你採用此技術作為開發,會看到許多最新的概 念,但同時也必須不斷地去面對問題、逼迫自己不 斷 Study,是很有挑戰性的。 以 Node.js 的本身語言特性與先天優秀的架構,它 必定是未來幾年內最重要的程式語言之一,是很值 得花時間投資的。 Copyright © 2012 FITPI. All rights reserved.
  • 17. 17 Web 即時通訊 過去、現在、未來的幾種作法 最古老、不夠即時、干擾度很高的聊天室 到最近噗浪、臉書很即時且流暢的通知 他們各自是用什麼原理達成的呢? 這堂課讓你了解原理、引用現成工具 未來就可以輕鬆開發 Web 的即時訊息了! Copyright © 2012 FITPI. All rights reserved.
  • 18. 18 輪詢 Polling 馬上結束 把請求保留住 請求永遠保持 有資料再回傳 斷掉再發新的 前兩種都有可能漏訊息 http://www.slideshare.net/amix3k/comet-with-nodejs-and-v8 Copyright © 2012 FITPI. All rights reserved.
  • 19. 19 輪詢 Polling 不斷地向伺服器發送請求,詢問是否有新訊息 伺服器的負擔:請求數量過多 http://f2eclass.com/lab/node/polling.html Copyright © 2012 FITPI. All rights reserved.
  • 20. 20 長時間的 Polling 不斷地向伺服器發送請求,詢問是否有新訊息 伺服器的負擔:請求數量仍多、而且連線時間長 http://f2eclass.com/lab/node/long-polling.html Copyright © 2012 FITPI. All rights reserved.
  • 21. 21 Copyright © 2012 FITPI. All rights reserved.
  • 22. 22 Copyright © 2012 FITPI. All rights reserved.
  • 23. 23 關於輪詢 Long-polling 在傳統像是 Apache 的網站伺服器 是非常吃記憶體的,最好還是採用 nginx 或 node 兩種 Polling 都是單向的: 由 Browser 向 Server 詢問是否有新訊息 (pull) 而非有新訊息就由 Server 推向 Browser (push) Copyright © 2012 FITPI. All rights reserved.
  • 24. 24 Web Socket 建立雙向通道 有資料的時候才互相傳遞,效能最好的作法! http://f2eclass.com/lab/node/websocket.html Copyright © 2012 FITPI. All rights reserved.
  • 25. 25 即時通訊小結 WebSocket 是 HTML5 所帶來的新協定,瀏覽器 實作不一,所以沒辦法畢其功於一役。我們仍得針 對較差的瀏覽器採用 Long-polling、甚至採用過渡 時期的 Flash WebSocket。 要看瀏覽器支援度與是否安裝 Flash、實作 Long- polling, Flash WebSocket, WebSocket(前後端 都要改),這也太辛苦了吧! Copyright © 2012 FITPI. All rights reserved.
  • 26. 26 最佳解決方案! Socket.io 也是 Node.js 的一個套件 可以自行偵測瀏覽器環境、決定要採用何種方案 你的程式只要寫一份就可以啦 :D http://socket.io/ Copyright © 2012 FITPI. All rights reserved.
  • 27. 27 在不同瀏覽器執行 http://f2eclass.com/lab/node/socket-io.js 觀察看看瀏覽器是採用何種方法取得新訊息的。 Copyright © 2012 FITPI. All rights reserved.
  • 28. 28 YUI in Node.js YUI 與 Node.js 的完美結合 Write it once, use everywhere! 讓你寫的 YUI 在前後端都能夠執行! https://github.com/davglass/nodejs-yui3 http://www.youtube.com/watch?v=quMt0w7aK4s Copyright © 2012 FITPI. All rights reserved.
  • 29. 29 實作照片網站的通知 當有人上傳了一張新照片 其他正在線上的人都能收到通知 Copyright © 2012 FITPI. All rights reserved.
  • 30. 30 相關資源 ๏ 固定聚會:Node.js Taiwan Party http://nodejs.tw/ ๏ Node.js 台灣社群協作電子書 http://book.nodejs.tw/ ๏ CNode: Node.js 专业中文社區 http://cnodejs.org ๏ Node Packaged Modules https://npmjs.org/ Copyright © 2012 FITPI. All rights reserved.