2016-02-15 10 views
6

明示的な相対パス(../../../lib..)なしでモジュール内の他のディレクトリを簡単に参照できますか?ノードモジュール内で「グローバル」変数を共有するにはどうすればよいでしょうか?

私はノードモジュールを作成しています。モジュールに再利用したいいくつかのグローバルなものがあります。
ほとんどの場合、モジュールのルートパスを 'グローバル'に設定したいので、多くの相対パスを使わずに簡単に他のソースを呼び出すことができます。../../などです。それは混乱したコードを引き起こす可能性があり、プロジェクト構造が変更された場合、それを間違ったり間に合わせたりするのは簡単です。

だから私はオプションin that postと(例えばルート・パスを与えるモジュールなど - app-module-pathrootpathrfrなど)物事のこれらの種類に対処するためのいくつかの他のライブラリをたくさん見てきたが、それらはすべてベースを参照してください。プロジェクト/アプリケーションであり、他の人が使用しているモジュールではありません。

グローバルを設定することは悪い考えです。環境変数もあまり良い考えではないことを理解しました。

そのことの良い習慣はありますか?たぶん私は見つけたり聞いたりしていないことがあります。

は、ここに私が探しているものを私は避けるようにしようとしているものの例だと、すべての

// avoid things like that: 

// ./lib/something/forthat/doit.js 
var config = require('../../../config/project/type1/config.js'); 

// ./config/project/type1/config.js 
module.exports = { 
    msg: 'hi' 
}; 


// find somethings like that: 
// when the root path/require can be found in every location of the module 
// and is relative to my app and not the app using my module. 

// ./lib/something/forthat/doit.js 
var config = require(rootPath + 'config/project/type1/config.js'); 
// OR 
var config = rootRequire('config/project/type1/config.js'); 
// OR anything else 

// ./config/project/type1/config.js 
module.exports = { 
    msg: 'hi' 
}; 

答えて

0

まず.....相対パスが全く混乱を作成しません。むしろあなたはそれを乱雑にすることができます(あなたが望むならば)、それはベストプラクティスとみなされます。しかし、私もあなたを理解することができます。それは非常に乱雑なコードが好きではないということです。したがって、このような状況では、静的コンテンツとしてコードの一部を提供する必要があります。したがって、非常に簡単なログインテーリングパスを使用してアクセスできます。しかし、この方法を覚えておくことは、相対パスの提供に代わるものです。

+0

あなたは混乱/乱雑さについて正しいです、それは私が意味するもののようなものです。私はあなたの提案を理解していませんでした。あなたが何を意味するのか少し例を挙げてもらえますか?それは私が明確にすることを意味している:https://jsfiddle.net/fzhqf4of/ – arieljannai

1

現在のディレクトリパスを取得するには、グローバル変数__dirnameをnodejsプロジェクト内のどこにでも使用できます。例:console.log(__dirname)これをプロジェクトの任意のファイルに書き込み、コンソールは現在のディレクトリパスを文字列として出力します。 または、あなたはexpress sessionモジュールを使うことができます。

var express = require('express'); 
var session = require('express-session'); 
var app = express(); 
app.use(session({myVar: 'abc'})); 
app.get('/',function(req,res){ 
var sess = req.session; 
console.log(sess); 
}); 
+0

それはまだ問題を解決しません。 '__dirname'は私に現在実行中のファイルのパスを与えますので、プログラムの起動時にファイルを保存できますが、まだ変数を共有する良い解決策はありません(ファイルは良いオプションではありません) – arieljannai

+0

はい変数とプロトタイプを含むファイルを作成することをお勧めします。新しいオブジェクトを作成して、そのオブジェクトのプロパティやメソッドをプロジェクトのどこにでも使用して、そのオブジェクトにアクセスできます。 –

+0

ああ、私はあなたが外部ファイルに書き込むことを意味していると思った。 'global'スコープでそれらを設定することを意味しますか? (global.myRootPath?)、またはこの変数ファイルをすべてのファイルに必要としますか? – arieljannai

関連する問題