你如何使variables和依赖关系在节点应用程序的所有模块中可用?

我最近build立了一个节点应用程序,并决定对它进行模块化。

我需要所有的依赖关系,在程序运行时声明一个由其他模块操作的数组,并且在app.js文件中执行应用程序(这个文件中没有其他的东西了)。 这意味着所有的模块化文件函数都应该在作用域链中进行,并且可以访问app.js中所需的包和variables,对吗?

但是,app.js中定义和需要的包方法和variables会将错误引发为未定义的。 这意味着我正在创build的模块化文件无法访问我的app.js文件中所需的variables和包。

该程序在一个大的应用程序文件中正常工作。 如果我将app.js中的所有依赖项和variables声明为全局variables,代码工作正常。 如果我需要在每个文件中的包,代码将工作。

…所有这些解决scheme都打败了模块化代码模式的目的…

你能指示我一些资源,使节点应用程序的所有模块中都可以使用包和variables,而不会混淆全局范围吗?

谢谢!

不,这是不正确的。

模块默认封装,导出名为.. module.export的对象。 模块不能访问父模块的上下文(或variables)。

与像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); 

当然,有很多不同的风格和模式。

有相当多的技巧可以使用,而这篇文章涵盖了大部分。

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

dependency injection是我在其余时间使用的模式。