2016-08-09 9 views
0

Sails JavaScriptアプリケーションでの次の宣言の影響は何ですか?Node.js - WebStorm intellisenseのmodule.exports宣言の効果

私はこれがWebStormのインテリセンスがグローバルのDataServiceとそのメンバーを認識することを可能にするという「ハック」であることを理解が、コードは最初の2行とないまったく同じように動作する?
var DataService = {}; 
module.exports = DataService; 

module.exports = { 
    // module code 
} 

Tks!

答えて

0

ショートお答えできません。

長い答え:

この恐ろしいハックはおそらく、どのようにコード関数内の任意の知覚の違いを作成しません。理論的には、新しいオブジェクトを作成します。これはメモリ内の領域を占有し、CPUサイクルを必要としますが、オプティマイザは、作成したオブジェクトをどこでも参照しない限り、コードの一部を削除します(I

は、より堅牢な方法であなたのライブラリを登録するhttps://www.jetbrains.com/help/webstorm/2016.1/configuring-javascript-libraries.html#configureを使用するようにしてください。)...

提案を推測しています。

アンはさておきインテリセンスについてJavaScriptでのJavaScriptについて理解することは本当にこの動作が原因Webstormためであると思われること

注ません はまだモジュール。 node.jsベースの プロジェクトの場合、明示的にエクスポートしない限り、インポートされたコンテキスト( DataService.jsなど)内で宣言されたものは、そのインポート(ファイル)にスコープされます。 ただし、SCRIPT タグのsrcファイルのでブラウザで実行されている同じコードは、グローバルコンテキストではになります。

アプリケーションにvar DataService = {}を宣言すると、WebStormはDataService変数をグローバルスコープに置いていると誤って認識します。つまり、参照される変数にメンバー(小道具/メソッド)を追加する他のファイルは、作成したDataServiceオブジェクト

複数のファイルが変数を宣言し、ファイルに作成したオブジェクトを上書きするため、変数がグローバルスコープで終了したとしても、この仮定は厳密には当てはまりません。 JavaScript intellisenseは、言語が非常にゆるやかに型付けされており、コードを実際に実行することなくオブジェクトのプロパティを実際に決定することができないため、常に推測が必要です。

一般に、ファイルまたはインデックス付きコードベースのどこかにあるDataServiceという名前の変数に対してメンバーを宣言すると、WebStorm(および他の多くのIDE)は、参照している変数の潜在的なメンバーとしてそれを呼び起こします。インテリセンスに依存して、JavaやC#のようなより静的に型付けされた言語のように、静的分析を通じてプロパティの存在を保証することはできません。

+0

すでにライブラリを登録しようとしましたが、これは実際にはハックが機能するためにも必要です。しかし、これらの2行なしでは、インテリセンスはありません。私は最初の質問に答えているので受け入れます。しかし、このハックのせいで、WebStormのIntellisenseがDataServiceタイプで動作するようになるのは、どんな種類の魔法ですか? – supafly

+0

あなたが変数として持っている__type__だけが 'object'であることを覚えておいてください。 Intellisenseは命名規則に基づいて推測されます。私は私の答えを更新しました – goofballLogic

0

まず、DataServiceという変数を定義し、それを空のオブジェクトと同じにします。その後、空のオブジェクトであるDataService変数の値をmodule.exportsオブジェクトに割り当てます。最後に、module.exportsオブジェクトは、空のオブジェクトで上書きされますが、直接定義されます。 2つのケースでは、オブジェクトは同じデータを持ち、空のオブジェクトであるため、同じ動作をします。

変数名DataServiceは、ローカル名前空間の空のオブジェクトへの参照として使用されます。 module.exportsオブジェクトに値を代入するのは、変数ではなく名前のデータを与えることです。たとえば、あなたはモジュールを使用したいと思うでしょうとき、あなたがそれを必要とします、

var dataService = require('./data-service'); 

DataServiceが目的であった場合、あなたはその性質

var example = dataService.example; 

しかし、あなたの場合にアクセスすることができ、dataServiceがあります空のオブジェクトであり、DataServiceオブジェクトではありません。 (理由オプティマイザの)おそらく

:だから

var example = dataService.DataService ; 
関連する問題