2

我最近构建了一个节点应用程序,并决定对其进行模块化。

我需要所有依赖项,声明一个在程序运行时由其他模块操作的数组,并在 app.js 文件中执行应用程序(该文件中不再有其他内容了)。这意味着所有模块化文件函数都应该发生在作用域链中,并且可以访问 app.js 中所需的包和变量,对吗?

但是,在 app.js 中定义和需要的包方法和变量会抛出未定义的错误。这意味着我正在创建的模块化文件无法访问我的 app.js 文件中所需的变量和包。

该程序在一个大型应用程序文件中运行良好。如果我将 app.js 中的所有依赖项和变量声明为全局变量,则代码可以正常工作。如果我需要每个文件中的包,则代码将起作用。

...所有这些解决方案都违背了模块化代码模式的目的...

您能否指导我参考一些资源,以使包和变量在节点应用程序的所有模块中都可用,而不会弄乱全局范围?

谢谢!

4

2 回答 2

0

不,这是不正确的。

模块默认封装,导出一个名为...的对象module.export。模块无权访问父模块的上下文(或变量)。

与 PHP 等语言不同,require()不像连接文件。

如果您需要传递数据,例如 config、db 或其他模块,则需要将其传递给模块。一个简单的例子是这样的:

// app.js
var config = require('./config');
var db = require('./db').connect(config.DB_CONFIG);

var UsersModel = require('./usersModel')(db);

var someLogger = require('some-logger');
var logger = someLogger.init(config.SOME_OPTION);

当然,有许多不同的风格和图案。

于 2015-11-30T06:13:25.460 回答
0

您可以使用很多技术,本文介绍了其中的大部分。

我经常将单例模式的变体用于应用程序全局上下文,例如数据库实例或记录器,然后仅require('./provider')用于每个相关文件。您需要一个模块的所有文件都将获得该模块的相同实例。

依赖注入是我其余时间使用的模式。

于 2015-11-30T06:38:33.120 回答