【问题标题】:Should 'require()' be used locally or globally in NodeJS (ExpressJS)?'require()' 应该在 NodeJS (ExpressJS) 中本地使用还是全局使用?
【发布时间】:2016-11-04 19:04:13
【问题描述】:

我对使用 require() 在 ExpressJS 中导入包感到困惑。 我包括了一些包,例如nodemailer, bcryptjs 本地,即在函数内部对它们调用 require。所以,我不得不在一个路由文件中多次require他们。

一位同事建议所有require 语句应该只出现一次,要么在该路由文件的顶部,要么在app.js 文件中。我有点困惑。有人可以建议在中间件中require 软件包的最佳方式。

示例代码: 假设例如我需要在中间件功能中发送电子邮件。我有下面给出的代码:

var nodemailer = require("nodemailer");
                var mailTransport = nodemailer.createTransport();
                var mailOptions = {
                    from: constants.mail_sender_email,
                    to: constants.user_won_recipient_mails,
                    subject: templateContext.subject,
                    text: subject + ".\n",
                    html: results.html
                };

每次我需要发送电子邮件时,我都会再次使用require('nodemailer') 语句。我是否应该在该路由文件(即index.jsapp.js)中要求它一次? 但也有像require('ObjectID')这样的情况,使用频率不是很高。全球也需要这样的软件包会更好吗?

谢谢。

【问题讨论】:

  • 您的同事很可能是对的,但如果您不显示您的代码,我们无法确定舒尔。
  • 模块被缓存,因此多次包含某些内容不会影响性能。
  • @BetaRide 添加了一些示例代码。请检查这是否有助于解释我的问题。
  • @BenFortune 是的,并且认为我在需要时在本地使用相同的要求。但正如@str 所建议的那样,有一个论点是要求所有模块一次,然后继续使用它们。这让我很困惑。

标签: javascript node.js express


【解决方案1】:

require('requiredFile / requiredModule');返回文件的上下文并从 requiredFile 或 requiredModule 公开导出的模块。

如果你想在全局级别使用模块 require 并在 app.use() 中调用它,以便每次处理请求时都可以使用它。

但是,如果您想在本地对特定文件使用它,则需要在文件顶部使用它并将其缓存在变量中,然后在整个文件中使用该变量(类似于您在示例代码中编写的内容) )

【讨论】:

  • 感谢 Vishal 的解释。我还是有点困惑。假设,我有 3 个路由文件,在某些中间件中都需要 nodemailer。我应该在 app.js 中还是在每个路由文件的顶部定义它?
  • 如果您想在 3 个单独的文件中但在每个请求(作为中间件)中使用节点邮件程序,那么在单独的文件中要求它。例如,每个请求都必须使用一些身份验证模块,然后在 app.js 中将需要它。
【解决方案2】:

这里有一个例子。

http.createServer(yourCallback(req, res)
{
    if(req.Host == "a")
    {
        require("moduleA")(req, res);
    }else
    {
        require("moduleB")(req, res);
    }
}).listen(80);

在这种情况下,服务器将选择使用哪个模块。例如,您有多个主机,并且您通过 js 模块创建这些主机。所以你不需要将所有主机文件导入到应用程序中。完成后垃圾收集器将其带走。

如果你知道你会经常使用模块。然后你只需将其声明为全局模块。比如fs、http等

【讨论】:

  • 当我们希望代码决定在什么条件下需要哪个模块时,这很有用。对于文件的条件要求,这很好。
  • 感谢 Anton,但这解释了有条件地包含模块。虽然我的问题是我们是否应该更喜欢 require -ing 函数内部或路由文件顶部或 app.js 中的模块。
  • @MohitBhardwaj 没关系。风格偏好。它就像 C++ 中的命名空间。您要么使用全局命名空间调用,要么一直在使用前缀。同样在这里。模块被缓存,不会占用你的内存。
猜你喜欢
  • 2021-06-28
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 2012-01-18
  • 2012-06-25
  • 2010-10-21
  • 2018-04-13
  • 2015-09-05
相关资源
最近更新 更多