在 nodejs 中链接导入和导出

Chaining imports and exports in nodejs

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

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

例如

// 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 缓存副本?这很重要,因为我的一些模块需要初始化,我不希望这段代码被多次执行。

P.S。这样做的全部意义在于,我可以有一个位置来从中请求特定模块。如果有更好的方法,请赐教!

提前致谢。

Do file1 and file2 receive the same cached copy of fs? This is important because some of my modules require initialization and I don't want this code being executed multiple times.

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

The whole point of this is so that I can have a single location to require specific modules from. If there's a better way to do this, please school me!

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

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

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

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