1. ホーム
  2. ジャバスクリプト

[解決済み】CommonJsモジュールシステムのmodule.exportsとexportsの違いについて

2022-03-27 18:50:42

質問

このページでは( http://docs.nodejitsu.com/articles/getting-started/what-is-require ) によると、"exports オブジェクトを関数または新しいオブジェクトに設定したい場合は、module.exports オブジェクト." を使用する必要があります。

質問はその理由です。

// right
module.exports = function () {
  console.log("hello world")
}
// wrong
exports = function () {
  console.log("hello world")
}

その結果をconsole.logしたところ( result=require(example.js) ) であり、最初のものは [Function] は、2番目の {} .

その理由を説明していただけませんか?こちらの投稿を読みました。 Node.jsにおけるmodule.exportsとexportsの比較 . 参考になるのですが、なぜそのような設計になっているのかが説明されていません。exportsの参照を直接返した場合、問題はないのでしょうか?

解決方法は?

module は、プレーンなJavaScriptオブジェクトで exports プロパティがあります。 exports は、プレーンなJavaScript変数で、たまたま module.exports . ファイルの最後に、node.jsは基本的に'return'します。 module.exports から require 関数を使用します。NodeでJSファイルを表示する簡便な方法は、次のようになります。

var module = { exports: {} };
var exports = module.exports;

// your code

return module.exports;

にプロパティを設定すると exports のように exports.a = 9; を設定することになります。 module.exports.a というのも、JavaScriptではオブジェクトは参照として渡されるため、複数の変数を同じオブジェクトに設定すると、それらのオブジェクトは はすべて同じオブジェクトです。 exportsmodule.exports は同じオブジェクトです。

しかし、もし exports を何か新しいものに設定すると、それはもう module.exports ということで exportsmodule.exports はもはや同じオブジェクトではありません。