在NodeJS中的构造函数中使用`require`是不好的做法吗?

时间:2018-06-05 14:58:46

标签: javascript json node.js require

我正在构建一个节点应用程序,其中需要一个单词列表。 wordlist在JSON文件中,如下所示:

 { 
   "en":["foo", "bar"],
   "gr": ["foo", "bar"]
 }

JSON文件中的每个键代表不同的语言。

用户在创建对象时必须选择一种语言。所以我想在构造函数中导入JSON文件,如下所示:

const list = require('./config/lang.json')[lang]

其中lang是传递给构造函数的参数。

这是不好的做法吗?

我听说有人说您应该始终在代码的开头使用require。我应该在代码const list = require('./config/lang.json')的开头只需要整个内容,然后只在构造函数中提取所需的语言const wordlist = list[lang]吗?

2 个答案:

答案 0 :(得分:5)

即使代码的工作原理相同,也会缓存require次调用。在你的情况下,不需要对每个新实例进行额外的函数调用,因此执行以下操作会更快(在这种情况下不重要):

const langs = require('./config/lang.json');

class MyClass {
    constructor(lang) {
        const list = langs[lang];
    }
}

另一件需要注意的事情是,require是同步的,因此如果您的JSON特别大,那么第一次实例化MyClass时,事件循环将被阻止。在开始时使用它可能会在服务器(或者你正在做的任何事情)开始之前加载,所以require中的问题不会花费一些时间。

所以,是的,在我看来,require调用应该在顶部,除非你知道你在做什么,或者你正在加载动态依赖。

答案 1 :(得分:1)

  

这是一种不好的做法吗?

实际上,require有一个缓存,所以它并不重要。

  

我听说有人说你应该始终在代码的开头使用require。

是的,这是一个很好的做法,以便人们可以轻松发现依赖关系。

  

我应该在代码const list = require('./config/lang.json')的开头只需要整个内容,然后只在构造函数中提取所需的语言const wordlist = list[lang]吗?

是的,我会这样做。如果它是动态依赖项,我只会在构造函数中放置require,例如const wordlist = require( ./ config / lang / $ {lang} .json )