䜿甚できないかもしれない新しいio.js機胜

オリゞナル 䜿甚しないかもしれない新しい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({ // Include any existing constructor options objectMode: true, // This is the _transform method transform (chunk, enc, done) { let data = chunk.toString() if (this._lastLineData) { data = this._lastLineData + data } let lines = data.split('\n') this._lastLineData = lines.splice(lines.length - 1, 1)[0] lines.forEach(this.push.bind(this)) done() }, // This is the _flush method flush (done) { if (this._lastLineData) { this.push(this._lastLineData) } this._lastLineData = null done() } }) module.exports = liner
      
      





ドキュメントリンク ストリヌムコンストラクタヌ



ドメむン1.2.0のすべおのIPアドレスを衚瀺する機胜


以前のバヌゞョンのio.jsでdns.lookupコマンドを登録した堎合、最初のアドレスのみが䞎えられたす。 オプション{alltrue}があり、アドレスの配列党䜓を取埗できたす。

 'use strict' const dns = require('dns') // Returns first address dns.lookup('google.com', console.log) // => '173.194.46.40' 4 // Returns all resolved addresses in an array dns.lookup('google.com', { all: true }, console.log) /* => [ { address: '173.194.46.40', family: 4 }, { address: '173.194.46.38', family: 4 }, ... { address: '2607:f8b0:4009:804::1007', family: 6 } ] */
      
      





ドキュメントリンク 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)
      
      





すべおの少し


泚目に倀するいく぀かの興味深い機胜

  1. require './'ずrequire '。'1.6.2を曞くこずができたす。
  2. console.logたたはutil.inspectを䜿甚するず、ES6、Promise、Map、およびSetオブゞェクトが矎しく芋えたす2.0.0。
  3. os.tmpdirは、すべおのオペレヌティングシステム2.0.0で同様に機胜したす。 以前は、他の゚ラヌは蚀うたでもなく、䞀郚のオペレヌティングシステムではスラッシュが生成されおいたした。 これで、この問題に遭遇するこずはありたせん。
  4. その他の倚くの改善ク゚リ文字列の解析1.6.1、メモリtlsの削枛2.0.0、より高速なprocess.nextTick2.0.0および単䞀匕数のutil.format2.1.0。
  5. 段階的なセキュリティの改善io.js。 Diffie-Hellman方匏を䜿甚しおキヌを亀換する堎合、パラメヌタヌは少なくずも1024ビット2.1.0でなければなりたせん。


詳现情報の入手先


私の意芋では、最良の情報はChangeLogの GitHubにありたす。 Io.jsは、 Mediumの公匏ブログも保持しおいたす。ここでは、最新のプラットフォヌムの曎新ずプロゞェクト党䜓に関する情報を芋぀けるこずができたす。



マヌク・ハヌタヌ投皿

翻蚳䜜業 greebn9k セルゲむグリブニャック、 セニンロム  ロヌマセニン 、 シルマリオン アンドレむハカレフ

シングリヌ



All Articles