SlideShare una empresa de Scribd logo
1 de 30
Descargar para leer sin conexión
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.

Más contenido relacionado

La actualidad más candente

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

La actualidad más candente (20)

Npm 套件管理 & 常用開發工具介紹
Npm 套件管理 & 常用開發工具介紹Npm 套件管理 & 常用開發工具介紹
Npm 套件管理 & 常用開發工具介紹
 
App house
App houseApp house
App house
 
Node.js 進攻桌面開發
Node.js 進攻桌面開發Node.js 進攻桌面開發
Node.js 進攻桌面開發
 
Gulp.js 自動化前端任務流程
Gulp.js 自動化前端任務流程Gulp.js 自動化前端任務流程
Gulp.js 自動化前端任務流程
 
使用 Visual Studio Code 建構 JavaScript 應用程式
使用 Visual Studio Code 建構 JavaScript 應用程式使用 Visual Studio Code 建構 JavaScript 應用程式
使用 Visual Studio Code 建構 JavaScript 應用程式
 
Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出
 
Non-MVC Web Framework
Non-MVC Web FrameworkNon-MVC Web Framework
Non-MVC Web Framework
 
第三方内容开发最佳实践
第三方内容开发最佳实践第三方内容开发最佳实践
第三方内容开发最佳实践
 
猴子也能懂的Node.js
猴子也能懂的Node.js猴子也能懂的Node.js
猴子也能懂的Node.js
 
SeaJS - 前端模块化开发探索与网站性能优化实践
SeaJS - 前端模块化开发探索与网站性能优化实践SeaJS - 前端模块化开发探索与网站性能优化实践
SeaJS - 前端模块化开发探索与网站性能优化实践
 
前端的未來 - 前端工程實務訓練
前端的未來 - 前端工程實務訓練前端的未來 - 前端工程實務訓練
前端的未來 - 前端工程實務訓練
 
Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)
 
Getting started with test automation
Getting started with test automationGetting started with test automation
Getting started with test automation
 
MakerBoard: MT7688 Emulator
MakerBoard: MT7688 EmulatorMakerBoard: MT7688 Emulator
MakerBoard: MT7688 Emulator
 
五行完成網頁多國語系
五行完成網頁多國語系五行完成網頁多國語系
五行完成網頁多國語系
 
不一樣的Web server... coServ
不一樣的Web server... coServ不一樣的Web server... coServ
不一樣的Web server... coServ
 
模块化和组件化Css
模块化和组件化Css模块化和组件化Css
模块化和组件化Css
 
使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統
 
webpack 入門
webpack 入門webpack 入門
webpack 入門
 
程式人雜誌 2015年五月
程式人雜誌 2015年五月程式人雜誌 2015年五月
程式人雜誌 2015年五月
 

Destacado

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

Destacado (20)

前端工程開發實務訓練
前端工程開發實務訓練前端工程開發實務訓練
前端工程開發實務訓練
 
阿盤的 Beamer 中英字型配方
阿盤的 Beamer 中英字型配方阿盤的 Beamer 中英字型配方
阿盤的 Beamer 中英字型配方
 
2016.3.22 從車庫的舊pc到百萬台伺服器
2016.3.22 從車庫的舊pc到百萬台伺服器2016.3.22 從車庫的舊pc到百萬台伺服器
2016.3.22 從車庫的舊pc到百萬台伺服器
 
浏览器工作原理浅析
浏览器工作原理浅析浏览器工作原理浅析
浏览器工作原理浅析
 
Learning React - I
Learning React - ILearning React - I
Learning React - I
 
Web of Things (wiring web objects with Node-RED)
Web of Things (wiring web objects with Node-RED)Web of Things (wiring web objects with Node-RED)
Web of Things (wiring web objects with Node-RED)
 
Bigger
BiggerBigger
Bigger
 
Bluemix Node-Red Part II
Bluemix Node-Red Part IIBluemix Node-Red Part II
Bluemix Node-Red Part II
 
01 Node-RED Basic
01 Node-RED Basic01 Node-RED Basic
01 Node-RED Basic
 
Bluemix node red-part iii
Bluemix node red-part iiiBluemix node red-part iii
Bluemix node red-part iii
 
Bluemix Node-Red Part I
Bluemix Node-Red Part IBluemix Node-Red Part I
Bluemix Node-Red Part I
 
暴走漫画数据挖掘从0到1
暴走漫画数据挖掘从0到1暴走漫画数据挖掘从0到1
暴走漫画数据挖掘从0到1
 
