【问题标题】:Proper es6 way of sharing global with sub-modules与子模块共享全局的正确 es6 方式
【发布时间】:2017-06-01 04:24:31
【问题描述】:

我有一个文件夹形式的复杂服务器端节点模块:

store
  |-index.js
  |-accounts
      |-index.js
      |-consumer.js
      |-provider.js
  |-site
      |-index.js
      |-portal.js
  |-etc.

site/index.js 中,我正在初始化所有子模块(accountssite 等)和exporting 所有子模块接口都应该可以访问的数据库上下文,例如:

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(即要求将上下文传递给所有相关调用),但这很难看,IMO。

另一个想法是为每个模块设置一个初始化程序,该初始化程序将在模块范围的全局变量中接受上下文和现金,这对于每个单个文件都是必需的(再次,哎呀。)

有没有一种更干净、更优雅的 es6 方法来解决这个问题?

【问题讨论】:

  • 在该状态下运行的函数之间传递状态比使用单例要干净得多。
  • @Ryan 仅在合同不明确时。在这种情况下,实际上所有子模块函数都使用状态(db),因此单例是更好的方法,但这在风格上是非常主观的。 ;^)
  • 这对我想做的事情来说太过分了。我认为@riyaj-khan 的方法是正确的。
  • @Dallas:这种情况也不例外,它可能会在某个时候咬人。也许在尝试编写测试时;可能是因为其他原因尝试导入模块而没有任何副作用。

标签: javascript node.js ecmascript-6 babeljs


【解决方案1】:

你可以这样做。

定义db/index.js

import dbdriver from 'mydbdriver'
import settings from './settings'

const db = dbdriver.connect(settings)
export db;

site/index.js

import db from  db/index
export * from '../accounts' // depends on db
export * from '../site'     // depends on db


//use db here

这样,当你想使用db时,需要导入db/index

【讨论】:

  • 这可能是我必须做的,虽然略有不同:将 db 单例放在store/db.js,然后简单地让所有子模块导入这个。
猜你喜欢
  • 1970-01-01
  • 2016-03-17
  • 2013-04-09
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多