ES6 - 带有吸气剂的导出模块

时间:2016-02-03 11:39:01

标签: javascript ecmascript-6 babeljs

希望导出一个模块,该模块从某个全局对象中获取模块的定义。

它类似于:

export {
  get DynamicModule() {
    return __globalFluxStorage.state.property.property.property.property
  }
}

...

import {DynamicModule} from 'dynamic-module'

我们有一个复杂的磁通存储,而DynamicModule只是一种访问__globalFluxStorage.state.property.property.property.property的方法,无需输入long属性访问器。这可能吗?感谢。

编辑:

因为我正在使用babel,尝试过这样的事情:

Object.defineProperty(module.exports, "Forms", {
  get: function() {
    return __globalFluxStorage.state.property.property.property.property
  }
});

但不起作用,即{DynamicModule}为undefined

2 个答案:

答案 0 :(得分:4)

不,不可能为模块导出制作一个getter - 它们是变量绑定,而不是属性。

但是,您可以简单地将其设为默认导出:

export default __globalFluxStorage.state.property.property.property.property;

import DynamicModule from 'dynamic-module';

如果您想要命名导入,则必须在导出中声明名称:

export var DynamicModule = __globalFluxStorage.state.property.property.property.property;

import {DynamicModule} from 'dynamic-module';

这也可以在以后在模块加载时不可用时更改值:

export var DynamicModule;
…
DynamicModule = __globalFluxStorage.state.property.property.property.property;

(虽然在这种情况下你可能想要考虑导出Promise或EventEmitter)

答案 1 :(得分:0)

如果每次在导入中使用该值时都需要重新评估该值,则可以使用getter导出对象或导出函数。

export const _ = {
  get DynamicModuleGetter() {return __globalFluxStorage.state.property.property.property.property}
}

export function DynamicModuleFunction() {return __globalFluxStorage.state.property.property.property.property}

然后在导入

import { _, DynamicModuleFunction } from 'dynamic-module'

// getter
const value1 = _.DynamicModuleGetter
const {DynamicModuleGetter} = _        // this evaluates the getter

// function
const value2 = DynamicModuleFunction()

更详细的例子

let obj = {
  foo: {
    bar: {
      baz: {
        bak: {
          value: 1
        },
        fak: {
          value: 2
        }
      }
    }
  }
}

export const _ = {
  get shortcut() {return obj.foo.bar.baz}
}

export function shortcut() {return obj.foo.bar.baz}

进口

import { _, shortcut } from './shortcut'

let g = _.shortcut.bak.value       // g = 1
let f = shortcut().fak.value       // f = 2
let {shortcut: {bak: {value}}} = _ // value = 1