用十分鐘學會 《微積分、工程數學》及其應用
用十分鐘學會  《微積分、工程數學》及其應用用十分鐘學會  《微積分、工程數學》及其應用
用十分鐘學會 《微積分、工程數學》及其應用
 
我編譯故我在:誰說 Node.js 程式不能編成 binary
我編譯故我在:誰說 Node.js 程式不能編成 binary我編譯故我在:誰說 Node.js 程式不能編成 binary
我編譯故我在:誰說 Node.js 程式不能編成 binary
 
Using Node-RED for building IoT workflows
Using Node-RED for building IoT workflowsUsing Node-RED for building IoT workflows
Using Node-RED for building IoT workflows
 
教材摘要版 -Big data-海量資料的資料採礦方法-三星課程網陳景祥顧問-20130521
教材摘要版 -Big data-海量資料的資料採礦方法-三星課程網陳景祥顧問-20130521教材摘要版 -Big data-海量資料的資料採礦方法-三星課程網陳景祥顧問-20130521
教材摘要版 -Big data-海量資料的資料採礦方法-三星課程網陳景祥顧問-20130521
 
20161024 R語言資料分析實務 (3)
20161024 R語言資料分析實務 (3)20161024 R語言資料分析實務 (3)
20161024 R語言資料分析實務 (3)
 
機率統計 -- 使用 R 軟體
機率統計 -- 使用 R 軟體機率統計 -- 使用 R 軟體
機率統計 -- 使用 R 軟體
 
用十分鐘將你的網站送上雲端
用十分鐘將你的網站送上雲端用十分鐘將你的網站送上雲端
用十分鐘將你的網站送上雲端
 
20161003 R語言資料分析實務 (1)
20161003 R語言資料分析實務 (1)20161003 R語言資料分析實務 (1)
20161003 R語言資料分析實務 (1)
 

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

Node js实践
Node js实践Node js实践
Node js实践myzykj
 
Node getting-started
Node getting-startedNode getting-started
Node getting-startedlylijincheng
 
Class 20170126
Class 20170126Class 20170126
Class 20170126Ivan Wei
 
Javascript autoload
Javascript autoloadJavascript autoload
Javascript autoloadjay li
 
Node.js长连接开发实践
Node.js长连接开发实践Node.js长连接开发实践
Node.js长连接开发实践longhao
 
JavaScript Engine
JavaScript EngineJavaScript Engine
JavaScript Enginejay li
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swttka
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型Jackson Tian
 
打開窗,讓大象跨進來 - Microsoft HDInsight
打開窗,讓大象跨進來 - Microsoft HDInsight打開窗,讓大象跨進來 - Microsoft HDInsight
打開窗,讓大象跨進來 - Microsoft HDInsightKuo-Chun Su
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
Performance 入門 - 前端工程開發實務訓練
Performance 入門 - 前端工程開發實務訓練Performance 入門 - 前端工程開發實務訓練
Performance 入門 - 前端工程開發實務訓練Joseph Chiang
 
YUI 教學 - 前端工程開發實務訓練
YUI 教學 - 前端工程開發實務訓練YUI 教學 - 前端工程開發實務訓練
YUI 教學 - 前端工程開發實務訓練Joseph Chiang
 
Jetty服务器架构及调优.v2 2011-5
Jetty服务器架构及调优.v2 2011-5Jetty服务器架构及调优.v2 2011-5
Jetty服务器架构及调优.v2 2011-5lovingprince58
 
Erlang Practice
Erlang PracticeErlang Practice
Erlang Practicelitaocheng
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版Jackson Tian
 
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 ServletServlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 ServletJustin Lin
 
用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Servicesjavatwo2011
 
Nodejs部门分享
Nodejs部门分享Nodejs部门分享
Nodejs部门分享zffl
 

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

Node js实践
Node js实践Node js实践
Node js实践
 
Node getting-started
Node getting-startedNode getting-started
Node getting-started
 
Node分享 展烨
Node分享 展烨Node分享 展烨
Node分享 展烨
 
Class 20170126
Class 20170126Class 20170126
Class 20170126
 
Javascript autoload
Javascript autoloadJavascript autoload
Javascript autoload
 
Node.js长连接开发实践
Node.js长连接开发实践Node.js长连接开发实践
Node.js长连接开发实践
 
JavaScript Engine
JavaScript EngineJavaScript Engine
JavaScript Engine
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
 
