Node.js 大型多文件节点项目中的require()

Node.js 大型多文件节点项目中的require(),node.js,Node.js,我正在做一个大型节点项目。当然,我想把它分解成多个源文件。我在大多数源文件中都使用了标准库中的许多模块,我自己的文件中也有很多我想在任何地方都使用的模块 我一直通过在每个源文件的开头包含一个巨大的require块来完成这项工作,但这感觉非常冗余。有更好的方法吗?或者这是Node令人钦佩的模块系统的预期结果?好吧,这里有几件事 首先,如果您的许多文件一次又一次地需要相同的库,您可能需要后退一步,确定您是否真的以正确的方式分解了代码。也许有更好的组织,某些库只需要源文件的子集 其次,请记住,glob

我正在做一个大型节点项目。当然,我想把它分解成多个源文件。我在大多数源文件中都使用了标准库中的许多模块,我自己的文件中也有很多我想在任何地方都使用的模块


我一直通过在每个源文件的开头包含一个巨大的
require
块来完成这项工作,但这感觉非常冗余。有更好的方法吗?或者这是Node令人钦佩的模块系统的预期结果?

好吧,这里有几件事

首先,如果您的许多文件一次又一次地需要相同的库,您可能需要后退一步,确定您是否真的以正确的方式分解了代码。也许有更好的组织,某些库只需要源文件的子集

其次,请记住,
global
对象在Node.js应用程序中的所有
require
d文件之间共享。您的“根”源文件,比如
index.js
,可以执行类似
global.fs=require('fs')
然后可以从您的所有文件中访问它。这样就不需要
require
一个满是
require
s的文件。(在Node.js中,与浏览器中不同,您必须通过在
global.
前面加上前缀来明确说明您正在访问全局变量。)


对于CRUD类型的Express应用程序来说,这是一个好主意,在这些应用程序中,控制器的许多代码几乎相同,但每个视图的代码都必须略有不同,您只想将它们分开,而不是为了任何特定的组织结构,而只是为了使调试更容易(此文件中的错误,而不是该文件中的错误)。如果应用程序的结构比这更复杂,那么在使用该技巧之前,请牢记针对全局变量的常见警告。

好吧,这里有几件事

首先,如果您的许多文件一次又一次地需要相同的库,您可能需要后退一步,确定您是否真的以正确的方式分解了代码。也许有更好的组织,某些库只需要源文件的子集

其次,请记住,
global
对象在Node.js应用程序中的所有
require
d文件之间共享。您的“根”源文件,比如
index.js
,可以执行类似
global.fs=require('fs')
然后可以从您的所有文件中访问它。这样就不需要
require
一个满是
require
s的文件。(在Node.js中,与浏览器中不同,您必须通过在
global.
前面加上前缀来明确说明您正在访问全局变量。)


对于CRUD类型的Express应用程序来说,这是一个好主意,在这些应用程序中,控制器的许多代码几乎相同,但每个视图的代码都必须略有不同,您只想将它们分开,而不是为了任何特定的组织结构,而只是为了使调试更容易(此文件中的错误,而不是该文件中的错误)。如果应用程序的结构比这更复杂,那么在使用该技巧之前,请牢记针对全局变量的常见警告。

我通常会说,require块比在节点中使用全局变量更好

您需要记住,requires是缓存的,所以当您将它们放在所有代码模块中时,每次都会得到相同的实例,而不是新实例


这样做可以确保您在需要的地方获得具有预期名称空间的适当代码,而使用global将包含您不需要的内容。使用require的节点方式也会使代码更易于移植。

一般来说,require块比在节点中使用全局块更好

您需要记住,requires是缓存的,所以当您将它们放在所有代码模块中时,每次都会得到相同的实例,而不是新实例

这样做可以确保您在需要的地方获得具有预期名称空间的适当代码,而使用global将包含您不需要的内容。使用require的节点方式也会使您的代码更易于移植。

您可以使用容器模块加载一系列模块。例如,给定以下项目结构:

lib/
    index.js
    module1.js
    module2.js
main.js
您可以让
index.js
导入库中的其他模块

# index.js
module.exports.module1 = require('./module1');
module.exports.module2 = require('./module2');
然后
main.js
只需导入单个模块:

# main.js
var lib = require('./lib');

lib.module1.doSomething();
lib.module2.doSomethingElse();
此技术可以扩展,减少冗余导入。

您可以使用容器模块加载一系列模块。例如,给定以下项目结构:

lib/
    index.js
    module1.js
    module2.js
main.js
您可以让
index.js
导入库中的其他模块

# index.js
module.exports.module1 = require('./module1');
module.exports.module2 = require('./module2');
然后
main.js
只需导入单个模块:

# main.js
var lib = require('./lib');

lib.module1.doSomething();
lib.module2.doSomethingElse();

此技术可以扩展,减少冗余导入。

需要多个文件,而不需要通过Require文件目录的绝对路径

1-在单个语句中可能需要多个文件。 2-可以要求仅使用其名称的文件


访问以获取解决方案:

需要多个文件,但不需要通过Require file目录的绝对路径

1-在单个语句中可能需要多个文件。 2-可以要求仅使用其名称的文件


访问以获取解决方案:

node.js已缓存所有必需的文件,如果已在缓存中,则不会两次加载任何文件。我不认为
global
是必要的。我理解这一点(这就是模块与C风格包含的全部区别),但问题是,是否有办法通过删除多余的
require
语句来保持代码比当前更干爽
global
就是这样做的一种可能性。但是
global
泄漏了名称空间,您必须确保请求的对象被缓存在