東京Node学園 18時限目で発表した Node.js v4 の話です
Node.js v4@yosuke_furukawa
View Slide
@yosuke_furukawa
Tokyo NodeFest 2012
I asked him …
%PZPVIBWFBQMBOUPSFMFBTFW /FYUZFBS NBZCF
Congrats!!!!
Node.js v4.x features
Lots of features………….
JavaScript Syntax/Features
ES2015
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
Your code will be changedin Node.js
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
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;
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ͷΘΓʹDMBTTFYUFOETΛ͏BSSPXؔΛ͏UFNQMBUFTUSJOHMJUFSBMͰจࣈྻ݁߹Λॻ͘
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’, `${newDate()}: ${this.data}`);originalData = this.data;}}, 1000);}}module.exports = MyEventEmitter;#FGPSF "GUFS͖ͬ͢Γॻ͚ΔΑ͏ʹͳͬͨɻ
·ͩ• default params• rest/spread (ଟv5.0Ͱenable)• tail call opts• Proxy• Reflect• modules ((ƅ㱼ƅ)ŋ㲎. ŞƄŰŕ!!)
Strong Script
Strong Script• ES6 ͷίʔυΛڧ੍ͤ͞ΔΈ• “use strong” σΟϨΫςΟϒΛॻ͘• node —strong_mode hoge.js Ͱىಈ• var Λ let/constʹม͑ͨΓɺdeleteެจΛ͏ͱౖΒΕͨΓ͢Δɻ• experimental feature
“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 forfor (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: trylet undefined = ‘aaa’; // Restrict undefined bindinglet obj3 = { foo : ‘aaa’};obj3.bar = ‘123’; // Restrict undefined property access}
DEMO
ৄ͘͠
ESIntl
ESIntl• ECMAScript ࠃࡍԽAPI• ECMA-402 / ௨শ ESIntl• nodebuildͷ࣌ʹ’--with-intl=full-icu —download-all’Λࢦఆ͢Δͱ৽͘͠built-inΦϒδΣΫτͷIntlΦϒδΣΫτ͕༗ޮʹͳΔɻ
ESIntl4USJOH OVNSFQMBDF aE aEaEaE aEH
JavaScript Syntax/Features• ES2015ڧԽ• Strong Script͕࣮ݧతʹೖͬͯΔ• ࠃࡍԽAPI͕buildΦϓγϣϯࢦఆͰೖΕΒΕΔΑ͏ʹͳͬͨɻ
API
Buffer
Buffer• Buffer#indexOfϝιου͕Ճ• BufferͷϦϑΝΫλϦϯά͕ਐΈɺArrayBufferͰॻ͖͞ΕΔɻ• Bufferͷ܁Γฦ͠ʹfor/ofจ͕͑ΔΑ͏ʹͳΔɻ
Bufferࠓੲޠ• ͦͦBuffer v0.1.90Ͱ࣮͞Εͨ• ͦͷ࣌ArrayBufferଘࡏ͠ͳ͔ͬͨ• ్த͔ΒArrayBuffer͕༷Խ͞Ε࣮ͯ͞ΕͨͨΊࣅͨΑ͏ͳػೳΛ࣋ͭAPI͕Ͱ͖ͯ͠·ͬͨɻ• v4.0ͷλΠϛϯάͰv8͔ΒϝϞϦΛΞϩέʔτ͢Δ͕ؔdeprecatedͱͳΓɺBufferΫϥεArrayBufferΫϥεΛҾ͖ܧ͙ܗͰ࣮͞Εͨɻ
Buffer#indexOfϝιουͷՃจࣈྻԽ͔ͯ͠ΒJOEFY0G͢ΔΑΓང͔ʹޮ͕ྑ͍ɻ
Buffer instanceOf ArrayBuffer"SSBZ#V⒎FSΫϥεͷΠϯελϯεΛͦͷ··ͤΔ
Buffer for/ofvar buf = new Buffer([1, 2, 3]);for (var b of buf)console.log(b)// 1// 2// 3#V⒎FS͕JUFSBUPSʹʂʂʂ
Stream
Stream• Simple Stream Constructor͕Ͱ͖ͨ• StreamΛ࡞Δͷʹthrough2ͱ͔Λ͏ඞཁ͕ͳ͘ͳͬͨ
Simple Stream Constructor// v0.12var 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 ͢Δ};
Simple Stream Constructor// v4.0var transform = new stream.Transform({transform: function(chunk, encoding, next) {// ͜͜Ͱ มͯ͠...// push͢Δthis.push(chunk);},flush: function(done) {// ࠷ޙʹԿ͔͚ͨ͠Ε͜͜Ͱ flush ͢Δ}});؆୯ʂUISPVHIͱಉ͡ॻ͖ํʂʂ
REPL
REPL• historyΛηʔϒͯ͘͠ΕΔΑ͏ʹͳͬͨ• ී௨͚ͩͲɺΊͬͪΌخ͍͠
OS
OS• os.homeDir()͕Ճ• ࠓ·ͰhomeσΟϨΫτϦऔΕͳ͔͚ͬͨͲऔΕΔΑ͏ʹͳͬͨ
API• BufferͷϦϑΝΫλϦϯάͱindexOfͷՃ• Stream͕γϯϓϧʹ࡞ΕΔΑ͏ʹͳͬͨ• REPL͕historyΛηʔϒͯ͘͠ΕΔΑ͏ʹͳͬͨ• os.homeDir()͕Ճ
Performance
require͕ߴԽ
require͕ߴԽ• ͜Ε·Ͱɺfs.statSyncͱfs.readFileSyncΛ͕ͬͯͨɺstatSync͍͠ɺreadFileSyncຖճϓϩύςΟݺͼग़ͯ͠͠Δͱएׯ͔͔࣌ؒΔɻ• ෦తʹߴͳAPI࡞ͬͨΒ50xߴԽ͞Εͨɻ
http͕ߴԽ
http͕ߴԽ• http-parser͕ΞοϓάϨʔυ͞ΕɺߴԽ͕ೖΓɺ͞ΒʹhttpϞδϡʔϧ͕ߴԽ͞Εͨ
http͕ߴԽ• ϝϞϦར༻վળ
Performance• require͕50xߴԽ• http͕8%վળ• ϝϞϦޮΞοϓ
Deprecated
೦ͳ͕ΒdeprecatedʹͳͬͨAPIୡ
domains
domainsΤϥʔΩϟονग़དྷ͔ͯͦͬΒग़དྷΔ͜ͱ͕গͳ͍ΑͶ…=> deprecated
fs.exist/existSync
fs.existͰଘࡏ֬ೝͰ͖Δ͚Ͳɺଘࡏ֬ೝͨ͠ޙʹผͳϓϩηε͔Βফ͞ΕͨΒͲ͏͢Μͷʁ=> deprecated
util.isXXXX
util.isXXX͢ͱ͍
util.isObject ͕ functionΛObjectͱΈͳͯ͠ͳ͍underscore/lodashͪΌΜͱ_.isObjectͰtrueʹͳΔ
࣮JSͷ༷తʹFunctionObjectͷҰͭ
मਖ਼͢Δͱmajor্͕ͬͪΌ͏…
ͦͦཁΒͳ͘Ͷʁ=> deprecated
Deprecated• domains• fs.exists• util.isXXXXX
Conclusion
Conclusion• ES.nextػೳڧԽ• API͕एׯύϫʔΞοϓ• ੑೳվળʂʂʂ• deprecatedͳAPIࠓޙΘͳ͍Α͏ʹʂʂʂʂ