Slide 1

Slide 1 text

Node.js v4 @yosuke_furukawa

Slide 2

Slide 2 text

@yosuke_furukawa

Slide 3

Slide 3 text

Tokyo NodeFest 2012

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

I asked him …

Slide 6

Slide 6 text

%PZPVIBWFBQMBOUPSFMFBTF W /FYUZFBS NBZCF

Slide 7

Slide 7 text

Tokyo NodeFest 2012

Slide 8

Slide 8 text

Slide 9

Slide 9 text

Congrats!!!!

Slide 10

Slide 10 text

Node.js v4.x features

Slide 11

Slide 11 text

Lots of features………….

Slide 12

Slide 12 text

JavaScript Syntax/Features

Slide 13

Slide 13 text

ES2015

Slide 14

Slide 14 text

ES2015 • let/const • class • Map/Set/WeakMap/ WeakSet • Generators • Binary/Octal literals • Symbol • Template String literals • String.prototype.repeat • @@toStringTag • Enhanced Object Literals • unicode literals • arrow functions

Slide 15

Slide 15 text

Your code will be changed in Node.js

Slide 16

Slide 16 text

MyEventEmitter // v0.12 ‘use strict’; var events = require(‘events’); var util = require(‘util’); var EventEmitter = events.EventEmitter; var MyEventEmitter = function(data) { this.data = data; }; util.inherits(MyEventEmitter, EventEmitter); MyEventEmitter.prototype.intervalCheck = function() { var originalData = this.data; var _this = this; setInterval(function (){ if (originalData !== _this.data) { _this.emit(‘change’, new Date() + ‘: ’ + _this.data); originalData = _this.data; } }, 1000); }; module.exports = MyEventEmitter; DIFDLPXOPCKFDUQFSTFD

Slide 17

Slide 17 text

MyEventEmitter // v4.0 ‘use strict’; const events = require(‘events’); const EventEmitter = events.EventEmitter; class MyEventEmitter extends EventEmitter { constructor(data) { this.data = data; } intervalCheck() { let originalData = this.data; setInterval(()=>{ if (originalData !== this.data) { this.emit(‘change’, `${new Date()}: ${this.data}`); originalData = this.data; } }, 1000); } } module.exports = MyEventEmitter;

Slide 18

Slide 18 text

MyEventEmitter // After v4.0 ‘use strict’; const events = require(‘events’); const EventEmitter = events.EventEmitter; class MyEventEmitter extends EventEmitter { constructor(data) { this.data = data; } intervalCheck() { let originalData = this.data; setInterval(()=>{ if (originalData !== this.data) { this.emit(‘change’, `${new Date()}: ${this.data}`); originalData = this.data; } }, 1000); } } module.exports = MyEventEmitter; SFRVJSF͔Β͸DPOTUͰఆٛ͢Δ ෆมͳ෺ͱͯ͠มߋ͞Εͳ͍Α͏ʹ͢Δ VUJMJOIFSJUTͷ୅ΘΓʹDMBTT FYUFOETΛ࢖͏ BSSPXؔ਺Λ࢖͏ UFNQMBUFTUSJOHMJUFSBMͰจࣈྻ ݁߹Λॻ͘

Slide 19

Slide 19 text

MyEventEmitter // v0.12 ‘use strict’; var events = require(‘events’); var util = require(‘util’); var EventEmitter = events.EventEmitter; var MyEventEmitter = function(data) { this.data = data; }; util.inherits(MyEventEmitter, EventEmitter); MyEventEmitter.prototype.intervalCheck = function() { var originalData = this.data; var _this = this; setInterval(function (){ if (originalData !== _this.data) { _this.emit(‘change’, new Date() + ‘: ’ + _this.data); originalData = _this.data; } }, 1000); }; module.exports = MyEventEmitter; // v4.0 ‘use strict’; const events = require(‘events’); const EventEmitter = events.EventEmitter; class MyEventEmitter extends EventEmitter { constructor(data) { this.data = data; } intervalCheck() { let originalData = this.data; setInterval(()=>{ if (originalData !== this.data) { this.emit(‘change’, `${new Date()}: ${this.data}`); originalData = this.data; } }, 1000); } } module.exports = MyEventEmitter; #FGPSF "GUFS ͖ͬ͢Γॻ͚ΔΑ͏ʹͳͬͨɻ

Slide 20

Slide 20 text

·ͩ • default params • rest/spread (ଟ෼v5.0Ͱenable) • tail call opts • Proxy • Reflect • modules ((ƅ㱼ƅ)ŋ㲎. ŞƄŰŕ!!)

Slide 21

Slide 21 text

Strong Script

Slide 22

Slide 22 text

