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

问题描述 投票:2回答:2

我正在构建一个节点应用程序,其中需要一个单词列表。 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]inside?

javascript json node.js require
2个回答
5
投票

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

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

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

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

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


1
投票

这是一种不好的做法吗?

不是真的,require有一个缓存所以它并不重要。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.