Javascript 与子模块共享全局数据的正确es6方式
我有一个文件夹形式的复杂服务器端节点模块:Javascript 与子模块共享全局数据的正确es6方式,javascript,node.js,ecmascript-6,babeljs,Javascript,Node.js,Ecmascript 6,Babeljs,我有一个文件夹形式的复杂服务器端节点模块: store |-index.js |-accounts |-index.js |-consumer.js |-provider.js |-site |-index.js |-portal.js |-etc. 其中,在site/index.js中,我正在初始化所有子模块(accounts,site等)都可以访问的数据库上下文,并导出所有子模块接口,如: import dbdri
store
|-index.js
|-accounts
|-index.js
|-consumer.js
|-provider.js
|-site
|-index.js
|-portal.js
|-etc.
其中,在site/index.js
中,我正在初始化所有子模块(accounts
,site
等)都可以访问的数据库上下文,并导出所有子模块接口,如:
import dbdriver from 'mydbdriver'
import settings from './settings'
const db = dbdriver.connect(settings)
export * from '../accounts' // depends on db
export * from '../site' // depends on db
我曾考虑过通过参数污染子模块API(即要求将上下文传递到所有相关调用中),但我认为这很难看
另一个想法是为每个模块提供一个初始化器,该初始化器将在模块范围的全局中接受上下文和现金,这对于每个单独的文件都是必需的(同样,讨厌)
有没有一种更干净、优雅的es6方法可以做到这一点?您可以这样做
定义db/index.js
import dbdriver from 'mydbdriver'
import settings from './settings'
const db = dbdriver.connect(settings)
export db;
import db from db/index
export * from '../accounts' // depends on db
export * from '../site' // depends on db
//use db here
在站点/index.js中
import dbdriver from 'mydbdriver'
import settings from './settings'
const db = dbdriver.connect(settings)
export db;
import db from db/index
export * from '../accounts' // depends on db
export * from '../site' // depends on db
//use db here
这样,无论何时您想要使用db
,都需要导入db/index
在该状态下运行的函数之间传递状态比使用单例要干净得多。相关:@Ryan仅在合同不明确时才导入。在这种情况下,实际上所有子模块功能都使用状态(db),因此单例是更好的方法,但这在风格上是非常主观的。^)对于我想做的事来说,这是太过分了。我认为@riyaj khan的方法是正确的。@Dallas:这个案例并不例外,可能会在某个时候产生影响。也许在尝试编写测试时;可能是在尝试导入模块时,由于其他原因没有任何副作用。这可能是我必须做的,尽管略有不同:将db singleton放入store/db.js
,然后让所有子模块导入。