Strong Script • ES6 ͷίʔυΛڧ੍ͤ͞Δ࢓૊Έ • “use strong” σΟϨΫςΟϒΛॻ͘ • node —strong_mode hoge.js Ͱىಈ • var Λ let/constʹม͑ͨΓɺdeleteެจΛ࢖͏ͱౖΒΕͨ Γ͢Δɻ • experimental feature

Slide 23

Slide 23 text

“use strong” “use strong”; function foo() { // v8 4.2 enabled (io.js v2.0 also) var obj1 = ‘aaa’; // Restrict var (use let or const instead) let args = arguments; // Restrict arguments (use Rest Params …args) if (obj1 == ‘aaa’) {} // Restrict == (use strict equal ===) if (obj1 === ‘aaa’); // Restrict empty if and for for (let n in [1,2,3]) // Restrict for-in (use for-of instead) delete obj1.key // Restrict delete operator (use Map/Set instead) // v8 4.5 enabled TODO: try let undefined = ‘aaa’; // Restrict undefined binding let obj3 = { foo : ‘aaa’}; obj3.bar = ‘123’; // Restrict undefined property access }

Slide 24

Slide 24 text

DEMO

Slide 25

Slide 25 text

ৄ͘͠͸

Slide 26

Slide 26 text

ESIntl

Slide 27

Slide 27 text

ESIntl • ECMAScript ࠃࡍԽAPI • ECMA-402 / ௨শ ESIntl • node͸buildͷ࣌ʹ’--with-intl=full-icu — download-all’Λࢦఆ͢Δͱ৽͘͠built-inΦ ϒδΣΫτͷIntlΦϒδΣΫτ͕༗ޮʹͳΔɻ

Slide 28

Slide 28 text

ESIntl

Slide 29

Slide 29 text

ESIntl 4USJOH OVN SFQMBDF aE aEaEaE aE H

Slide 30

Slide 30 text

DEMO

Slide 31

Slide 31 text

JavaScript Syntax/Features • ES2015ڧԽ • Strong Script͕࣮ݧతʹೖͬͯΔ • ࠃࡍԽAPI͕buildΦϓγϣϯࢦఆͰೖΕΒΕ ΔΑ͏ʹͳͬͨɻ

Slide 32

Slide 32 text

API

Slide 33

Slide 33 text

Buffer

Slide 34

Slide 34 text

Buffer • Buffer#indexOfϝιου͕௥Ճ • BufferͷϦϑΝΫλϦϯά͕ਐΈɺ ArrayBufferͰॻ͖௚͞ΕΔɻ • Bufferͷ܁Γฦ͠ʹfor/ofจ͕࢖͑ΔΑ͏ʹ ͳΔɻ

Slide 35

Slide 35 text

Bufferࠓੲ෺ޠ • ͦ΋ͦ΋Buffer ͸v0.1.90Ͱ࣮૷͞Εͨ • ͦͷ౰࣌͸ArrayBuffer͸ଘࡏ͠ͳ͔ͬͨ • ్த͔ΒArrayBuffer͕࢓༷Խ͞Ε࣮ͯ૷͞ΕͨͨΊࣅͨΑ͏ ͳػೳΛ࣋ͭAPI͕Ͱ͖ͯ͠·ͬͨɻ • v4.0ͷλΠϛϯάͰv8͔ΒϝϞϦΛ௚઀Ξϩέʔτ͢Δؔ਺ ͕deprecatedͱͳΓɺBufferΫϥε͸ArrayBufferΫϥεΛҾ ͖ܧ͙ܗͰ࣮૷͞Εͨɻ

Slide 36

Slide 36 text

Buffer#indexOfϝιουͷ௥Ճ จࣈྻԽ͔ͯ͠ΒJOEFY0G͢ΔΑΓ΋ང͔ʹޮ཰͕ྑ͍ɻ

Slide 37

Slide 37 text

Buffer instanceOf ArrayBuffer "SSBZ#V⒎FSΫϥεͷΠϯελϯεΛͦͷ··౉ͤΔ

Slide 38

Slide 38 text

Buffer for/of var buf = new Buffer([1, 2, 3]); for (var b of buf) console.log(b) // 1 // 2 // 3 #V⒎FS͕JUFSBUPSʹʂʂʂ

Slide 39

Slide 39 text

DEMO

Slide 40

Slide 40 text

Stream

Slide 41

Slide 41 text

Stream • Simple Stream Constructor͕Ͱ͖ͨ • StreamΛ࡞Δͷʹthrough2ͱ͔Λ࢖͏ඞཁ ͕ͳ͘ͳͬͨ

Slide 42

Slide 42 text

Simple Stream Constructor // v0.12 var Transform = require('stream').Transform; var util = require('util'); util.inherits(MyTransform, Transform); function MyTransform(opts){ Transform.call(this, opts); } MyTransform.prototype._transform = function(chunk, encoding, callback){ // ͜͜Ͱ ม׵ͯ͠ ... // push͢Δ this.push(chunk); }; MyTransform.prototype._flush = function(done){ // ࠷ޙʹԿ͔͚ͨ͠Ε͹͜͜Ͱ flush ͢Δ };

Slide 43

Slide 43 text

Simple Stream Constructor // v4.0 var transform = new stream.Transform({ transform: function(chunk, encoding, next) { // ͜͜Ͱ ม׵ͯ͠ ... // push͢Δ this.push(chunk); }, flush: function(done) { // ࠷ޙʹԿ͔͚ͨ͠Ε͹͜͜Ͱ flush ͢Δ } }); ؆୯ʂUISPVHIͱಉ͡ॻ͖ํʂʂ

Slide 44

Slide 44 text

REPL

Slide 45

Slide 45 text

REPL • historyΛηʔϒͯ͘͠ΕΔΑ͏ʹͳͬͨ • ී௨͚ͩͲɺΊͬͪΌخ͍͠

Slide 46

Slide 46 text

DEMO

Slide 47

Slide 47 text

OS

Slide 48

Slide 48 text

OS • os.homeDir()͕௥Ճ • ࠓ·ͰhomeσΟϨΫτϦऔΕͳ͔͚ͬͨͲ औΕΔΑ͏ʹͳͬͨ

Slide 49

Slide 49 text

API • BufferͷϦϑΝΫλϦϯάͱindexOfͷ௥Ճ • Stream͕γϯϓϧʹ࡞ΕΔΑ͏ʹͳͬͨ • REPL͕historyΛηʔϒͯ͘͠ΕΔΑ͏ʹͳͬ ͨ • os.homeDir()͕௥Ճ

Slide 50

Slide 50 text

Performance

Slide 51

Slide 51 text

require͕ߴ଎Խ

Slide 52

Slide 52 text

require͕ߴ଎Խ • ͜Ε·Ͱ͸ɺfs.statSyncͱfs.readFileSyncΛ ࢖͕ͬͯͨɺstatSync͸஗͍͠ɺ readFileSync΋ຖճϓϩύςΟݺͼग़ͯ͠͠ Δͱएׯ͔͔࣌ؒΔɻ • ಺෦తʹߴ଎ͳAPI࡞ͬͨΒ50xߴ଎Խ͞Ε ͨɻ

Slide 53

Slide 53 text

http͕ߴ଎Խ

Slide 54

Slide 54 text

http͕ߴ଎Խ • http-parser͕ΞοϓάϨʔυ͞Εɺߴ଎Խ͕ ೖΓɺ͞ΒʹhttpϞδϡʔϧ͕ߴ଎Խ͞Εͨ

Slide 55

Slide 55 text

http͕ߴ଎Խ • ϝϞϦར༻཰΋վળ

Slide 56

Slide 56 text

Performance • require͕50xߴ଎Խ • http͕8%վળ • ϝϞϦޮ཰΋Ξοϓ

Slide 57

Slide 57 text

Deprecated

Slide 58

Slide 58 text

࢒೦ͳ͕Βdeprecatedʹͳͬ ͨAPIୡ

Slide 59

Slide 59 text

domains

Slide 60

Slide 60 text

domains͸Τϥʔ͸Ωϟον ग़དྷͯ΋͔ͦͬΒग़དྷΔ͜ͱ ͕গͳ͍ΑͶ… => deprecated

Slide 61

Slide 61 text

fs.exist/existSync

Slide 62

Slide 62 text

fs.existͰଘࡏ֬ೝͰ͖Δ͚ Ͳɺଘࡏ֬ೝͨ͠ޙʹผͳϓ ϩηε͔Βফ͞ΕͨΒͲ͏͢ Μͷʁ => deprecated

Slide 63

Slide 63 text

util.isXXXX

Slide 64

Slide 64 text

util.isXXX ࿩͢ͱ௕͍

Slide 65

Slide 65 text

util.isObject ͕ functionΛ ObjectͱΈͳͯ͠ͳ͍ underscore/lodash͸ͪΌΜ ͱ_.isObjectͰ͸trueʹͳΔ

Slide 66

Slide 66 text

࣮͸JSͷ࢓༷తʹ΋Function ͸ObjectͷҰͭ

Slide 67

Slide 67 text

मਖ਼͢Δͱmajor্͕ͬͪΌ ͏…

Slide 68

Slide 68 text

ͦ΋ͦ΋ཁΒͳ͘Ͷʁ => deprecated

Slide 69

Slide 69 text

Deprecated • domains • fs.exists • util.isXXXXX

Slide 70

Slide 70 text

Conclusion

Slide 71

Slide 71 text

Conclusion • ES.nextػೳڧԽ • API͕एׯύϫʔΞοϓ • ੑೳվળʂʂʂ • deprecatedͳAPI͸ࠓޙ࢖Θͳ͍Α͏ ʹʂʂʂʂ