【问题标题】:Chaining imports and exports in nodejs在 nodejs 中链接导入和导出
【发布时间】:2020-04-13 07:52:49
【问题描述】:

我正在寻找一个文件结构,以便我有一个“模块”文件,它可以导出一堆......模块。

我知道,一般来说,任何必需的模块都会被缓存,因此在第一次导入后不会被读取/执行,但我想知道这是否适用于导入/导出链,其中它们的根导入已导出为一个已定义的常量。

例如。

// modules.js
const fs = require('fs');

module.exports = {
  fs
};

------------------

// file1.js
const { fs } = require('modules.js');

------------------

// file2.js
const { fs } = require('modules.js');

file1 和 file2 是否收到相同的 fs 缓存副本?这很重要,因为我的一些模块需要初始化,我不希望这段代码被多次执行。

附:这样做的重点是我可以有一个位置来要求特定模块。如果有更好的方法,请教我!

提前致谢。

【问题讨论】:

    标签: javascript node.js import export require


    【解决方案1】:

    file1file2 是否收到 fs 的相同缓存副本?这很重要,因为我的一些模块需要初始化,我不希望这段代码被多次执行。

    是的,模块被缓存。因此,除非您手动进入缓存以从缓存中删除一个模块,否则一个已经初始化的模块只会在第 2 次、第 3 次、第 4 次等...加载时从缓存中获取。它只会被初始化一次。这是 node.js 模块设计理念的基本(也是非常有用的)部分。

    这样做的重点是我可以有一个位置来要求特定模块。如果有更好的方法,请教我!

    我强烈建议您不要做您在问题中显示的那样的事情。如果您需要 fs 模块,则只需直接包含 fs 模块。按照您建议的方式执行此操作不会节省任何费用,它只会掩盖真正的依赖关系并将模块联系在一起,从而使它们更难单独重用。模块化的全部意义在于,您可以构建中小型的独立、可重用和可测试的代码块,这些代码不会与您的其他代码交织在一起,并且清楚地说明它们自己的依赖关系。将事物链接到某个中间 modules 模块只会掩盖所有这些,并在不必要时在事物之间建立联系。它还可能使单个模块测试变得复杂。

    看看通常会发生什么。您开始创建modules 模块。 FileA 需要四个东西,所以你把这四个东西放进去。 FileB 需要 3 个常见的,但需要另外两个。所以,现在modules 模块中有 6 个东西。但是,您现在已经使 FileA 依赖于 modules 模块中它并不真正依赖的 2 个模块,并且 FileB 现在依赖于 modules 模块中它并不真正依赖的 1 个模块。用更多的方式扩展它,你很快就会有一大堆错误的依赖关系。要在另一个项目中实际重用给定模块,您现在必须引入比实际需要更多的东西。在任何类型的大型项目中,这都会很快变得一团糟。

    即使您只在另一个模块需要其中所有内容的情况下使用module 模块,您实际上获得了什么,而不是在需要它们的模块中指定您实际需要的模块?您已尝试节省少量输入,但会使依赖项的清洁度和重用的简单性变得复杂。 IMO,不是正确的权衡。

    由于某些原因,很多人第一次开始在 node.js 上编程时似乎会发生这种情况(但我并不完全清楚完整的推理),许多人发现他们希望避免在开始时手动输入模块依赖项每个模块的。也许这是我们不应该重复代码行的想法,所以第二次和第三次我们在新模块的开头键入类似的模块依赖项时,我们有一种将其封装在一些通用代码中的冲动。这通常是一个很好的概念,但在这种特定情况下并非如此,因为它会影响模块化、独立性和可测试性。我认为这只是在使用 node.js 模块进行编程时要习惯的东西,并且是编写模块的更好方法。不要创建没有实际价值的中间聚合模块,只会掩盖实际的依赖关系。

    【讨论】:

    • 感谢您的详细回复!您的模块化解释很有意义,我肯定会推迟将核心依赖项链接在一起。我的模块需要初始化呢?例如。必须使用 API 密钥配置的第三方服务。我不想每次导入时都要配置这个,所以我想导出它的初始化对象。
    • @Mengerer - 没关系。只需将一段代码单独封装在一个很好的可重用模块中。这是对模块和代码重用/共享的完美使用。
    • @Mengerer - 如果这回答了您的问题,那么您可以通过单击答案左侧的复选标记向社区表明这一点,并在 stackoverflow 上为自己赢得一些声誉积分以遵循正确的程序在这里。
    • 标记为已回答,对此感到抱歉!
    猜你喜欢
    • 2019-01-31
    • 2021-06-05
    • 2018-05-11
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 2017-05-31
    • 2019-05-23
    • 1970-01-01
    相关资源
    最近更新 更多