0

これは Node で遊ぶ 2 回目の週末なので、少し初心者です。

JavaScript が提供しないものを提供する一般的なユーティリティでいっぱいの js ファイルがあります。大きく切り取ると、次のようになります。

module.exports = {
    Round: function(num, dec) {
        return Math.round(num * Math.pow(10,dec)) / Math.pow(10,dec);
    }
};

他の多くのカスタム コード モジュール (これも require() ステートメントを介して含まれます) は、ユーティリティ関数を呼び出す必要があります。彼らは次のように呼び出します。

module.exports = {
    Init: function(pie) {
        // does lots of other stuff, but now needs to round a number
        // using the custom rounding fn provided in the common util code
        console.log(util.Round(pie, 2)); // ReferenceError: util is not defined
    }
};

実際に実行される node.js ファイルは非常に単純です (まあ、この例では)。次のように、コード内に require() を記述して、カスタム コードの Init() fn を開始するだけです。

var util = require("./utilities.js");
var customCode = require("./programCode.js");

customCode.Init(Math.PI);

これは機能しません。customCode から「ReferenceError: util is not defined」というメッセージが表示されます。必要な各ファイルのすべてが「プライベート」であることはわかっています。これがエラーが発生する理由ですが、ユーティリティコードオブジェクトを保持する変数がどこかに保存される必要があることも知っていますglobal

検索しましたが、そこglobalには参照がありませんでしたutilsglobal.utils.Roundカスタムコードのようなものを使用することを考えていました。

問題は、ユーティリティ コードが実際には何か (var u、util、または utility) として参照される可能性があることを考えると、他のコード モジュールがこれらのユーティリティを参照できるように、これをどのように整理すればよいかということです。

4

1 に答える 1

5

これを解決するには、少なくとも 2 つの方法があります。

  1. ファイル内の別のモジュールから何かが必要な場合は、それを必要とします。それは簡単なことです。
  2. 実際にモジュールをビルドするものを提供してください。これについてはすぐに説明します。

ただし、node.js モジュール システムは、他の言語から期待されるようにグローバルを提供しないため、現在のアプローチは機能しません。エクスポートされたものを除いてmodule.exports、必要なモジュールからは何も得られず、必要なモジュールは必要な環境について何も知りません。

requireそれだけ

上記のギャップを回避するには、事前に他のモジュールを要求する必要があります。

// -- file: ./programCode.js
var util = require(...);

module.exports = {
    Init: function(pie) {
        console.log(util.Round(pie, 2));
    }
};

requires はキャッシュされるため、この時点ではパフォーマンスについてあまり考えないでください。

柔軟性を保つ

この場合、モジュールの内容を直接エクスポートしません。代わりに、実際のコンテンツを作成するコンストラクターを提供します。これにより、別のバージョンのユーティリティ ライブラリなど、いくつかの追加の引数を指定できます。

// -- file: ./programCode.js
module.exports = {
    create: function(util){
      return {
        Init: function(pie) {
          console.log(util.Round(pie, 2));
        }
      }
    }        
};

// --- other file

var util     = require(...);
var myModule = require('./module').create(util);

ご覧のとおり、 を呼び出すと、新しいオブジェクトが作成されますcreate。そのため、最初のアプローチよりも多くのメモリを消費します。ということで、ちょうどいいものにオススメですrequire()

于 2013-09-21T18:56:45.960 に答える