节点:需要模块内部功能?

时间:2016-03-05 17:07:11

标签: javascript node.js require

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

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

我之前没有看到过要求以这种方式使用函数。我一直认为最好将它包含在文件的顶部。这是此程序的入口文件,此函数仅在特定情况下调用 - 但这些包在程序的其他位置使用。当我向代码的作者询问他的推理时,他只是说他并不想立刻导入所有的库。"

这是好/坏的做法吗?通过不要求在模块顶部使用这些软件包,而只是在调用这些函数时,是否会对加载时间产生重大影响?

3 个答案:

答案 0 :(得分:8)

<强>更新 我想这里有一个更好的答案: Lazy loading in node.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');
}

简而言之,你应该在你的代码中预测使用方法的概率是高还是中等,那么你应该要求在顶部,否则如果它低,那么如果模块是{{1}则会很好在需要的基础上。

答案 1 :(得分:3)

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

从磁盘加载模块几乎不需要任何时间,所以在性能提升方面确实没有任何东西。有些人喜欢将模块保持在接近使用它们的位置,这就是全部。

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

答案 2 :(得分:1)

它有自己的优点和缺点。但通常你应该避免它。 Here 很好地解释了为什么:

<块引用>

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

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