ノート

10348 ワード

菜鳥教程
概要
簡単にNode.jsというのはサービスの端にあるJavaScriptです.Node.jsはChrome JavaScriptに基づいて実行する時に作られたプラットフォームです.Node.jsはイベント駆動I/Oサービス端末JavaScript環境で、GoogleのV 8エンジンに基づいて、V 8エンジンはJavascriptのスピードを実行して、性能はとても速いです.
インストール
初心者の教程を参考にする
NPM使用紹介
新版のnodejsはnpmに集積されています.バージョン番号を確認することによってテストが成功しました.
$ npm -v
4.2.0
タオバオNPMを使ってミラーリングします.
$ npm install -g cnpm --registry=https://registry.npm.taobao.org

//   cnpm     
$ cnpm install [name]
モジュールをインストール
$ npm install        #  
$ npm install  -g    #  
インストール情報を表示
$ npm list -g
モジュールのバージョン番号を表示します.
$ npm list grunt
モジュールをアンマウント
$ npm uninstall express
モジュールを更新
$ npm update express
検索モジュール
$ npm search express
モジュールを作成すると、package.jsonファイルが生成されます.
$ npm init
バージョン番号
意味バージョン番号はX.Y.Zの3桁に分けられ、それぞれメインバージョン番号、サブバージョン番号、パッチバージョン番号を表します.
  • バグを修復するだけであれば、Zビットを更新する必要があります.
  • 機能が追加された場合、下方互換性があり、Yビットを更新する必要があります.
  • 大きな変動があると、下に互換性がなく、Xビットを更新する必要があります.
  • コールバック関数
    ブロッキングコード
    var fs = require("fs");
    
    var data = fs.readFileSync('input.txt');
    
    console.log(data.toString());
    console.log("      !");
    
    ブロッキングコードではない
    var fs = require("fs");
    
    fs.readFile('input.txt', function (err, data) {
        if (err) return console.error(err);
        console.log(data.toString());
    });
    
    console.log("      !");
    
    ブロック例はファイルの読み込みが終わった後にプログラムを実行します.ブロックされていない例はファイルの読み込みが終わるまで待つ必要はありません.そうすると、ファイルを読み込む時に次のコードを実行して、プログラムの性能を大幅に向上させます.ブロッキングは順序によって実行されます.ブロッキングではなく順番に行う必要があります.だから、コールバック関数のパラメータを処理する必要があるなら、コールバック関数に記入します.
    イベントサイクル
  • nodejsは単一プロセスの単一スレッドアプリケーションであり、イベントとコールバックによって同時にサポートされているため、性能は非常に高い.
  • のnodejsの各APIは非同期であり、独立したスレッドとして動作し、非同期関数を使用して起動し、同時に処理する.
  • nodejsは基本的にすべてのイベント機構を設計モードにおける観察者モードで実現する.
  • のnodejs単一スレッドは、イベント観察者が終了するまでは、イベントが発生した場合には、このコールバック関数を呼び出すイベントサイクルに入るようなものである.
  • var events = require('events');
    var eventEmitter = new events.EventEmitter();
    //    1
    var listener1 = function listener1(){
        console.log('    listener1   。');
    }
    //    2
    var listener2 = function listener2(){
        console.log('    lisrener2   。');
    }
    //       ,     listener1
    eventEmitter.addListener('connection',listener1);
    //       ,     listener1
    eventEmitter.addListener('connection',listener2);
    
    var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
    console.log(eventListeners + '           。');
    //       
    eventEmitter.emit('connection');
    //        listener1   
    eventEmitter.removeListener('connection',listener1);
    console.log('listener1      。');
    //       
    eventEmitter.emit('connection');
    
    eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
    console.log(eventListeners + '           。');
    
    eventEmitter.emit('error');
    console.log('      。');
    
    
    
    //     
    $ node main.js
    2           。
        listener1   。
        listener2   。
    listener1      。
        listener2   。
    1           。
          。
    
    Buffer(バッファ)
    ノード.jsでは、バイナリデータを専門に保存するキャッシュエリアを作成するためにBufferクラスが定義されている.
    Bufferクラスを作成
    var buf = new Buffer([10,20,30,40,50]);;
    console.log(buf);
    // 
    
    var buf2 = new Buffer('www.runoob.com','utf-8');
    console.log(buf2);
    // 
    
    var buf3 = new Buffer(10);
    console.log(buf3);
    // 
    
    バッファに書き込み
    var len = buf3.write('www.runoob.com');
    console.log('     :' + len);
    
    バッファからデータを読み出す
    console.log(buf.toString('ascii'));
    console.log(buf.toString('ascii',0,5));
    console.log(buf.toString('utf8',0,5));
    console.log(buf.toString(undefined,0,5));
    console.log(buf.toJSON());
    
    バッファマージ
    var buffer1 = new Buffer('    ');
    var buffer2 = new Buffer('www.runoob.com');
    var buffer3 = Buffer.concat([buffer1,buffer2]);
    console.log('buffer3   : '+buffer3.toString());
    
    バッファ比較
    var buff1 = new Buffer('ABC');
    var buff2 = new Buffer('ABCD');
    var result = buff1.compare(buff2);
    
    if(result < 0){
        console.log(buff1 + '   ' + buff2 + '  ');
    }else if(result == 0){
        console.log(buff1 + '   ' + buff2 + '  ');
    }else{
        console.log(buff1 + '   ' + buff2 + '  ');
    }
    
    コピーバッファ
    var b1 = new Buffer('ABC');
    var b2 = new Buffer(3);
    b1.copy(b2);
    console.log('b2 content: '+b2.toString());
    
    バッファリング
    var buffer1 = new Buffer('runoob');
    //      
    var buffer2 = buffer1.slice(0,2);
    console.log("buffer2 content: " + buffer2.toString());
    
    バッファ長
    var buffer = new Buffer('www.runoob.com');
    //       
    console.log("buffer length: " + buffer.length);
    
    Stream(ストリーム)
    Streamは抽象的なインターフェースで、Nodeの中に多くのオブジェクトがこのインターフェースを実現しました.例えば、httpサーバに対して要求を開始するrequestオブジェクトは、Streamであり、stdout(標準出力)である.Node.js、Streamは4種類のストリームタイプがあります.
  • Readable-読み取り可能な動作.
  • Writable-書き込み可能です.
  • Duplex-読み書き可能操作.
  • Transform-操作はデータに書き込まれ、結果を読み出します.
  • すべてのStreamオブジェクトはEventEmitterの例である.よく使うイベントは以下の通りです.
  • data-データ読み取り可能なときにトリガされる.
  • end-より多くのデータが読み取り可能でないときにトリガされます.
  • error-受信および書込み中にエラーが発生した場合にトリガします.
  • finish-すべてのデータが最終層システムに書き込まれたときにトリガされます.
  • ストリームからデータを読み出す
    var fs = require("fs");
    var data = '';
    
    //      
    var readerStream = fs.createReadStream('input.txt');
    
    //       utf8。
    readerStream.setEncoding('UTF8');
    
    //       --> data, end, and error
    readerStream.on('data', function(chunk) {
       data += chunk;
    });
    
    readerStream.on('end',function(){
       console.log(data);
    });
    
    readerStream.on('error', function(err){
       console.log(err.stack);
    });
    
    console.log("      ");
    
    書込みフロー
    var fs = require("fs");
    var data = '        :www.runoob.com';
    
    //           ,      output.txt  
    var writerStream = fs.createWriteStream('output.txt');
    
    //    utf8       
    writerStream.write(data,'UTF8');
    
    //       
    writerStream.end();
    
    //       --> data, end, and error
    writerStream.on('finish', function() {
        console.log("    。");
    });
    
    writerStream.on('error', function(err){
       console.log(err.stack);
    });
    
    console.log("      ");
    
    パイプの流れは、入力ストリームに出力する機構を提供する.通常、1つのストリームからデータを取得し、他のストリームにデータを転送するために使用され、大きなファイルのコピープロセスが実現される.
    var fs = require("fs");
    
    //        
    var readerStream = fs.createReadStream('input.txt');
    
    //        
    var writerStream = fs.createWriteStream('output.txt');
    
    //       
    //    input.txt     ,        output.txt    
    readerStream.pipe(writerStream);
    
    console.log("      ");
    
    チェーンストリームは、出力ストリームを別のストリームに接続し、複数のストリーム動作チェーンを作成する仕組みです.チェーンストリームは一般にパイプ操作に用いられる.ファイルをパイプとチェーンで圧縮し、解凍する.
        
    var fs = require("fs");
    var zlib = require('zlib');
    
    //    input.txt     input.txt.gz
    fs.createReadStream('input.txt')
      .pipe(zlib.createGzip())
      .pipe(fs.createWriteStream('input.txt.gz'));
      
    console.log("      。");
    
    var fs = require("fs");
    var zlib = require('zlib');
    
    //    input.txt.gz     input.txt
    fs.createReadStream('input.txt.gz')
      .pipe(zlib.createGunzip())
      .pipe(fs.createWriteStream('input.txt'));
      
    console.log("      。");
    
    モジュールシステム
    モジュール公開インターフェース
    exports.world = function() {
      console.log('Hello World');
    }
    
    
    //     
    var hello = require('./hello');
    hello.world();
    
    モジュールインターフェース
    //hello.js 
    function Hello() { 
        var name; 
        this.setName = function(thyName) { 
            name = thyName; 
        }; 
        this.sayHello = function() { 
            console.log('Hello ' + name); 
        }; 
    }; 
    module.exports = Hello;
    
    
    
    
    //     
    var Hello = require('./hello'); 
    hello = new Hello(); 
    hello.setName('BYVoid'); 
    hello.sayHello(); 
    
    モジュールインターフェースの唯一の変化はmodule.exports=Helloを使用してexports.world=function()に取って代わったことである.このモジュールを外部から引用する場合、そのインターフェースオブジェクトは、元のexportではなく、出力されるHelloオブジェクトそのものです.
    関数
    関数は別の関数のパラメータとして使用できます.
    function say(word) {
      console.log(word);
    }
    
    function execute(someFunction, value) {
      someFunction(value);
    }
    
    execute(say, "Hello");
    
    匿名関数
    function execute(someFunction, value) {
      someFunction(value);
    }
    
    execute(function(word){ console.log(word) }, "Hello");
    
    HTTPサーバ
    var http = require("http");
    
    http.createServer(function(request, response) {
      response.writeHead(200, {"Content-Type": "text/plain"});
      response.write("Hello World");
      response.end();
    }).listen(8888);
    
    // 
    
    var http = require("http");
    
    function onRequest(request, response) {
      response.writeHead(200, {"Content-Type": "text/plain"});
      response.write("Hello World");
      response.end();
    }
    
    http.createServer(onRequest).listen(8888);
    
    ルート
    router.js
    function route(pathname) {
      console.log("About to route a request for " + pathname);
    }
    
    exports.route = route;
    
    server.js
    var http = require("http");
    var url = require("url");
    
    function start(route) {
      function onRequest(request, response) {
        var pathname = url.parse(request.url).pathname;  
        console.log("Request for " + pathname + " received.");
    
        route(pathname);
    
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.write("Hello World");
        response.end();
      }
    
      http.createServer(onRequest).listen(8888);
      console.log("Server has started.");
    }
    
    exports.start = start;
    
    index.js
    var server = require("./server");
    var router = require("./router");
    
    server.start(router.route);