[Js]ノードモジュール

LiaoXuefengウェブサイトノート

モジュールを理解する

まず、hello.jsファイルを作成しました。このhello.jsファイルはモジュールであり、モジュールの名前はファイル名(.jsサフィックスを削除)であるため、hello.jsファイルはhelloという名前のモジュールです

hello.jsを変更し、関数を作成して、他の場所でこの関数を呼び出すことができるようにします。

'use strict';

var s = 'Hello';

function greet(name) {
    
    
    console.log(s + ', ' + name + '!');
}

module.exports = greet;

関数greet()はhelloモジュールで定義されています。最後の行は、他のモジュールが関数を使用できるように、関数greetがモジュールの出力として公開されることを意味しgreetます。
main.jsファイルを作成しgreethelloモジュールの関数を呼び出します

'use strict';

// 引入hello模块:
var greet = require('./hello');

var s = 'Michael';

greet(s); // Hello, Michael!

helloモジュールの導入では、ノードが提供するrequire関数を使用することに注意してください。

var greet = require('./hello');

インポートされたモジュールは変数として変数に保存されます。greet実際、変数greetはhello.jsでmodule.exports = greet;出力するために使用するgreet関数ですしたがって、main.jsはhello.jsモジュールで定義されたgreet()関数を正常に参照し、それを直接使用できます。
require()を使用してモジュールをインポートするときは、モジュールの相対パスに注意してください。main.jsとhello.jsは同じディレクトリにあるため、現在のディレクトリを使用します。

var greet = require( './ hello'); //相対ディレクトリを書き込むことを忘れないでください!
モジュール名のみを書き込む場合:

var greet = require('hello');

次に、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

このエラーが発生した場合は、以下を確認する必要があります。

  • モジュール名が正しく記述されているかどうか。
  • モジュールファイルが存在するかどうか。
  • 相対パスが正しく記述されているかどうか。

CommonJS仕様

このモジュールロードメカニズムは、CommonJS仕様と呼ばれます。この仕様では、各.jsファイルはモジュールであり、その中で使用される変数名と関数名は互いに競合しません。たとえば、hello.jsとmain.jsはどちらもグローバル変数を宣言しますがvar s = 'xxx'、互いに影響はありません。

モジュールが変数を外部に公開したい場合(関数は変数でもあります)、それを使用できますmodule.exports = variable;。モジュールが他のモジュールによって公開された変数を参照する必要がある場合、モジュールを参照する変数var ref = require('module_name');を取得できます。

結論として

モジュール内で変数を外部に出力するには、次を使用します。

module.exports = variable;

出力変数は、任意のオブジェクト、関数、配列などにすることができます。
他のモジュールによって出力されたオブジェクトをインポートするには、次を使用します。

var foo = require('other_module');

インポートされる特定のオブジェクトは、インポートされたモジュールによって出力されるオブジェクトによって異なります。

深い理解

ノードは最初にオブジェクトを準備できますmodule

// 准备module对象:
var module = {
    
    
    id: 'hello',
    exports: {
    
    }
};
var load = function (module) {
    
    
    // 读取的hello.js代码:
    function greet(name) {
    
    
        console.log('Hello, ' + name + '!');
    }
    
    module.exports = greet;
    // hello.js代码结束
    return module.exports;
};
var exported = load(module);
// 保存module:
save(module, exported);

つまり、変数moduleは、jsファイルをロードする前にNodeによって準備され、ロード関数に渡される変数です。この変数をhello.jsmodule直接使用できる理由は、実際には関数のパラメーターであるためです。module.exports = greet;

パラメータmoduleload()関数に渡すことにより、hello.jsは変数をノード実行環境に正常に渡し、ノードはmodule変数をどこかに保存します。

Nodeはインポートされたすべてを格納moduleするrequire()ためmodule、時間取得したら、対応するNodeを見つけますmodule。これmoduleexports変数の戻り値であり、別のモジュールがスムーズな出力モジュールを取得します。

var greet = require('./hello');

module.exports和exports

キー値オブジェクト{}を出力する場合は、exportsこの既存の空のオブジェクト{}を使用して、新しいキー値オブジェクトを追加し続けることができます。

関数または配列を出力module.exportsする場合は、オブジェクトに直接割り当てる必要があります。

したがって、結論を導き出すことができます。直接module.exports割り当ては、あらゆる状況に対処できます。

module.exports = {
    
    
    foo: function () {
    
     return 'foo'; }
};

または:

module.exports = function () {
    
     return 'foo'; };

最後に、モジュール変数を出力する方法強くお勧めmodule.exports = xxxします。これにより、1つのメソッドのみを記憶する必要があります。

おすすめ

転載: blog.csdn.net/qq_45617555/article/details/108270060