Upgrade to Pro — share decks privately, control downloads, hide ads and more …

An Introduction to Node.js

Tommy Chen
October 23, 2014

An Introduction to Node.js

Tommy Chen

October 23, 2014
Tweet

More Decks by Tommy Chen

Other Decks in Programming

Transcript

  1. A N I N T R O D U C

    T I O N T O 陳 嘉 輝 @ t o m m y 3 5 1 1
  2. W H AT I S N O D E .

    J S ? J AVA S C R I P T 瀏 覽 器 2
  3. W H AT I S N O D E .

    J S ? J AVA S C R I P T 伺 服 器 2
  4. W H Y N O D E . J S

    ? • ⼊入⾨門簡單 • It’s JavaScript! • ⾼高效能 • ⾮非阻塞 I/O(Non-blocking I/O) • 事件驅動(Event-driven) • 豐富的⾮非官⽅方套件 • npm 是⺫⽬目前最活躍的套件網站 3
  5. ⾮非 阻 塞 I / O 4 請 求 #

    1 資 料 庫 I / O 回 應 # 1 請 求 # 2 檔 案 I / O 回 應 # 2 阻 塞 傳 統 ( 同 步 ) 請 求 # 1 回 應 # 1 請 求 # 2 檔 案 I / O 回 應 # 2 資 料 庫 I / O 回 傳 回 傳 N O D E . J S ( ⾮非 同 步 ) 執 ⾏行 執 ⾏行
  6. N V M • Node Version Manager • ⽅方便切換 Node.js

    版本 • ⺫⽬目前暫不⽀支援 Windows # 安裝 NVM curl https://raw.github.com/creationix/nvm/master/install.sh | sh # 安裝 Node.js nvm install 0.10 # 指定 Node.js 版本 nvm use 0.10 7
  7. N O D E • 互動介⾯面 • 執⾏行 JavaScript 檔案

    $ node > 1 + 2 3 $ node hello.js Hello world! 9
  8. 變 數 • JavaScript 是動態語⾔言,建⽴立變數時無需指定型別 • 使⽤用 var 建⽴立變數 var

    str = 'hello'; // 字串(String) var num = 3.14; // 數字(Number) var bool = true; // 布林值(Boolean) var arr = [1, '2', true]; // 陣列(Array) var obj = {hello: 'world'}; // 物件(Object) 10
  9. 函 數 • 普通函數 function hello(name){ console.log('Hello %s!', name); }

    var hello = function(name){ console.log('Hello %s!', name); }; • 函數也是⼀一種資料型態 • 匿名函數 11
  10. 物 件 導 向 • JavaScript 使⽤用 Prototype 實作物件導向,和常⾒見的 Class

    有些差異 • 所有⽅方法都是 public 的,沒有 private 和 protected 屬性 function Person(name){ this.name = name; }; Person.prototype.say = function(){ console.log('My name is ' + this.name); }; var jack = new Person('Jack'); jack.say(); // My name is Jack 12
  11. 繼 承 • 有很多⽅方法可以達到繼承,在 Node.js 中我們使⽤用內建的 util.inherits var util =

    require('util'); function Girl(name){ Person.call(this, name); // super(name) } util.inherits(Girl, Person); Girl.prototype.sleep = function(){ console.log(this.name + ' is sleeping...'); }; var jane = new Girl('Jane'); jane.say(); // My name is Jane jane.sleep(); // Jane is sleeping... 13
  12. 模 組 • 原本的 JavaScript 並沒有模組功能,Node.js 實作了 CommonJS 解決了此⼀一問題 •

    使⽤用 require 函數輸⼊入模組 var fs = require(‘fs'); // 輸⼊入外部、系統內建模組 var core = require(‘./core'); // 輸⼊入內部模組 • 使⽤用 module.exports 輸出模組 • exports.name 是 module.exports.name 的捷徑 module.exports = {name: 'foo'}; exports.name = 'foo'; 14
  13. 套 件 • 套件必須內含⼀一個 package.json 檔案,⽤用於敘述該套件的屬性及相依套件 • 可使⽤用 npm init

    ⾃自動建⽴立 package.json 檔案 15 { "name": "my-package", "version": "0.0.1", "description": "This is my package", "main": "index", "dependencies": { "lodash": "2.4.1" } }
  14. N P M • Node Package Manager • 套件將會被安裝⾄至 node_modules

    資料夾 • 加上 -g 選項:安裝到 global # 安裝套件 npm install lodash # 移除套件 npm uninstall lodash # 更新套件 npm update # 列出所有已安裝的套件 npm list 16
  15. C O N S O L E • 在終端機印出⽂文字 •

    ⽀支援類似 printf() 的⽂文字格式化 • %s - 字串 • %d - 數字 • %j - JSON 19 console.log('Hello world'); // Hello world console.log('%s is %d years old', 'Andy', 9); // Andy is 9 years old
  16. 參 數 • 從 process.argv 讀取參數 20 var args =

    process.argv; for (var i = 0, len = args.length; i < len; i++){ console.log(i, args[i]); } $ node args.js one two=three four 0 'node' 1 '/Users/SkyArrow/Desktop/keynote/args.js' 2 'one' 3 'two=three' 4 'four'
  17. F S • 檔案讀寫 • 函數區分為⾮非同步(Async)與同步(Sync),建議使⽤用⾮非同步模式 var fs = require('fs');

    // ⾮非同步(Async) fs.readFile('test.txt', 'utf8', function(err, content){ if (err) throw err; console.log(content); }); // 同步(Sync) var content = fs.readFileSync('test.txt', 'utf8'); console.log(content); 21
  18. F S // 讀取檔案 fs.readFile('test.txt', 'utf8', function(err, result){}); // 寫⼊入檔案

    fs.writeFile('test.txt', 'hello world', function(err){}); // 刪除檔案 fs.unlink('test.txt', function(err){}); // 檢查檔案是否存在 fs.exists('test.txt', function(exist){}); // 建⽴立資料夾 fs.mkdir('folder', function(err){}); // 讀取資料夾內容 fs.readdir('folder', function(err, files){}); // 刪除資料夾 fs.rmdir('folder', function(err){}); // 重新命名檔案 fs.rename('test.txt', 'new.txt', function(err){}); 22
  19. H T T P • Node.js 內建 http 模組,能幫助我們建⽴立⼀一個簡單的網⾴頁伺服器 23

    var http = require('http'); http.createServer(function(req, res){ res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World'); }).listen(4000);
  20. S T R E A M • Readable Stream:可讀取的 Stream

    24 D U P L E X R E A D A B L E W R I TA B L E • Duplex Stream:可讀取也可寫⼊入的 Stream • Writable Stream:可寫⼊入的 Stream
  21. 檔 案 複 製 • 利⽤用 Stream 複製檔案 25 var

    fs = require('fs'); var src = fs.createReadStream('a.txt'); var dest = fs.createWriteStream('b.txt'); src.pipe(dest); W R I TA B L E R E A D A B L E fs.createReadStream(‘a.txt’) fs.createWriteStream(‘b.txt’) → P I P E → src dest
  22. 伺 服 器 • 使⽤用 Stream 輸出檔案內容到網⾴頁上 26 var http

    = require('http'); var fs = require('fs'); http.createServer(function(req, res){ var stream = fs.createReadStream('a.txt'); stream.pipe(res); }).listen(4000); W R I TA B L E R E A D A B L E fs.createReadStream(‘a.txt’) HTTP response → P I P E → stream res