Всеволод Струкчинский: node.js

210
@ floatdrop bit.ly/nodejsshri

Upload: yandex

Post on 20-Jan-2015

8.995 views

Category:

Documents


6 download

DESCRIPTION

 

TRANSCRIPT

  • 1. @floatdrop bit.ly/nodejs-shri

2. Node.JS 3. History bit.ly/crcfd 4. 1987 5. 1 2 on mouseUp 3 get the selection 4 if it is empty then as "Dial what number?" 5 if it is not empty then 6 push this card 7 visual effect zoom open 8 go to stack "Phone" 9 dial it 10 pop card 11 end if 12 end mouseUp 131987 6. 1995 7. 1995 8. 1995 9. 10 1995 10. 10 Function as first-class objects1995 11. 10 Function as first-class objects Self1995 12. 2005 13. 2005 14. AJAX 2005 15. 2009 16. Node.JS JavaScript on server2009 17. Apache + PHP = 18. Apache + PHP = 19. index.php 1 2 3 4 5 6 7 8 9$result = mysqli_query( $con, "SELECT * FROM Persons"); while($row = mysqli_fetch_array($result)) { echo $row['Name']."n"; } file_put_contents("access.log", "Request done") 20. Single-thread serverPictures from node-explained 21. Single-thread serverPictures from node-explained 22. Single-thread serverPictures from node-explained 23. Single-thread serverPictures from node-explained 24. Single-thread serverPictures from node-explained 25. Multi-thread server 26. 27. Ryan Dahl 28. Ryan DahlI/O has to be done differently. We are doing it wrong 29. Ryan DahlI/O has to be done differently. We are doing it wrongbit.ly/jsconf-node 30. event-loop 31. event-loop 32. event-loop 33. event-loop 34. event-loop 35. event-loop 36. event-loop 37. event-loop server 38. bit.ly/bombanulo 39. event-loop server goes wrong 40. JavaScript is slowbit.ly/bombanulo-2 41. "Simple" benchmarkbit.ly/dumb-test 42. Installingnodejs.org/download 43. Running 44. Running 45. Running 46. Running 47. windows 48. window 49. document 50. document 51. global 52. global 53. global 54. process 55. process 56. process 57. Modules require('antigravity') 58. module.js 1 2 3 4 5function HelloWorld () { console.log('Hello world'); } console.log('Module loaded'); 59. index.js 1require('./module'); 60. index.js 1 2 3require('./module'); HelloWorld(); 61. module.js 1 2 3 4 5 6 7function HelloWorld () { console.log('Hello world'); } console.log('Module loaded'); exports.HelloWorld = HelloWorld; 62. index.js 1 2 3var module = require('./module'); module.HelloWorld(); 63. module.js 1 2 3 4 5 6 7function HelloWorld () { console.log('Hello world'); } console.log('Module loaded'); global.HelloWorld = HelloWorld; 64. index.js 1 2 3require('./module'); HelloWorld(); 65. exports vs module.exports 66. exports vs module.exports russian.js 1 2 3 4 5 6var en_translation = { yes: '', no: '' }; exports = en_translation; 67. exports vs module.exports russian.js 1 2 3 4 5 6var en_translation = { yes: '', no: '' }; module.exports = en_translation; 68. exports vs module.exports russian.json { "yes": "", "no": "" } 69. requrie('./directory') 70. requrie('./directory') 3. require('./directory/index.json') 71. requrie('./directory') 3. require('./directory/index.json') 2. require('./directory/index.js') 72. requrie('./directory') 3. require('./directory/index.json') 2. require('./directory/index.js') 1. require('./directory/' + require('./directory/package.json').main); 73. require('http') require('express') require('./index.js') require('./config.json') require('./module') // Directory 74. Simple web-server 75. Simple web-server 76. Simple web-server 77. Simple web-server 78. Simple web-server 79. Simple web-server index.js 1 2 3 4 5 6 7 8 9var http = require('http'); function helloService(request, response) { response.end("Hello, stranger!"); } var server = http.createServer(helloService); module.exports = server; 80. Run, Forest, Run! 81. Run, Forest, Run! 82. Run, Forest, Run! 83. Run, Forest, Run! 84. Simple web-server node_modules 85. Run, Forest, Run! 86. Run, Forest, Run! 87. Run, Forest, Run! 88. Run, Forest, Run! 89. require("antigravity") in /home/user/programm/library/index.js 90. require("antigravity") in /home/user/programm/library/index.js 1. /home/user/programm/library/node_modules/antigravity 91. require("antigravity") in /home/user/programm/library/index.js 1. /home/user/programm/library/node_modules/antigravity 2. /home/user/programm/node_modules/antigravity 92. require("antigravity") in /home/user/programm/library/index.js 1. /home/user/programm/library/node_modules/antigravity 2. /home/user/programm/node_modules/antigravity 3. /home/user/node_modules/antigravity 93. require("antigravity") in /home/user/programm/library/index.js 1. /home/user/programm/library/node_modules/antigravity 2. /home/user/programm/node_modules/antigravity 3. /home/user/node_modules/antigravity 4. /home/node_modules/antigravity 94. require("antigravity") in /home/user/programm/library/index.js 1. /home/user/programm/library/node_modules/antigravity 2. /home/user/programm/node_modules/antigravity 3. /home/user/node_modules/antigravity 4. /home/node_modules/antigravity 5. /node_modules/antigravity 95. require("antigravity") in /home/user/programm/library/index.js 1. /home/user/programm/library/node_modules/antigravity 2. /home/user/programm/node_modules/antigravity 3. /home/user/node_modules/antigravity 4. /home/node_modules/antigravity 5. /node_modules/antigravity NODE_PATH 96. require("antigravity") in /home/user/programm/library/index.js 1. /home/user/programm/library/node_modules/antigravity 2. /home/user/programm/node_modules/antigravity 3. /home/user/node_modules/antigravity 4. /home/node_modules/antigravity 5. /node_modules/antigravity NODE_PATH $HOME/.node_modules, $HOME/.node_libraries, $PREFIX/lib/node 97. node_modules/antigravity.js 1module.exports = new Date();index.js 1console.log(require("antigravity")); 98. node_modules/antigravity.js 1 2 3console.log(module); module.exports = new Date(); 99. Circular dependencies 100. Circular dependencies a.js 1 2var b = require('./b.js'); console.log("B: ", b);b.js 1 2var a = require('./a.js'); console.log("A: ", a); 101. Circular dependencies a.js 1 2 3 4module.exports.hello = "Hello from A"; var b = require('./b.js'); module.exports.helloFromB = b.hello; console.log("B: ", b);b.js 1 2 3 4module.exports.hello = "Hello from B"; var a = require('./a.js'); module.exports.helloFromA = a.hello; console.log("A: ", a); 102. modulecounts.com 103. Installing module 104. Installing module 105. Installing module 106. Installing module 107. Installing module 108. Nested dependencies pros / cons 109. Nested dependencies pros / cons + Version independent 110. Nested dependencies pros / cons + Version independent - Wieght more 111. package.json {}"name": "express", "version": "3.4.4", "dependencies": { "connect": "2.11.0", "commander": "1.3.2", "range-parser }, "devDependencies": { "ejs": "*", "mocha": "*", "jade": "0.30.0", "hjs": "*", " }, "main": "index", "bin": { "express": "./bin/express" }, "scripts": { "prepublish": "npm prune", "test": "make test" }, "engines": { "node": "*" } 112. Express application var express = require('express'); var app = express(); app.get('/', function(req, res) { res.end('Hello!'); }); app.listen(3000); 113. Event loop 114. bit.ly/kantor-node 115. joyent/node - node.cc 116. joyent/node - env-inl.h 117. joyent/node - env-inl.h 118. joyent/libuv - loop.c 119. joyent/libuv - loop.c 1 static int uv__loop_init(uv_loop_t* loop, int default_loop) { 2 // ... 3 RB_INIT(&loop->timer_handles); 4 QUEUE_INIT(&loop->wq); 5 QUEUE_INIT(&loop->active_reqs); 6 QUEUE_INIT(&loop->idle_handles); 7 QUEUE_INIT(&loop->async_handles); 8 QUEUE_INIT(&loop->check_handles); 9 QUEUE_INIT(&loop->prepare_handles); 10 QUEUE_INIT(&loop->handle_queue); 11 QUEUE_INIT(&loop->pending_queue); 12 QUEUE_INIT(&loop->watcher_queue); 13 14 err = uv__platform_loop_init(loop, default_loop); 15 // ... 16 } 120. uv__platform_loop_init kqueue epoll 121. joyent/node - node.cc 122. joyent/node - core.c : 2581 int uv_run(uv_loop_t* loop, uv_run_mode mode) { 2 r = uv__loop_alive(loop); 3 while (r != 0 && loop->stop_flag == 0) { 4 // ... 5 uv__update_time(loop); 6 uv__run_timers(loop); 7 uv__io_poll(loop, timeout); 8 // ... 9 } 10 } 1 2 3 4 5static int uv__loop_alive(uv_loop_t* loop) { return uv__has_active_handles(loop) || uv__has_active_reqs(loop) || loop->closing_handles != NULL; } 123. Fibonacci 1 2 3 4 5 6 7 8 9 10function fibonacci(n) { if (n < 2) return 1; else return fibonacci(n-2) + fibonacci(n-1); } require('http').createServer(function (req, res) { res.end("40: " + fibonacci(40)); }).listen(8005); 124. Fibonacci Requests per second: 0.61 Time per request: 1634.748 ms (vs 5676 ms) 125. setTimeout, setImmediate, process.nextTick 126. 1. process.nextTick 127. 1. process.nextTick* 2. Input / Output 128. 1. process.nextTick* 2. Input / Output 3. setImmediate 129. 1. process.nextTick* 2. Input / Output 3. setImmediate 4. setTimeout 130. Fibonacci 1 2 3 4 5 6 7 8 9 10 11 12function fibonacci(i, n, f1, f2, res) { if (i >= n) res.end(n + ": " + (f1 + f2)); else setImmediate(function() { fibonacci(i + 1, n, f2, f1 + f2, res); }); } require('http').createServer(function (req, res) { fibonacci(0, 1473, 1, 1, res); }).listen(8005); 131. Fibonacci Requests per second: 264.55 Time per request: 3.780 ms 132. Streams bit.ly/streams-node 133. Streams 0.10.x bit.ly/streams-node 134. 1$ cut -f 1 | uniq -c | sort -n 135. Streams in Node.JS 136. Streams in Node.JS 1. fs - createReadStream, createWriteStream 137. Streams in Node.JS 1. fs - createReadStream, createWriteStream 2. process - stdin, stderr and stdout 138. Streams in Node.JS 1. fs - createReadStream, createWriteStream 2. process - stdin, stderr and stdout 3. http - client requests, server response 139. Streams in Node.JS 1. fs - createReadStream, createWriteStream 2. process - stdin, stderr and stdout 3. http - client requests, server response 4. tcp - sockets 140. Streams in Node.JS 1. fs - createReadStream, createWriteStream 2. process - stdin, stderr and stdout 3. http - client requests, server response 4. tcp - sockets 5. zlib - createUnzip... 141. Streams in Node.JS 1. fs - createReadStream, createWriteStream 2. process - stdin, stderr and stdout 3. http - client requests, server response 4. tcp - sockets 5. zlib - createUnzip... 6. crypto - createCipher 142. Crypto service 1var app = require('express')(); 143. Crypto service 1var app = require('express')();1 2 3 4app.post('/:algo/:secret', function(req, res) { // Some magic should be applied here res.end(req.params.algo + " " + req.params.secret); }); 144. Crypto service 1var app = require('express')();1 2 3 4app.post('/:algo/:secret', function(req, res) { // Some magic should be applied here res.end(req.params.algo + " " + req.params.secret); });1app.listen(31337); 145. Crypto stdin 1 2 3 4 5 6var cipher = require('crypto') .createCipher('aes192', 'secret'); process.stdin.pipe(cipher).pipe(process.stdout); 146. Crypto service 1var app = require('express')();1 2 3 4 5app.get('/:algo/:secret', function(req, res) { var cipher = require('crypto') .createCipher(req.params.algo, req.params.secret); req.pipe(cipher).pipe(res); });1app.listen(31337); 147. Push vs Pull streams 148. Pull streams 149. Push streams 150. Streams in Node.JS are Push 151. ReadableStream. Events: data, end, close, error, readable 152. ReadableStream data event 1 2 3 4process.stdin.on('data', function(chunk) { console.log(chunk); }); 153. WriteableStream. Events finish, pipe, unpipe, drain 154. WriteableStream. Methods write method 1var backpressure = process.stdout.write('data'); 155. Writeable stream backpressure 1var backpressure = process.stdout.write('data'); 156. Writeable stream backpressure 1var backpressure = process.stdout.write('data');This return value is strictly advisory. You MAY continue to write, even if it returns false. However, writes will be buffered in memory, so it is best not to do this excessively. Instead, wait for the drain event before writing more data.