节点:需要模块内部功能

Node: requiring module inside function?

本文关键字:内部 功能 模块 节点      更新时间:2023-09-26

我正在Node中浏览命令行实用程序的源代码,并看到了以下代码。

function help() {
    var colors = require('colors');
    var package = require('../package');
    ....
    ....
}

我以前从未见过需要以这种方式在函数中使用。我一直认为最佳做法是将其包含在文件的顶部。这是此程序的入口文件,此函数仅在特定情况下调用 - 但这些包在程序的其他位置使用。当我向代码作者询问他的理由时,他只是说他"不想一次导入所有库"。

这是好做法还是坏做法?不需要在模块顶部使用这些包,而仅在调用这些函数时,对加载时间是否有重大影响?

更新:我认为更好的答案在这里:节点中的延迟加载.js

我最初的评论:好吧,这是一个练习问题,有些人喜欢顶部,而有些人喜欢懒惰加载。在我看来两者都很好,应该根据需要使用,所以我认为作者就在这里,因为在启动时加载一大堆库会使模块过载许多从未使用过的东西,因此会增加加载时间。尽管按需加载库是一种同步操作,但如果我们将help方法视为实体,那么它将产生异步模块加载效果(请参阅 AMD,这是一种流行的模式)。

如果您必须在特定情况下加载哪些库之间进行选择,延迟加载也是一个不错的选择,例如

var isOSX;
// some code here which finds if this is OSX
// then this
if (isOSX === true) {
  var platformHelper = require('supercoolosxhelper');
} else {
  var platformHelper = require('yetanothercoolhelper');
}
简而言之,您应该在

代码中预测使用方法的概率是否高甚至中等,那么您应该在顶部要求,否则如果它很低,那么如果模块是根据需要required的,那就太好了。

在 Node 的情况下,它实际上主要归结为一种风格选择。

从磁盘加载模块几乎不需要任何时间,因此在性能提升方面实际上没有任何内容。 有些人喜欢将模块保持在接近使用它们的位置,仅此而已。

现在,客户端,它完全不同,并且在很大程度上基于您的包管理器。

它有自己的优点和缺点。但一般来说,你应该避免它。这里有一个很好的解释为什么:

第一种情况:假设我只有模块 a.js 和 b.js。模块 a.js需要 B.js 模块 B.js需要 C.js。如果他们要求在模块顶部,当我启动我的应用程序时,我会收到警报找不到模块 C.js,服务器会在我之前崩溃去部署它。如果函数中需要 b.js 和 c.js在部署服务器之前,错误可能未被发现,此时当 Node 尝试加载模块 c 时,整个服务器将崩溃.js如果需要该模块的路由是一个,则可能几天后很少使用。

第二种情况:假设我有一个需要 30 分钟才能加载的模块,这是不合理的,但只是想象一下。如果只需要该模块在一个路由处理程序中,可能需要一些时间才能有人触发该路由和节点必须需要该模块。当这种情况发生时,服务器实际上将在 30 分钟内无法访问,因为该模块已加载。如果这种情况发生在高峰时段,我的几个用户可能会变得不快乐并离开。最终需要该模块在函数与模块顶部的函数消耗相同数量的内存,但是在模块的顶部要求意味着它将始终准备好当有人请求该路线时,您会将其考虑在内部署时间额外增加 30 分钟,而不是凌晨 3 点当客户打电话抱怨他们的网站已关闭时。