Node.jsのモジュールロードメカニズムとモジュールオブジェクトexports

3715 ワード

モジュールとは
ノードのためにjsのファイルは互いに呼び出すことができます.jsはモジュールシステムを提供する.
モジュールはノードです.jsアプリケーションの基本的な構成部分であり、ファイルとモジュールは一つ一つ対応しています.つまり、ノードです.jsファイルはモジュールであり、JavaScriptコード、JSON、またはコンパイルされたC/C++拡張である可能性があります.
ノードのモジュール区分:
ノードのモジュールは、コアモジュール、ファイルモジュール、カスタムモジュール(非コアモジュール)に分けられます.
ノードにモジュールを導入するには、3つのステップが必要です.
(1)経路解析
(2)ファイルの配置
(3)コンパイル実行
コアモジュール:ノードソースのコンパイル中にバイナリコードにコンパイルされ、ノードプロセスが開始されると、一部のコアモジュールがメモリにロードされるため、コアモジュールが導入されると、ファイルの位置決めとコンパイルの実行は無視でき、ロード速度が最も速い.
ファイルモジュール:実行時に動的にロードし、完全なパス解析、ファイルの位置決め、コンパイル実行の3ステップが必要で、コアモジュールより遅い.
カスタムモジュールの速度が遅い理由:ロード中、ノードはターゲットファイルが見つかるまでモジュールパスのパスを1つずつ検索し、ファイルパスが深いほど時間がかかります.
二次ロード:require()モジュールを二次ロードする場合はキャッシュ優先のロード方式が採用されます.キャッシュ・ロードの優先ポリシーにより、二次ロードはパス分析、ファイルの位置決め、実行プロセスのコンパイルを必要とせず、二次ロードの効率が向上します.
Node.jsのモジュールロードメカニズム:
1.絶対パス:
require('/home/liyabin/WebstormProjects/untitled/try.js');

2.相対パス:
 require('./try.js');//    require('try.js'),     node      ,   node-modules。

注:require('./try')などのファイル接尾辞名を書かない場合は、ファイル検索メカニズムに関連します.
1>まずロードモジュールのファイル名に従って検索し、見つからない場合はモジュールファイル名の後に付ける.jsの接尾辞を検索します.
2>見つからない場合は、モジュールファイル名の後に付ける.jsonの接尾辞、検索を行います.
3>まだ見つからない場合は、モジュールファイル名の後に付ける.nodeの接尾辞、検索を行います.
4>最後に見つからない場合は、エラーメッセージが表示されます.
上記を総合する、Node.jsのファイル検索メカニズムは次のとおりです.
ファイル名->js   ->   .json   ->   .node
モジュールオブジェクト:exports
1つのモジュールでvarによって定義された変数で、その役割ドメイン範囲は現在のモジュールであり、外部は直接アクセスできません.1つのモジュールが別のモジュールで定義された変数にアクセスできるようにするには、次の方法があります.
1>変数をglobalオブジェクトの1つの属性とする(推奨しない)
カスタムモジュール:
global.a  = 100;

ファイルモジュール:
require('/home/liyabin/WebstormProjects/untitled/try.js');
console.log(a);

コンソールにコマンドを入力:nodeファイルモジュールファイル名
出力結果は100
2>モジュールの役割ドメインには、exportsというモジュールオブジェクトが内蔵されています.(単一出力変数)
カスタムモジュール:
var num = 100;
var str = "Hello node";
exports.price = num;
exports.name = str;
exports.myFunction = function () {
    console.log("Hello world");
};

ファイルモジュール:
var m = require('/home/liyabin/WebstormProjects/untitled/try.js');
console.log(m);

印刷出力:
{ price: 100, name: 'Hello node', myFunction: [Function] }

上記の書き方はexportsオブジェクトを何度も使うので面倒です.
3>moduleを通過する.exportsオブジェクトは、1つのモジュール内の複数のローカル変数にアクセスします.(一括出力オブジェクトのプロパティとメソッド)
カスタムモジュール:
var num = 100;
var str = "Hello node";
var f = function (){
    console.log("Hello");
};
module.exports = {
    price:num,
    name:str,
   myFunction:f
};


ファイルモジュール:

var m = require('/home/liyabin/WebstormProjects/untitled/try.js');
console.log(m);

ps:require()メソッドの戻り値はカスタムモジュールのmoduleである.exports.
プログラムの実行結果は次のとおりです.
{ price: 100, name: 'Hello node', myFunction: [Function: f] }

 
もう一つmoduleexportsとexportsの関係の2つの例:
例1:
カスタムモジュール:
exports.printHelloworld = ()=>{
    console.log('Hello world');
}

ファイルモジュール:
var m = require('/home/liyabin/WebstormProjects/untitled/router.js');
m.printHelloworld();

nodeファイルモジュールを実行するには、次の手順に従います.
コンソールにHello Worldを出力します.
例2:
カスタムモジュール:
function printHello(){
    console.log("Hello");
}
module.exports = printHello;

ファイルモジュール:
var m = require('/home/liyabin/WebstormProjects/untitled/router.js');
m();

注意:
义齿exportsオブジェクトは実は同じオブジェクトを指しています.moduleを破壊しないでください.exportsとexportsの間の参照関係、