打開窗,讓大象跨進來 - Microsoft HDInsight
打開窗,讓大象跨進來 - Microsoft HDInsight打開窗,讓大象跨進來 - Microsoft HDInsight
打開窗,讓大象跨進來 - Microsoft HDInsight
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
Performance 入門 - 前端工程開發實務訓練
Performance 入門 - 前端工程開發實務訓練Performance 入門 - 前端工程開發實務訓練
Performance 入門 - 前端工程開發實務訓練
 
YUI 教學 - 前端工程開發實務訓練
YUI 教學 - 前端工程開發實務訓練YUI 教學 - 前端工程開發實務訓練
YUI 教學 - 前端工程開發實務訓練
 
Jetty服务器架构及调优.v2 2011-5
Jetty服务器架构及调优.v2 2011-5Jetty服务器架构及调优.v2 2011-5
Jetty服务器架构及调优.v2 2011-5
 
Erlang Practice
Erlang PracticeErlang Practice
Erlang Practice
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 ServletServlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
 
Html5
Html5Html5
Html5
 
用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services
 
Nodejs部门分享
Nodejs部门分享Nodejs部门分享
Nodejs部门分享
 

Más de Joseph Chiang

不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会Joseph Chiang
 
Automatic Functional Testing with Selenium and SauceLabs
Automatic Functional Testing with Selenium and SauceLabsAutomatic Functional Testing with Selenium and SauceLabs
Automatic Functional Testing with Selenium and SauceLabsJoseph Chiang
 
From Hacker to Programmer (w/ Webpack, Babel and React)
From Hacker to Programmer (w/ Webpack, Babel and React)From Hacker to Programmer (w/ Webpack, Babel and React)
From Hacker to Programmer (w/ Webpack, Babel and React)Joseph Chiang
 
JavaScript Code Quality
JavaScript Code QualityJavaScript Code Quality
JavaScript Code QualityJoseph Chiang
 
Debugging - 前端工程開發實務訓練
 Debugging - 前端工程開發實務訓練 Debugging - 前端工程開發實務訓練
Debugging - 前端工程開發實務訓練Joseph Chiang
 
CSS 入門 - 前端工程開發實務訓練
CSS 入門 - 前端工程開發實務訓練CSS 入門 - 前端工程開發實務訓練
CSS 入門 - 前端工程開發實務訓練Joseph Chiang
 
HTML 入門 - 前端工程開發實務訓練
HTML 入門 - 前端工程開發實務訓練HTML 入門 - 前端工程開發實務訓練
HTML 入門 - 前端工程開發實務訓練Joseph Chiang
 
模块加载策略 - 2012 SDCC, 北京
模块加载策略 - 2012 SDCC, 北京模块加载策略 - 2012 SDCC, 北京
模块加载策略 - 2012 SDCC, 北京Joseph Chiang
 
YUI is Sexy (for JSDC.tw)
YUI is Sexy (for JSDC.tw)YUI is Sexy (for JSDC.tw)
YUI is Sexy (for JSDC.tw)Joseph Chiang
 
YUI is Sexy - 使用 YUI 作為開發基礎
YUI is Sexy - 使用 YUI 作為開發基礎YUI is Sexy - 使用 YUI 作為開發基礎
YUI is Sexy - 使用 YUI 作為開發基礎Joseph Chiang
 
Git - The Social Coding System
Git - The Social Coding SystemGit - The Social Coding System
Git - The Social Coding SystemJoseph Chiang
 
分享無名小站 API
分享無名小站 API分享無名小站 API
分享無名小站 APIJoseph Chiang
 
yui3 is Sexy - 使用 YUI 3 的 Sexy Part !
yui3 is Sexy - 使用 YUI 3 的 Sexy Part !yui3 is Sexy - 使用 YUI 3 的 Sexy Part !
yui3 is Sexy - 使用 YUI 3 的 Sexy Part !Joseph Chiang
 
建立前端開發團隊 - 2011 中華電信訓練所版
建立前端開發團隊 - 2011 中華電信訓練所版建立前端開發團隊 - 2011 中華電信訓練所版
建立前端開發團隊 - 2011 中華電信訓練所版Joseph Chiang
 
不用不可之 Fiddler Debugging Proxy!
不用不可之 Fiddler Debugging Proxy!不用不可之 Fiddler Debugging Proxy!
不用不可之 Fiddler Debugging Proxy!Joseph Chiang
 

Más de Joseph Chiang (20)

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

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.