【问题标题】:node.js module/require index es5 supporting my own complex librarynode.js 模块/需要索引 es5 支持我自己的复杂库
【发布时间】:2021-04-15 09:40:07
【问题描述】:

我是 node.js 的新手,但已经开发了足够多的服务器端代码,因此为每个自定义编写的库函数导出并需要一个文件变得越来越笨拙。我一直在阅读有关替代方案的信息并且感到困惑——也许是因为我应该在我的目标上妥协。

有 3 个独立的可重用 .js 文件,它们是一种逻辑任务的一部分。我们将任务类型称为“x”。

  • xLibrary.js - 特定于该任务的杂项实用程序 - 许多功能
  • xSubtask1.js - 一些复杂的代码和支持功能
  • xSubtask2.js - 一些复杂的代码和支持功能

如果我将每个文件视为一个单独的模块并带有一个引用它的单独变量,我了解如何继续。但是由于子任务是任意隔离的(由于复杂性而不是逻辑关联),因此必须记住哪个文件包含给定函数会造成混乱。

我想将所有模块放在 1 个子目录中,并将所有函数引用为 xTask.*。我知道这样做的唯一方法是将所有文件合并为一个,但这会使维护代码更加复杂。

我已经阅读了文章和 stackoverflow,直到我头晕目眩。许多更全面的答案使用逻辑将每个模块添加到子目录中。我认为硬编码函数和文件名更适合我目前的专业水平。

谁能告诉我怎么做?

【问题讨论】:

  • 为方便导入,您可以制作一个父模块,从您的三个子模块中的每一个中导入所有功能,然后将它们全部导出,这样客户端就可以只导入一个父模块并得到一切。这取决于它是使用 require() 的 CommonJS 模块还是使用 import 的 ESM 模块。
  • 听起来不错@jfriend00。我在 CommonJS 环境中。我认为当前的 node.js 需要,除非我进入实验模式。快速搜索没有找到简单的方向。如果您有时间,我将不胜感激进一步的指导,但无论如何,我很感激有几个搜索词可以进一步调查。
  • 仅供参考,最新版本的 nodejs 可以使用没有实验模式的 ESM 模块。你只需要给 ESM 模块一个 .mjs 文件扩展名,在你的 package.json 文件中设置正确的模块类型。
  • 我真的不能给你建议。这真的取决于你在做什么。我个人还没有发现 ESM 模块有任何显着的编程优势,所以我仍在使用 CommonJS 模块。 ESM 模块有一些限制(主要是为了让 bunders 的生活更轻松)。例如,您不能在 ESM 模块中使用下面我的答案中显示的技术(使用计算导出),因为所有 ESM 导出都必须在不运行任何代码的情况下静态命名。

标签: javascript node.js module node-modules


【解决方案1】:

对于 CommonJS 模块,您可以创建一个父模块,该模块从一组子模块中收集所有导出,然后将它们全部导出为一个主对象的一部分。这是我在我的一个项目中使用的一些代码:

// this just re-exports everything that the sub-modules export
module.exports = [
    './mapConcurrent.js',
    './deferred.js',
    './utils.js',
    './rateMap.js',
    './concurrency.js',
    './retry.js',
].reduce((obj, file) => {
    const m = require(file);
    Object.assign(obj, m);
    return obj;
}, {});

我将它放在一个index.js 文件中,然后允许该模块的用户只使用require() 目录名称,他们将获得一个导入的对象,其中包含整个模块的所有入口点。

注意:这假定任何子模块中的导出符号都没有名称冲突。这是在您自己的控制下进行管理的,因此这是执行此操作的必要条件。

【讨论】:

  • 谢谢@jfriend00。我猜我可以研究这个并弄清楚如何使用该技术。我假设我留下了节点附带的模块;例如,http 和 mysql 在父级之外,因为我没有简单的方法知道它们是否有冲突的名称?如果这是一个错误的假设,请告诉我。我会回来并在我得到工作后将答案标记为工作 - 希望是星期一。
  • @JimThompson - 您在此数组中列出的模块只能是您自己的模块。不要重新导出内置模块。如果某些代码想直接使用mysql,它应该自己导入。
  • @JimThompson - 关于如何使用 ESM 模块执行此操作,请参阅 here
  • @friend00 -- 好的。我将尝试您指出的 ESM 技术,假设新技术具有长期优势。我不够了解比较每个人的实际优势。再次感谢您的帮助。
  • @jfriend.00 -- 感谢您的解释。 CommonJS 脚本比我以前能找到的任何东西都清晰。即使我从未实现它,我想如果我没有根据您提供的链接切换到尝试 ESModule 解决方案,我本可以这样做。再次感谢所有帮助。
猜你喜欢
  • 2020-03-21
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多