2017-05-19 7 views
0

私は私の質問を引き出したプロセスを通してあなたを導きます。JavaScriptクラスは受け入れ可能ですかノードモジュールですか?

私はノードでCLIアプリケーションに取り組んでいると私はこのパターンを使用して、私のビジネスロジックをカプセル化するオブジェクトを使用しています:

// my-project/lib/widget/myobject.js 

var MyObject = function(x) { 
    this.x = x; 
}; 

MyObject.prototype.getX = function() { 
    return this.x; 
}; 

module.exports = MyObject; 

私はまた、これらのオブジェクトをテストしています:

// my-project/test/lib/widget/myobject.spec.js 

var MyObject = require('../../../lib/widget/myobject.js'); 

describe('MyObject', function() { 
    ... 
}); 

私は選択した名前とディレクトリ構造に不満を抱いていました。相対パスを書き換えるときに、いくつかのスペックファイルで親ディレクトリの参照(..)を退屈に数えていることが分かりました。私は、これらのオブジェクト定義を含むルートディレクトリを参照する簡単な方法がなければならないと考えました。

hereの推奨事項の1つに、「アプリケーション固有のモジュールをnode_modulesに入れる」ことが示唆されています。

私はモジュールを理解しているので、npmからダウンロードして自分のプロジェクトで使用するパッケージです。彼らはrequireを呼び出すと私にエクスポートされた単一のAPIを持つ有用なもののライブラリを含んでいます。これは、アプリケーションの内部使用のために特別に構築された単純な単一目的のクラスを表示する方法ではありません。

これまで私と付き合っていれば、ありがとう!

私のアプリケーションの内部をよりモジュラーにして、オブジェクト指向のままでノードモジュールシステムの意図に従って適切にするにはどうすればよいですか?

+0

オブジェクトで作業しているノードでは、通常はアセットフォルダから格納してインポートするだけです。多くのことは、私の専門知識の範囲外の環境設定、ビルドツール、および配置に依存します。 node_modulesメソッドか、スタティック・アセットをインポートできるアセット・フォルダだけで、うまく動作します(しかし、npmアセットを独自のものと混ぜることはお勧めしません)。 –

+0

あなたはそうです、それは静的資産フォルダのようですが、Nodeがモジュールを探すデフォルトの場所であるという利点があります。それが私にとってのドローです。 require( '../../../ lib/widget/myobject.js')の代わりにrequire( 'myobject')を使用しています。私の不安は、あなたが次に述べたこととまったく同じです。パブリックモジュールとプライベートモジュールを混在させることです。それが私の質問を促したのです。私は基本的に「私はこれをやっていますか、それともこれらのオブジェクトでより意味をなさない他の大会がありますか」と尋ねています。ミキシングは本当にクルージングと感じます。 – jkeeler

答えて

0

私は、これは生産のためか、配布ではなく、あなたがこれを追加することができ、あなたのメインのファイルに予定のモジュールのためにどのように適してわからない:あなたは常にフォルダへの相対的なモジュールを必要聞かせ

process.env.NODE_PATH = __dirname; 
require('module').Module._initPaths(); 

あなたのメインファイルを含んでいます。私。あなたがファイルを持っていた場合:

library/some_file.js 

その後、tests/some_other_file.jsであなただけ行うことができます:

require('library/some_file'); 

それとも、あなたのメインファイルでこれを追加することができ、代替として:

global.__base = __dirname + '/'; 

と他のモジュールでは次のものを使用する必要があります:

var MyObject = require(__base + 'my-project/lib/widget/myobject'); 
+0

はい!私はこれらの解決策も見つけました。私はすぐにNODE_PATHソリューションをディスカウントしました。なぜなら、私が提供したリンクのステートメントのためです。「ノードとブラウザーの両方でサポートされていますが、$ NODE_PATHの使用を阻止しています。 – jkeeler

+0

(私が間違っていれば私を訂正してください)また、この解決策は私のテストランナーと一緒に働くとは思いません。スペックファイルはクラス定義のjsファイルしか必要としないので、main.jsからパスを取得することはできません – jkeeler

関連する問題