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

问题描述 投票:0回答:4

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

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

我以前没有见过 require 在函数内部以这种方式使用。我一直认为最好的做法是将其包含在文件的顶部。这是该程序的入口文件,并且该函数仅在特定情况下被调用——但这些包在程序的其他地方使用。当我询问代码作者的推理时,他只是说他“不想一次导入所有库”。

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

javascript node.js require
4个回答
14
投票

更新: 我认为更好的答案在这里: 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');
}

简而言之,您应该在代码中预期,如果使用某个方法的概率很高甚至是中等,那么您应该将 require 放在顶部,否则如果它很低,那么如果模块在需要的基础上

required
会很好.


7
投票

就 Node 而言,这实际上主要取决于样式选择。

从磁盘加载模块几乎不需要任何时间,因此在性能方面确实没有任何提升。有些人喜欢让模块尽可能靠近它们将被使用的地方,仅此而已。

现在,客户端,一切都不同了,并且在很大程度上取决于您的包管理器。


2
投票

它有自己的优点和缺点。但一般来说你应该避免它。 这里很好地解释了原因:

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

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


0
投票

也是因为较新版本的node不支持循环依赖。我在使用express和mongodb时遇到了一个问题。唯一的选择是在函数内部导入依赖项。

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