在 nodejs 中链接导入和导出



我希望建立一个文件结构,以便我有一个导出一堆...模块。

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

例如。

// modules.js
const fs = require('fs');
module.exports = {
fs
};
------------------
// file1.js
const { fs } = require('modules.js');
------------------
// file2.js
const { fs } = require('modules.js');

文件 1 和文件2 是否收到相同的 fs 缓存副本?这很重要,因为我的某些模块需要初始化,并且我不希望多次执行此代码。

附言这样做的全部意义在于,我可以有一个位置来要求特定的模块。如果有更好的方法,请教育我!

提前谢谢。

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

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

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

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

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

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

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