你如何使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是我在其余时间使用的模式。