【问题标题】:Nodejs, require module from within a function, or at top of script. Which is better for custom modules?Nodejs,需要来自函数内部或脚本顶部的模块。哪个更适合自定义模块?
【发布时间】:2017-04-09 19:01:04
【问题描述】:

我正在编写一个自定义脚本,其中包含我所有常用的设置和功能。其中一个函数采用时间戳并使用 Moment 返回具有自定义格式的人类可读日期。

我的自定义脚本位于node_modules 文件夹中,例如,该文件名为settings.js。现在,我知道我可以使用

将它包含在我的任何脚本的顶部

var settings = require('settings.js);

并通过

获取我的功能

settings.timestamp_to_date(timestamp,function(date){console.log(date})

我不知道包含附加模块(时刻和时刻时区)的最佳位置。我现在将它们放在函数调用中,这样它们就不会加载到需要settings.js 文件的每个应用程序上。我的想法是它不会将该模块加载到不需要它的应用程序的内存中。

这让我想知道,对于可能经常使用此功能的应用程序,每次运行该功能时都需要模块,这本身似乎是一个糟糕的选择。

通过将所有功能放在一个文件中并仅在特定应用需要时为该功能加载所需模块,实现我所追求的目标的最佳选择是什么?

如果这意味着在每个应用程序中我必须在包含 settings.js 之前声明我要使用的模块,那么这并不理想。到目前为止,我的应用程序只是为自己学习应用程序。我目前创建的任何东西都不会被很多人使用。

低使用率应用的最佳选择是什么,以及可能在生产环境中高使用率的应用的最佳选择是什么?

【问题讨论】:

  • 我们应该忘记小的效率,比如说大约 97% 的时间:过早的优化是万恶之源。然而,我们不应该放弃那关键的 3% 的机会。
  • 总体上是好的哲学,谢谢。我对 node 还很陌生,并且真的不知道这些低效率可能会如何增长(成倍增长?)所以在某些情况下值得优化。

标签: javascript node.js require


【解决方案1】:

在搜索其他东西时偶然发现了这个http://justbuildsomething.com/node-js-best-practices/#2

它列出了在包含的脚本顶部而不是在函数中加载模块的几个很好的理由。

  1. Imagine you had a module that took 30 minutes to load, which is unreasonable, but just imagine. If that module is only needed in one route handler function it might take some time before someone triggers that route and Node.js has to require that module. When this happens the server would effectively be inaccessible for 30 minutes as that module is loaded. If this happens at peak hours several users would be unable to get any access to your server and requests will queue up.
  2. If the module you require causes an error and crashes the server you may not know about the error for several days, especially if you use this module in a rarely used route handler. No one wants a call from a client at 4AM telling them the server is down.

【讨论】:

    【解决方案2】:

    首先,关于您担心在函数内部需要模块是否会导致性能不佳,这不是问题。正如您在Node.js documentation 上看到的,每次您需要一个模块时,它都会被缓存。任何后续对该模块的 require 调用都将返回与第一次调用相同的引用。

    现在,我个人认为最好在文件顶部声明所有模块,因为它:

    1. 让您更容易知道何时需要有错误的模块(例如,崩溃)
    2. 使读者更容易了解模块的所有依赖关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-15
      • 2018-10-19
      • 2016-06-19
      • 1970-01-01
      • 2013-12-10
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多