Node.js - 为WebStorm intellisense声明module.exports两次的影响

时间:2016-08-09 15:44:19

标签: javascript node.js module sails.js webstorm

以下声明在Sails JavaScript应用程序中有什么影响?

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

module.exports = {
    // module code
}

我知道这是一个" hack"这允许WebStorm intellisense全局识别DataService及其成员,但是在有和没有2个第一行的情况下,代码的行为是否完全相同?

韩国社交协会!

2 个答案:

答案 0 :(得分:0)

首先,定义一个名为DataService的变量,并将其等于空对象。之后,您将module.exports对象分配DataService变量的值,该变量是一个空对象。最后,您再次使用空对象覆盖module.exports对象,但直接定义。它将具有相同的行为,因为在这两种情况下,对象具有相同的数据,这是一个空对象。

变量名DataService用作对本地名称空间中空对象的引用。为module.exports对象赋值给它提供变量的数据,而不是名称。例如,当您想要使用该模块时,您将需要它,

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

如果DataService是一个对象,那么您可以访问其属性

var example = dataService.example;

但在你的情况下,dataService直接是一个空对象,而不是DataService对象。所以你不能

var example = dataService.DataService ; 

答案 1 :(得分:0)

简短回答:

可能(因为优化器)。

答案很长:

这个可怕的黑客可能不会在代码如何运作方面产生任何明显的差异。从理论上讲,您创建了一个新对象,它会占用内存空间并占用一些CPU周期,但只要您不在任何地方引用创建的对象,优化器很可能只会忽略该部分代码。 (我猜...)

建议:

尝试使用https://www.jetbrains.com/help/webstorm/2016.1/configuring-javascript-libraries.html#configure以更强大的方式注册您的库。

  

关于javascript中的intellisense

     

请注意,此行为似乎是由于Webstorm并非如此   了解JavaScript模块。对于基于node.js的   项目,在导入的上下文中声明的任何内容(如   除非您明确导出,否则DataService.js)的范围限定为该导入(文件)。   但是,同一条代码,在SCRIPT中的浏览器中运行   标记src文件,以全局上下文结束。

     

当您在应用程序中声明var DataService = {}时,WebStorm错误地假定您将DataService变量放入全局范围,这意味着将任何其他成员(props / methods)添加到引用变量的文件将最终为您创建的DataService对象的成员。

     

您会注意到,即使变量最终在全局范围内,这个假设也不会严格为真,因为多个文件会声明变量,从而覆盖您在文件中创建的对象。 JavaScript intellisense总是涉及一些猜测,因为语言的类型非常松散,并且在不实际执行代码的情况下无法确定对象的属性。

     

通常,如果您在文件中声明成员或在索引代码库中的某处声明名为DataService的变量,WebStorm(以及大多数其他IDE)会将其作为变量的潜在成员提出引用。您不能依靠智能感知通过静态分析来保证属性的存在,就像在Java或C#等更静态类型的语言中一样。