Api changes between v0.8 and v0.10 - nodejsjp/nodejs.org_ja GitHub Wiki

このページは Api-changes-between-v0.8-and-v0.10 (193b80e) の翻訳です。このページに記述されていない変更点を追加する場合は、本家を先に更新してください。誤訳や誤字を見つけた場合はこのページを編集してください。

Changed

  • Streams インタフェース

    • Readable, Writable, Duplex, そして Transform ベースクラスが追加されました。
    • Readable ストリームは、すぐに 'data' イベントを発する代わりに、read() メソッドを使用します。
    • 'data' イベントハンドラを追加するか、pause() または resume() を呼び出すと、"旧モード" に切り替わります。
      • これは、data イベントハンドラはそれが追加されるより前の最初のチャンクを失わないことと、pause() はもはや単なるアドバイスではないことを意味します。
    • もしデータを消費しなければ、ストリームはずっと中断状態となります。そして 'end' イベントは決して発生しません。
  • process.title環境を上書きしません. これは、process.title の長さはバイナリ名 + コマンドライン引数の長さに制限されるようになったことを意味します。よいこととして、OS X でも動作するようになりました!

  • uv_after_work_cb のシグネチャが変更され、状態を示すために2番目の整数型の引数を受け取るようになりました。後方互換性のため、第4引数は明示的に uv_queue_work にキャストします。

  • process.nextTick は現在の tick が終わった後、現在のスタックが巻き戻された直後に発生します。もし再帰処理のために nextTick を使っているなら、代わりに setImmediate を使ってください。

  • -p --print コマンドライン引数は -e --eval を意味します。

  • net: net.createServer() によって作成されるソケットはもはや 'connect' イベントを生成しません。'connection' イベントのリスナが呼ばれた時、ソケットはすでに接続済みです。そのため、これは余計です。これは元々、Socket オブジェクトの再利用をサポートするためのものでしたが、それは Node v0.4 以前から実際には不可能でした。サーバが Socket を得た時にそれはすでに接続済みですから、イベントを生成するというのは明らかに間違いでした。サーバ上でソケットを得るとき、それはすでに接続済みなので、すぐにそれを使うことができます。

  • url: 解析されたオブジェクトは常に全てのプロパティを含み、使われていないものには null が設定されます。例:

    // v0.8
    > url.parse('http://foo')
    { protocol: 'http:',
      slashes: true,
      host: 'foo',
      hostname: 'foo',
      href: 'http://foo/',
      pathname: '/',
      path: '/' }
    
    // 0.10
    > url.parse('http://foo')
    { protocol: 'http:',
      slashes: true,
      auth: null,
      host: 'foo',
      port: null,
      hostname: 'foo',
      hash: null,
      search: null,
      query: null,
      pathname: '/',
      path: '/',
      href: 'http://foo/' }
  • domain: エラーオブジェクトに加えられるプロパティは、スネークケースではなくキャメルケースになりました。

  • path.resolve および path.join は文字列以外の入力に対して TypeError をスローします。

  • dgram.Socket#bind() は常に非同期になりました。もし次のようなコードがあると:

    var s = dgram.createSocket('udp4');
    s.bind(1234);
    s.addMembership('224.0.0.114');

    これは次のように変更されなければなりません。

    var s = dgram.createSocket('udp4');
    s.bind(1234, function() {
      s.addMembership('224.0.0.114');
    });
  • EventEmitter のコンストラクタは様々なプロパティを設定するようになりました。それは今でも OOP 継承の親として動作しますが、正しく継承しなければなりません。「壊れたスタイル」の継承パターンで拡張された EventEmitter の拡張クラスは動作しないでしょう。そのスタイルの継承はこれまでもサポートされていませんでしたが、0.10 以前は実際には問題になりませんでした。

    // 壊れたスタイルの継承、これは安全でもなければよくもありませんでしたが、
    // Webでは多くの壊れたチュートリアルで見られます。
    function Child() {}
    Child.prototype = new Parent(); // <-- 決してやってはいけません!!
    // もしこれをどこかの JavaScript ライブラリで見かけたら、
    // これは大きくて酷い間違いだ! と教えてください。
    // クラスの継承は、全ての子クラスのインスタンスから共有されるプロトタイプ上で
    // そのクラスのコンストラクタを呼び出してはいけません!
    
    // 正しいスタイルの継承
    function Child() {
      Parent.call(this);
    }
    Child.prototype = Object.create(Parent.prototype, {
      constructor: {
        value: Child,
        enumerable: false,
        writable: true,
        configurable: true
      }
    });
    // 「なんてたくさんの行! ヘルパーメソッドはないの!」
    // あります。こうしてください:
    util.inherits(Child, Parent);
  • https はデフォルトで相手の証明書を検証するようになりました。 これは、デフォルト CA リストにない認証局を使って SSL エンドポイントにアクセスを試みた場合、以前にはなかったエラーを受け取ることを意味します。 rejectUnauthorizedfalse に設定することにより、以前の振る舞いになります。

  • https.createServer の作成時に SSL オプションが必要になり、それが設定されないと例外がスローされるようになりました。以前のバージョンでは、.listen() を呼び出すまでオプションを渡さなくても許容されていました。

  • os.tmpDir()os.tmpdir() に改名されました。os.tmpDir() は別名として利用可能です。

  • ネイティブ アドオン は、完全な module オブジェクトを受け取れるようになり、カスタムのオブジェクトまたは関数 (すなわち "substack パターン) で exports を上書きすることが可能になりました。 単に Init() 関数に第2引数を加えることで、module オブジェクトが与えられます: void Init(Handle<Object> exports, Handle<Object> module); アドオンの例 は昔からの方法と、exports を上書きする方法の両方を混在させています (追加のサンプルは GitHub repo から利用可能です)。

    旧来の方法

    Handle<Value> Booya(const Arguments& args) {
      HandleScope scope;
      return scope.Close(String::New("hello world"));
    }
    void Init(Handle<Object> exports) {
      exports->Set(String::NewSymbol("booya"), FunctionTemplate::New(Booya)->GetFunction());
    }
    NODE_MODULE(addon, Init)
    console.log(require('./build/Release/addon').booya())

    一つの関数をexports

    Handle<Value> Booya(const Arguments& args) {
      HandleScope scope;
      return scope.Close(String::New("hello world"));
    }
    void Init(Handle<Object> exports, Handle<Object> module) {
      module->Set(String::NewSymbol("exports"), FunctionTemplate::New(Booya)->GetFunction());
    }
    NODE_MODULE(addon, Init)
    console.log(require('./build/Release/addon')())
  • fs モジュールの操作は、コールバックが提供されない場合に例外をスローするようになります。これは、コールバック関数が忘れられた場合に潜在的に危険なエラーを逃すことを防ぎます。エラーを無視するには、function(){} をコールバックとして渡してください。fs の操作にコールバックを指定していないソースを突き止めるには、NODE_DEBUG=fs 環境変数を設定してください。

  • fs モジュールの readFile()writeFile()appendFile() およびそれらの同期版は、 options オブジェクトを受け取るようになりました (ただし、encoding 文字列を受け取る古い API もサポートされています)。

  • Crypto のメソッドは、デフォルトでバイナリエンコードされた文字列ではなく、Buffer オブジェクトを返すようになりました。

  • util.inspect()options オブジェクトを受け取るようになりました。後方互換性のために、古い API もサポートされています。

Added

  • Streams - Readable, Writable, Duplex, そして Transform ベースクラス
  • Crypto API のストリーミングインタフェース
  • process: getgroups(), setgroups(), initgroups()
  • crypto: getHashes(), getCiphers()
  • http: response.headerSent プロパティ
  • events: 'removeListener' イベント
  • setImmediate() および clearImmediate() 関数
  • string_decoder: decoder.end() 関数と BASE-64 エンコーディング
  • fs: ftruncate() および ftruncateSync()
  • buffer: Buffer.prototype.toJSON() 関数
⚠️ **GitHub.com Fallback** ⚠️