Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

⾮非 阻 塞 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 ( ⾮非 同 步 ) 執 ⾏行 執 ⾏行

Slide 6

Slide 6 text

安 裝 5

Slide 7

Slide 7 text

n o d e j s . o rg 6

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

基 礎 8

Slide 10

Slide 10 text

N O D E • 互動介⾯面 • 執⾏行 JavaScript 檔案 $ node > 1 + 2 3 $ node hello.js Hello world! 9

Slide 11

Slide 11 text

變 數 • 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

Slide 12

Slide 12 text

函 數 • 普通函數 function hello(name){ console.log('Hello %s!', name); } var hello = function(name){ console.log('Hello %s!', name); }; • 函數也是⼀一種資料型態 • 匿名函數 11

Slide 13

Slide 13 text

物 件 導 向 • 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

Slide 14

Slide 14 text

繼 承 • 有很多⽅方法可以達到繼承,在 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

Slide 15

Slide 15 text

模 組 • 原本的 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

Slide 16

Slide 16 text

套 件 • 套件必須內含⼀一個 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" } }

Slide 17

Slide 17 text

N P M • Node Package Manager • 套件將會被安裝⾄至 node_modules 資料夾 • 加上 -g 選項:安裝到 global # 安裝套件 npm install lodash # 移除套件 npm uninstall lodash # 更新套件 npm update # 列出所有已安裝的套件 npm list 16

Slide 18

Slide 18 text

n p m j s . o rg 17

Slide 19

Slide 19 text

A P I 18

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

參 數 • 從 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'

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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);

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

檔 案 複 製 • 利⽤用 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

Slide 27

Slide 27 text

伺 服 器 • 使⽤用 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

Slide 28

Slide 28 text

n o d e j s . o rg / a p i 27

Slide 29

Slide 29 text

T H A N K S 28