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

An Introduction to Node.js

Avatar for Tommy Chen Tommy Chen
October 23, 2014

An Introduction to Node.js

Avatar for Tommy Chen

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