ãªãªãžãã«ïŒ
䜿çšããªããããããªãæ°ããio.jsæ©èœio.jsãã©ãããã©ãŒã
ã¯æ¥éã«éçºãããŠãããNodeãšã³ã·ã¹ãã å
šäœã«å€§ããªåœ±é¿ãäžããŠããŸãã çæéã§ãio.jsã§å€ãã®ä¿®æ£ãè¡ãããããã©ãŒãã³ã¹ãæ¹åãããæ°ããæ©èœãè¿œå ãããŸããã
io.jsã®éçºãè¡ã£ãŠããªãå Žåã§ãæ§ããŸãã-ãã®èšäºã§ã¯ããã©ãããã©ãŒã ã®äž»ãªæ©èœãç°¡åã«çŽ¹ä»ããŸãã çµäºãããšããã€ãŸãå€ããã®ããæ°ãããã®ãžãšããããèæ
®ããŸãã å¿
èŠã«å¿ããŠãé¢é£ããããã¥ã¡ã³ããžã®ãªã³ã¯ãæäŸããŸãïŒè±èªïŒã åæ°æ©èœã«ã€ããŠèª¬æããæåã®ããŒãžã§ã³ã瀺ããŸãã ã³ãŒãã¯ãio.jsã§å©çšå¯èœãªæšæºã®ES6æ©èœã䜿çšããŠèšè¿°ãããŠããŸãã ããã§ã¯å§ããŸããã...
ES6æ©èœïŒ1.0.0ïŒ
åœåãio.jséçºè
ã®ã¿ã¹ã¯ã®1ã€ã¯ãV8ã®æ©èœã«ã¢ãããŒãããããšã§ãããã€ãŸããå©çšå¯èœãªãã¹ãŠã®ES6æ©èœãæ倧éã«æŽ»çšããããšã§ããã ããã©ã«ãã®ãã«ãã€ã³ãžã§ãã¬ãŒã¿ãŒãä»ã®
ES6æ©èœã¯ ããã©ã°ããªããŠãéåžžã«å®å®ããŠåäœãããšä¿¡ããããŠããŸããã ES6ã®æ
å ±ãæ¥ãã§æ¢ããŠã¯ãããªãããšããå§ãããŸãããŸãã¯ãèšäºãã芧ãã ããããã®èšäºãžã®ãªã³ã¯ãæäŸããŸãã
ããã¥ã¡ã³ããªã³ã¯ïŒ
ES6ã®æ©èœæ³š ïŒããã©ã«ãã§ã¯ãNode 0.12ã«ã¯ããã€ãã®ES6æ©èœããããŸãã --harmonyãã©ã°ã®äžã«ããã«å€ãã®æ©èœããããŸãã ãã ããES6é¢æ°ã®æäœãšã¢ã¯ã»ã·ããªãã£ã¯io.jsãšã¯ç°ãªããŸãïŒããšãã°ãããã©ã«ãã§ã¯ããžã§ãã¬ãŒã¿ãŒã¯Nodeã«ååšããŸããïŒã
詳现ãªãšã©ãŒææžïŒ1.2.0ïŒ
EPIPEãEMFILEãENOENTãšã¯äœãçåã«æã£ãããšã¯ãããŸãããïŒ ç§ã¯å人çã«ãã®è³ªåãäœåºŠãèªåããŸããã ãããããããšã«ãio.jsã§ã¯ãã°ã®ããã¥ã¡ã³ãã倧å¹
ã«æ¹åãããŸããã
ããã¥ã¡ã³ããªã³ã¯ïŒ
ãã°ããã¥ã¡ã³ãã¹ã¬ããã®ç°¡åãªå®è£
ïŒ1.2.0ïŒ
æ£åŒã«ã¯ãã¹ããªãŒã ãé©çšããå¿
èŠãããå ŽåãããŒã¹ã¹ããªãŒã ãå±éããã¹ããªãŒã ã®ã¿ã€ãã«å¿ããŠ1ã€ä»¥äžã®ã¡ãœãããé©çšããŸãã ããšãã°ãTransformã¹ããªãŒã ã¯ã_transformã¡ãœãããš_flushã¡ãœããã®äœ¿çšããªãã·ã§ã³ã§æ³å®ããŠããŸãã 以äžã®äŸã¯ãStreamã¹ããªãŒã ããã¡ã€ã«ãè¡ã«åå²ããæ¹æ³ã瀺ããŠããŸãã
var stream = require('stream') var liner = new stream.Transform( { objectMode: true } ) liner._transform = function (chunk, enc, done) { var data = chunk.toString() if (this._lastLineData) { data = this._lastLineData + data } var lines = data.split('\n') this._lastLineData = lines.splice(lines.length-1,1)[0] lines.forEach(this.push.bind(this)) done() } liner._flush = function (done) { if (this._lastLineData) { this.push(this._lastLineData) } this._lastLineData = null done() } module.exports = liner
ã¡ãœããã®ãã¹ãŠã®ãå
èããå€åŽã«ãããããã³ãŒãã¯ããªãä¹±éã«èŠããŸãã ããã§ããããã®ã¡ãœããããªãã·ã§ã³ãšããŠã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããšãã§ããŸãã ã¢ã³ããŒã¹ã³ã¢ïŒ_ïŒãåé€ããã ãã§ãã ã©ã€ããŒã䜿çšãããšãã³ãŒããå€æŽããŠïŒES6ã®æ¡åŒµæ©èœãããªããžã§ã¯ãè¡šèšã䜿çšããŠïŒã次ã®ãã®ãååŸã§ããŸãã
'use strict' const stream = require('stream') let liner = new stream.Transform({
ããã¥ã¡ã³ããªã³ã¯ïŒ
ã¹ããªãŒã ã³ã³ã¹ãã©ã¯ã¿ãŒãã¡ã€ã³ïŒ1.2.0ïŒã®ãã¹ãŠã®IPã¢ãã¬ã¹ã衚瀺ããæ©èœ
以åã®ããŒãžã§ã³ã®io.jsã§dns.lookupã³ãã³ããç»é²ããå Žåãæåã®ã¢ãã¬ã¹ã®ã¿ãäžããããŸãã ãªãã·ã§ã³{allïŒtrue}ããããã¢ãã¬ã¹ã®é
åå
šäœãååŸã§ããŸãã
'use strict' const dns = require('dns')
ããã¥ã¡ã³ããªã³ã¯ïŒ
dns.lookupã«ã€ããŠUnhandleRejectionã€ãã³ãïŒ1.4.1ïŒ
çŽæãæåŠããŠãã誰ããããç¥ããªãå Žåãæ¬åœã«æåŠããããšèããããšã¯ã§ããŸããïŒ ãã¡ãããããã¯èµ·ãããŸããããåã³-誰ãããã«ã€ããŠç¥ããŸããïŒ ãæ³åã®ãšãããããã«ã³ãŒãã®å€ãã®è€éãªãšã©ãŒã®åå ããããŸãã ããšãã°ã次ã®ã³ãŒãã«æ³šæããŠãã ããã
'use strict' let delay = function (ms) { return new Promise(function (resolve) { setTimeout(resolve, ms) }) } delay(2000) .then(function (data) { data.foo = 'hello' })
ééããããŸãããïŒ é
延é¢æ°ã¯ãäžå®æéåŸã«å®è¡ãããPromiseãè¿ããŸããå®è¡ããããšãæªå®çŸ©ãšReferenceErrorãçºçããŸãã ããã¯ãæªå®çŸ©ã®å€ã§fooããããã£ã«ã¢ã¯ã»ã¹ããããšããããã«çºçããŸãã äžæ¹ãç§ãã¡ã¯äœãèµ·ãã£ãã®ã決ããŠç¥ãããšãã§ãããçã®å€±æã«èª°ã泚æãæããªãã£ããããé ã®åŸããåŒã£æ»ããŠé©ããã§ãããã äžéšã®ã©ã€ãã©ãªã§ã¯ããã®ãããªçŽæã®å¯èœæ§ãæå®ãããŠããŸãããES6ã«ã¯ããã«é¢ããæ
å ±ããããŸããã 幞ããªããšã«ãããã»ã¹ãä»ããŠunhandledRejectionã€ãã³ãã䜿çšããŠã³ãŒãããã¹ãã§ããŸãã
process.on('unhandledRejection', function (er) { console.log('got unhandled rejection', er.stack) })
ES6ã§promiseã䜿çšããå Žåã倱æãæ°ä»ããªãããã«unhandledRejectionãèšå®ããããšããå§ãããŸãã
ããã¥ã¡ã³ããªã³ã¯ïŒ
process.onïŒãunhandledRejectionãïŒæ³š ïŒãŸããrejectionHandledã€ãã³ãããããŸãã ã€ãã³ãã«ãŒãã®æ¬¡ã®ã¹ãããã§çºçãããããã¹ã®å€±æã«å¯ŸåŠããå¿
èŠãããå Žåã«äœ¿çšãããŸãã rejectHandledã¯ãunhandledRejectionã§èª€ã£ãŠãµããã«ããããããããã¹ãç¡å¹ã«ããå¿
èŠãããå Žåã«åœ¹ç«ã¡ãŸãã 詳现ã«ã€ããŠã¯ã
ããã¥ã¡ã³ããåç
§ããŠãã ããã
StreamWrapããã³JSStreamïŒ1.4.1ïŒ
ãã®ããŒãžã§ã³ãããC ++ãšJSã®ã¹ã¬ããéã«æ¬æ Œçãªæ¥ç¶ãç»å ŽããŸããã C ++ã§äœæ¬¡ã¹ããªãŒã ïŒãœãããŠã§ã¢ãœã±ãããªã©ïŒãæäœããå ŽåãããŒã¿å
¥åã«æšæºã®Duplexã¹ããªãŒã ã䜿çšã§ããããã«ãªããŸããã tls.connectïŒïŒã¡ãœããã¯ããã®æ©èœãæ倧éã«æŽ»çšããŸãã äŸãšããŠã次ã®
ãã¹ãã¹ã€ãŒãã確èªããŸã ã
ãããã¡ãŒïŒindexOfã¡ãœãã
次ã«ãæååããããã¡ããŸãã¯çªå·ã䜿çšããŠãããã¡å
ãæ€çŽ¢ãã䟿å©ãªæ¹æ³ã説æããŸãã ãã®ã¡ãœããã¯ãArrayïŒindexOfãšåãããã«åäœããŸããã€ãŸãããããã¡ã§æåã«èŠã€ãã£ãäžèŽã®éå§äœçœ®ã®ã€ã³ããã¯ã¹ãè¿ããŸãã å¿
èŠã«å¿ããŠãè¿œå ã®ãã©ã¡ãŒã¿ãŒãšããŠéå§ã€ã³ããã¯ã¹ãèšå®ã§ããŸãã
'use strict' const assert = require('assert') let buf = new Buffer('abc def ghi') assert.equal(buf.indexOf('abc'), 0) assert.equal(buf.indexOf('bc'), 1) assert.equal(buf.indexOf('def'), 4) assert.equal(buf.indexOf('c'), 2) assert.equal(buf.indexOf('c', 4), 11)
è¿œå ã®ã¡ãœããlastIndexOfã¯ãŸã è°è«äžã§ãã
ããã¥ã¡ã³ããªã³ã¯ïŒ
ãããã¡ãŒïŒindexOfããªããŒãã¢ãžã¥ãŒã«ïŒ1.6.0ïŒ
ããã§ãã¹ã¯ãªããã®å®è¡äžãŸãã¯REPLã䜿çšããŠã¢ãžã¥ãŒã«ãããªããŒãã§ããŸãã ããã¯ã-rãŸãã¯--requireãã©ã°ã䜿çšããŠå®è¡ã§ããŸãã äŸïŒ
iojs -r ./foo -r bar my-app.js
次ãšåãïŒ
require('./foo') require('bar') require('./my-app')
ããªããŒãã¢ãžã¥ãŒã«ã¯ãio.jsã䜿çšããæ°ããå¯èœæ§ãæäŸããŸãã ããšãã°ã䟿å©ãªäœæ¥ã¢ããªã±ãŒã·ã§ã³ã«æ°ããæ©èœãè¿œå ã§ããŸãã ãŸãã¯ïŒé åºä»ããããŠããªãã¢ã¬ã€ã®ç¶æ
ã®ã¹ãããã·ã§ãããååŸããŠãããŒã¿æŒæŽ©ãæé€ããã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã ãããè¡ãã«ã¯ããã®æ§æããµããŒãããå¿
èŠã¯ãããŸããã
if (cfg.useHeapdump) require('heapdump')
å¿
èŠãªæ©èœãå¿
èŠãªå Žåã«ã®ã¿ãããªããŒããããã¢ãžã¥ãŒã«ã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããå¿
èŠããããŸãã
iojs -r heapdump app.js
å¥ã®äœ¿çšäŸã¯ãã³ã³ãã€ã©ãŒïŒBabelãCoffeeScriptãªã©ïŒã䜿çšããå Žåã§ãã ããšãã°ãBabelã䜿çšããŠES6ãŸãã¯ES7ã§ã³ãŒããã³ã³ãã€ã«ããå Žåã次ã®ããã«èšè¿°ããå¿
èŠããããŸãã
require('babel/register') require('./my-actual-app')
ããã§ããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã䜿çšããã«ã³ãã³ãã©ã€ã³ããçŽæ¥èšå®ã§ããŸãã
iojs -r babel/register my-actual-app.js
泚 ïŒçŸæç¹ã§ã¯ãBabelã¯Nodeãå®å
šã«ãµããŒãããŠããŸãã ç¹å¥ãªããŒã«ã䜿çšãããšãäžèšã®æäœãå®è¡ã§ããŸãã
åæI / Oã«ãããã©ãã«ã·ã¥ãŒãã£ã³ã°ïŒ2.1.0ïŒ
Synchonous I / Oã¯ãç¹ã«ã·ã§ã«ã¹ã¯ãªããã«ãšã£ãŠäŸ¿å©ã§ãããå€ãã®ã¢ããªã±ãŒã·ã§ã³ïŒãµãŒããŒãªã©ïŒã®ããã©ãŒãã³ã¹ã倧å¹
ã«äœäžããŸãã ã³ãŒãã§Syncãæ€çŽ¢ã§ããŸãããåœåã¹ããŒã ã«åŸããªããµãŒãããŒãã£ã¢ãžã¥ãŒã«ã䜿çšãããšã©ããªããŸããïŒ ããã¯--trace-sync-ioãã©ã°ãå©ãã«ãªãå Žæã§ãã åæèŠæ±ãå®è¡ããããšãã¹ã¿ãã¯ãã¬ãŒã¹ãéç¥ãããŸãã
ç°¡åãªäŸãèŠãŠã¿ãŸãããïŒ
'use strict' const http = require('http') const cp = require('child_process') http.createServer(function (req, res) { let stdout = cp.execFileSync('whoami') res.end(`${stdout}\n`) }).listen(3000)
åãªã¯ãšã¹ãã®åæã³ãŒããåŠçããHTTPãµãŒããŒããããŸãã ãã®ãªãã·ã§ã³ã¯æšå¥šã§ããŸããã ãããã£ãŠãiojs --trace-sync-io server.jsãå®è¡ããŠããhttpL // localhostïŒ3000ã«åãæ¿ãããšãã³ã³ãœãŒã«ã«æ¬¡ã®èŠåã衚瀺ãããŸãã
WARNING: Detected use of sync API at spawnSync (child_process.js:1241:27) at execFileSync (child_process.js:1291:13) at /Users/wavded/Projects/whats-new-iojs/server.js:6:19 at emitTwo (events.js:87:13) at emit (events.js:172:7) at parserOnIncoming (_http_server.js:474:12) at parserOnHeadersComplete (_http_common.js:88:23) at socketOnData (_http_server.js:325:22) at emitOne (events.js:77:13)
ãã¹ãŠã®å°ã
泚ç®ã«å€ããããã€ãã®èå³æ·±ãæ©èœïŒ
- requireïŒ './'ïŒãšrequireïŒ 'ã'ïŒïŒ1.6.2ïŒãæžãããšãã§ããŸãã
- console.logãŸãã¯util.inspectã䜿çšãããšãES6ãPromiseãMapãããã³Setãªããžã§ã¯ããçŸããèŠããŸãïŒ2.0.0ïŒã
- os.tmpdirïŒïŒã¯ããã¹ãŠã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ïŒ2.0.0ïŒã§åæ§ã«æ©èœããŸãã 以åã¯ãä»ã®ãšã©ãŒã¯èšããŸã§ããªããäžéšã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ã¯ã¹ã©ãã·ã¥ãçæãããŠããŸããã ããã§ããã®åé¡ã«ééããããšã¯ãããŸããã
- ãã®ä»ã®å€ãã®æ¹åïŒã¯ãšãªæååã®è§£æïŒ1.6.1ïŒãã¡ã¢ãªtlsã®åæžïŒ2.0.0ïŒãããé«éãªprocess.nextTickïŒ2.0.0ïŒããã³åäžåŒæ°ã®util.formatïŒ2.1.0ïŒã
- 段éçãªã»ãã¥ãªãã£ã®æ¹åio.jsã Diffie-Hellmanæ¹åŒã䜿çšããŠããŒã亀æããå Žåããã©ã¡ãŒã¿ãŒã¯å°ãªããšã1024ãããïŒ2.1.0ïŒã§ãªããã°ãªããŸããã
詳现æ
å ±ã®å
¥æå
ç§ã®æèŠã§ã¯ãæè¯ã®æ
å ±ã¯
ChangeLogã® GitHubã«ãããŸãã Io.jsã¯ã
Mediumã®å
¬åŒããã°ãä¿æããŠããŸããããã§ã¯ãææ°ã®ãã©ãããã©ãŒã ã®æŽæ°ãšãããžã§ã¯ãå
šäœã«é¢ããæ
å ±ãèŠã€ããããšãã§ããŸãã
ããŒã¯ã»ããŒã¿ãŒæçš¿
翻蚳äœæ¥ïŒ
greebn9k ïŒã»ã«ã²ã€ã°ãªããã£ãã¯ïŒã
ã»ãã³ãã ïŒ
ããŒãã»ãã³ ïŒã
ã·ã«ããªãªã³ ïŒã¢ã³ãã¬ã€ãã«ã¬ãïŒ
ã·ã³ã°ãªãŒ