NodeJS入門4-モジュールシステム


このブログはCSNDとGithubでアクセスできます.
githubのブログアドレスを添付します.
Githubでは現在、JSの深いシリーズ読後感、NodeJSシリーズがあります.興味があれば、starを使ってみてもいいです.もちろん表現が間違っていたり、はっきりしないところがあれば、早速メッセージを残してください.私達はお互いに検討して、一緒に進歩します.
モジュールシステム
コンピュータプログラムの開発過程では、プログラムコードの書き込みが多くなるにつれて、ファイル内のコードはますます長くなり、維持が難しくなります.
保守可能なコードを作成するために、私達は多くの関数をグループ化して、それぞれ異なるファイルに入れます.このように、各ファイルに含まれるコードは比較的少ないです.多くのプログラミング言語はこのような組織コードの方式を採用しています.Node環境の中で、一つ.jsファイルをモジュールと呼びます.
モジュールを使うメリットは何ですか?
最大の利点は、コードのメンテナンス性を大幅に向上させることです.次に、コードの作成はゼロから開始する必要がない.モジュールの作成が終わったら、他のところから引用されます.私たちはプログラムを作る時に、Node内蔵のモジュールと第三者からのモジュールを含めて、他のモジュールもよく引用します.
Nodeでは、モジュールは三つに分けられます.
  • の有名なコアモジュール、例えば:fs、httpなど.
  • ユーザが自分で作成したファイルモジュール(JSファイル).
  • サード・モジュール.
  • art-template
  • npmでダウンロードした
  • Nodeにはグローバルスコープがありません.モジュールのスコープだけがあります.
  • 外部は内部にアクセスできず、内部は外部にアクセスできない.
  • 読み込み
    var         = require('  ')
    
    二つの役割:
  • はファイルモジュールをロードし、コードを実行します.
  • は、ロードされたファイルモジュールから導き出されたインターフェースオブジェクトを取得する.
  • requireの相対パスは./を追加しなければならないので、省略できません.
  • は、拡張子名
  • を省略することができる.
  • 相対パスはファイル名だけを書くと、Nodeはモジュール、グローバルモジュール、および現在のモジュールの下でhello.jsを順次検索します.エラーが発生する可能性があります.
  • module.js
       throw err;
             ^
    Error: Cannot find module 'hello'
       at Function.Module._resolveFilename**
       at Function.Module._load
       ...
       at Function.Module._load
       at Function.Module.runMain
    
    このエラーにあったら、チェックしてください.
  • モジュール名は正しく書かれていますか?
  • モジュールファイルが存在しますか?
  • 相対パスは正しいかどうか.
  • requireローディング規則
    まず例を見てみます.
    mainファイルはaとbファイルを導入して、aファイルはbファイルのため、mainファイルの実行結果は何ですか?
    結果は a b という原因は何ですか?
  • 実行順序
  • aファイルを導入し、aファイルは出力consoneを実行し、bファイルを導入して出力します.
  • 私達はbファイルを導入しました.この時、Nodeはすでにbをロードしたことを発見しました.キャッシュがあるかどうか確認してみます.優先的にキャッシュからロードします.重複して実行しません.
  • は、その中のインターフェースオブジェクトを取得する.
  • このようにする目的.
  • は、重複したローディングを回避し、モジュールローディング効率を向上させる.
  • 判定モジュール識別子
  • コアモジュール
  • サードパーティモジュール
  • 自分で書いた
  • ソリューション
  • 彼がコアモジュールではないなら、パス形式でロードします.
  • パス形式のモジュール判定
  • ./現在のディレクトリ(省略不可)…/前のディレクトリ(省略不可)
  • js拡張子名は、
  • を省略することができます.
  • コアモジュールであれば、(コアモジュールはすでにバイナリファイルに入っています.直接参照します.)
  • 第三者モジュールの場合、彼の検索規則は次の通りです.
  • は、まずnpmでダウンロードする必要があります.
  • 使用時にrequire('art-template')によってロードされます.
  • 1.現在のファイルの下のnode_を先に見つけます.modulesは「art-template」フォルダを探しています.
  • .node_を開く.modules/art-template/package.jsonは、main属性が指すファイルを探しています.
  • .index.jsファイルは実際の実行ファイルです.
  • もしmain内にエントリモジュールが指定されていない、またはpackage.jsonが存在しない場合、nodeは自動的にディレクトリのindex.jsファイルを探しに行きます.
  • 以上の条件が成立しないと、一級上のnode_に進みます.modulesディレクトリを再検索します.
  • は、現在のルートディレクトリが見つからないまで、エラーcan not find module xxxを報告します.
  • 私達は一つのプロジェクトがあります.一つのnode_しかありません.modulesはプロジェクトのルートディレクトリに置いて、すべてのサブディレクトリが第三者のパッケージを参照できるようにします.
  • エクスポート
  • Nodeは、モジュールのスコープであり、デフォルトファイルのすべてのメンバは、現在のファイルで有効であることを意味する.
  • すべてのファイルモジュールには、一つのオブジェクトが提供されています.exports.これはデフォルトの空のオブジェクトです.
  • は、アクセスしたいモジュールのメンバについて、exportsインターフェースオブジェクトにマウントする必要がある(属性となる).
  • 第一の方法(複数のメンバーをエクスポート)
    exports.foo = 123;
    exports.add = function (x, y) {
        return x + y;
    };
    exports.c = 'hello';
    exports.d = {name: 'jace',age : 21}
    
    ここには特殊なところがあります.aだけbの声明の関数addをもらいたいなら、bの中にexports = addと書いてもいいですか?
    答えは否定的であり、この時また第二の導出(暴露)方法を引き出した.
    第二の方法(例えば、文字列、関数)
    あるモジュールが直接にメンバを導き出す必要がある場合、マウントの方式ではなく、module.exports = addの方式を使用しなければならない.
    module.exports = add;
    
    ご注意ください以下の場合は****を上書きします.
    module.exports = 'hello';
    module.exports = function(){} //       
    
    exportsとmodule.exportsの違い
    私も初めてNodeに接触したので、サービスにも初めて接触しました.
  • 各モジュールには一つのmoduleオブジェクト
  • があります.
  • moduleオブジェクトの一つにexportオブジェクト
  • があります.
  • 私たちは、導出すべきメンバーをmodule.exportインターフェースオブジェクトにマウントすることができます.
  • の最初のマウント方式module.exports.xxx = xxxは面倒くさいです.Nodeは開発者のための配慮で各モジュールにexports
  • というメンバーを提供しています.
  • exports === module.exportsリセット
  • は、モジュールが単一のメンバを導出する必要がある場合には、module.exports = xxxの方式
  • を使用しなければならないことに注意してください.
  • exports = xxxこのような方法は無効です.exportsはmodule.exportsの引用にすぎません.exportsの割り当ては最終結果に影響がありません.
  • もしそうしたいなら、これを追加して引用関係を再構築してもいいです.
    たとえば:
    module.exports = {
       a: 123
    }//   
    
    exports = module.exports //    (        ) //   exports = {a: 123, foo: bar}
    
    exports.foo = 'bar //    (     )
    
    
    次の5 npmとpackage.jsonをクリックしてください.