Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js模块/require索引es5支持我自己的复杂库_Javascript_Node.js_Module_Node Modules - Fatal编程技术网

Javascript node.js模块/require索引es5支持我自己的复杂库

Javascript node.js模块/require索引es5支持我自己的复杂库,javascript,node.js,module,node-modules,Javascript,Node.js,Module,Node Modules,我不熟悉node.js,但已经开发了足够多的服务器端代码,因此导出和要求为每个自定义编写的库函数创建一个文件变得越来越麻烦。我一直在读关于替代方案的书,对此感到困惑——也许是因为我应该在我的目标上妥协 有3个单独的可重用.js文件,它们是一种逻辑任务的一部分。让我们将任务类型称为“x” xLibrary.js-特定于该任务的其他实用程序-许多函数 xSubtask1.js-一些复杂的代码和支持函数 xSubtask2.js-一些复杂的代码和支持函数 如果我将每个文件视为一个单独的模块,并使用

我不熟悉node.js,但已经开发了足够多的服务器端代码,因此导出和要求为每个自定义编写的库函数创建一个文件变得越来越麻烦。我一直在读关于替代方案的书,对此感到困惑——也许是因为我应该在我的目标上妥协

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

  • xLibrary.js-特定于该任务的其他实用程序-许多函数
  • xSubtask1.js-一些复杂的代码和支持函数
  • xSubtask2.js-一些复杂的代码和支持函数
如果我将每个文件视为一个单独的模块,并使用一个单独的变量引用它,那么我理解如何继续。但由于子任务是任意分隔的(由于复杂性而不是逻辑关联),因此必须记住哪个文件包含给定函数会造成混乱

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

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


有人能告诉我如何继续吗?

对于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()
目录名,他们将得到一个导入的对象,其中包含整个模块的所有入口点


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

为了便于导入,您可以创建一个父模块,从三个子模块中的每个模块导入所有功能,然后将它们全部导出,这样,此模块的客户端就可以导入一个父模块并获取所有内容。这将根据是使用
require()
的CommonJS模块还是使用
import
的ESM模块而有所不同。这听起来很棒@jfriend00。我在一个普通的环境中。我认为当前的node.js应该是,除非我进入实验模式。快速搜索并没有找到简单的方向。如果您有时间,我希望您能提供进一步的指导,但无论如何,我非常感谢您提供一些搜索词来进一步调查。仅供参考,最新版本的nodejs可以使用ESM模块,而无需实验模式。您只需要在package.json文件中为ESM模块提供一个.mjs文件扩展名,并将其设置为正确的模块类型。我不能就此向您提供建议。这真的取决于你在做什么。我个人还没有发现ESM模块有任何显著的编程优势,所以我仍然使用CommonJS模块。ESM模块有一些限制(主要是为了让邦德人的生活更轻松)。例如,您不能在ESM模块中使用下面我的回答中所示的技术(使用计算导出),因为所有ESM导出都必须在不运行任何代码的情况下进行静态命名。谢谢@jfriend00。我想我可以研究一下,并找出如何使用这项技术。我假设我离开了节点附带的模块;e、 例如,http和mysql,因为我没有简单的方法知道它们是否有冲突的名称?如果这是一个错误的假设,请让我知道。我会回来,在我让事情正常工作后,将答案标记为已工作——希望是星期一。@JimThompson-您在此数组中列出的模块应该只是您自己的模块。不要重新导出内置模块。如果某些代码想要直接使用mysql,它应该导入mysql本身。@JimThompson-关于如何使用ESM模块,请参阅。@friend00--OK。我将尝试您提到的ESM技术,前提是新技术具有长期优势。我不知道如何比较每种方法的实际优势。再次感谢您的帮助。@jfriend.00--感谢您的解释。CommonJS脚本比我以前能找到的任何脚本都清晰。尽管我从未实现过它,但我想如果我没有切换到按照您提供的链接尝试ESModule解决方案,我也可以这样做。再次感谢你的帮助。