web-dev-qa-db-ja.com

node.js標準モジュールのグローバル変数?

グローバル変数が悪いことは知っています。

しかし、フレームワークの40個のファイルでノードのモジュール「util」を使用している場合、次のようにグローバル変数として宣言する方が良いとは言えません。

util = require('util');

その行を40ファイルで記述するのではなく、index.jsファイルで?

原因は、各ファイルで同じ5〜10個のモジュールを頻繁に使用することです。これにより、常にコピーペーストするのではなく、多くの時間を節約できます。

この場合、DRYいいですか?

54
ajsie

各モジュールは独立していることになっています。とにかく、モジュールごとに最初の要求の後、requireは何もかかりません。

1つのモジュールだけをテストしたい場合はどうしますか?アプリに必要な「グローバル」な要件を認識しないため、多くの問題が発生します。

はい、この場合でもグローバルは悪いです。グローバルはほぼ常に破産します。テスト容易性、カプセル化、保守の容易さ。

2012年1月の回答を更新

globalオブジェクトは、各モジュール内でグローバルになりました。したがって、モジュール内のグローバル変数(スコープなし)に割り当てるたびに、そのモジュールのglobalオブジェクトの一部になります。

したがって、globalオブジェクトはまだglobalではなく、そのままでは使用できません。

2012年12月更新

globalオブジェクトは、アプリケーション内にグローバルスコープを持ち、すべてのモジュールからアクセスする必要があるデータ/関数を格納するために使用できます。

43
Tor Valamo

ただ共通のモジュールを持つことができます。

common.js:

Common = {
  util: require('util'),
  fs:   require('fs'),
  path: require('path')
};

module.exports = Common;

app.js:

var Common = require('./common.js');
console.log(Common.util.inspect(Common));
102
Robin Duckett
global.util = require('util');

ノードのドキュメント には、グローバルオブジェクトに関するセクションがあります。

ただし、グローバルは注意して使用する必要があります。モジュールをグローバルスペースに追加すると、テスト容易性とカプセル化が低下します。ただし、この方法を使用しても問題ない場合があります。たとえば、ユニットテストスクリプト内で使用する関数とオブジェクトをグローバル名前空間に追加します。

25
summatix

私はこのスレッドの答えに混乱しています。

私はこれを行うことができます...

ファイル:test.js

global.mytest = {
    x: 3,
    y: function() { console.log('Works.'); }
};

ファイル:test2.js

console.log('Does this work?');
mytest.y();

ファイル:server.js

require('test.js');
require('test2.js');

そして、それは質問が必要とするように機能するようです。最初のrequireはmytestオブジェクトをグローバルスコープに配置し、次に2番目のrequireは他の修飾子なしでそのオブジェクトにアクセスできます。

私はこれを理解しようとしていました(Google検索からこのスレッドに到達しました)。元の答えから物事が変わったのかもしれません。

20
Dustin Graham

構成オブジェクトを渡すためにprocessオブジェクトを使用しました。理論上は上記とまったく同じ問題(カプセル化、テスト可能性など)に悩まされますが、非状態変更プロパティ(基本的にプリミティブを持つハッシュテーブル)のみを使用する場合は正常に機能します。

0
tedeh