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
,然后让所有子模块导入。