2016-08-09 40 views
0

Welche Auswirkungen hat die folgende Deklaration in einer JavaScript-Anwendung von Sails?Node.js - Auswirkungen der doppelten Deklaration von module.exports für WebStorm intellisense

var DataService = {}; 
module.exports = DataService; 

module.exports = { 
    // module code 
} 

Ich verstehe, das ist ein „Hack“, Das ermöglicht WebStorm intellisense Dataservice und seine Mitglieder weltweit zu erkennen, aber der Code verhält sich genau das gleiche mit und ohne die zwei ersten Zeilen?

Tks!

Antwort

0

Kurze Antwort:

Wahrscheinlich (wegen der Optimierer).

Lange Antwort:

Dieser schreckliche Hack wahrscheinlich keine wahrnehmbaren Unterschiede, wie die Code-Funktionen erstellen. Theoretisch erstellen Sie ein neues Objekt, das Speicherplatz im Speicher belegt und einige CPU-Zyklen kostet, aber der Optimierer wird wahrscheinlich diesen Teil des Codes einfach ignorieren, solange Sie das erstellte Objekt nirgends referenzieren (I ist zu raten ...)

Vorschlag:

Try https://www.jetbrains.com/help/webstorm/2016.1/configuring-javascript-libraries.html#configure zu benutzen, um Ihre Bibliothek in einer robusteren Art und Weise zu registrieren.

Exkurs über Intellisense in Javascript

Beachten Sie, dass dieses Verhalten scheint auf WebStorm nicht wirklich Verständnis über JavaScript-Module noch zu sein. Bei einem auf node.js basierenden Projekt wird alles, was innerhalb eines importierten Kontexts deklariert wurde (wie DataService.js), auf diesen Import (Datei) beschränkt, es sei denn, Sie exportieren es explizit. Das gleiche Stück Code, der im Browser in einem SCRIPT Tag src-Datei, läuft, würde im globalen Kontext enden.

Wenn Sie var DataService = {} in Ihrer Anwendung zu erklären, geht davon aus WebStorm falsch, dass Sie die Data Variable in globalen Bereich platzieren, was bedeutet, dass jede andere Datei, die Mitglieder (Requisiten/Methoden) an die referenzierten Variablen als Mitglieder der würde am Ende fügt DataService-Objekt, das Sie erstellt haben.

Sie werden feststellen, dass diese Annahme nicht streng zutreffend wäre, selbst wenn die Variable im globalen Gültigkeitsbereich gelandet wäre, weil mehr als eine Datei die Variable deklarieren würde und somit das in Ihrer Datei erstellte Objekt überschreiben würde. JavaScript intellisense ist immer etwas rätselhaft, weil die Sprache sehr locker geschrieben ist und die Eigenschaften eines Objekts nicht wirklich bestimmt werden können, ohne den Code tatsächlich auszuführen. Wenn Sie ein Element in einer Datei oder gegen eine Variable mit dem Namen DataService irgendwo in der indizierten Codebasis deklarieren, wird WebStorm (und die meisten anderen IDEs) es als potentielles Mitglied der Variablen, auf die Sie verweisen, anzeigen. Sie können sich nicht darauf verlassen, dass intellisense das Vorhandensein einer Eigenschaft durch statische Analyse garantiert, wie Sie es in einer statischeren Programmiersprache wie Java oder C# tun würden.

+0

Ich habe bereits versucht, die Bibliothek zu registrieren, das ist auch erforderlich, damit der Hack funktioniert. Aber ohne diese 2 Zeilen, keine Intellisense. Ich werde akzeptieren, weil die erste Frage beantwortet wird. Aber mit welcher Art von Magie beginnt Webstorm intellisense aufgrund dieses Hacks mit DataService-Typ zu arbeiten? – supafly

+0

Denken Sie daran, dass der einzige __type__, den Sie für Ihre Variable haben, "Objekt" ist. Intellisense basiert auf Namenskonventionen. Ich habe meine Antwort aktualisiert – goofballLogic

0

Zuerst definieren Sie eine Variable mit dem Namen DataService, und Sie erhalten ein leeres Objekt. Danach weisen Sie dem Objekt module.exports den Wert der Variablen DataService zu, die ein leeres Objekt ist. Schließlich überschreiben Sie das Objekt module.exports mit einem leeren Objekt, das jedoch direkt definiert ist. Es wird dasselbe Verhalten haben, da in beiden Fällen das Objekt dieselben Daten hat, was ein leeres Objekt ist.

Der Variablenname DataService wird als Verweis auf das leere Objekt im lokalen Namespace verwendet. Weisen Sie dem Objekt module.exports einen Wert zu, geben Sie ihm die Daten der Variablen und nicht den Namen. Zum Beispiel, wenn Sie das Modul nutzen wollen, werden Sie es benötigen,

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

Wenn DataService ein Objekt wurde, dann könnte man seine Eigenschaften zugreifen

var example = dataService.example; 

Aber in Ihrem Fall dataService ist direkt ein leeres Objekt, kein DataService Objekt. So kann man nicht

var example = dataService.DataService ; 
Verwandte Themen