2016-11-23 266 views
0

我试图创建一个基于出来的localStorage的快速发布 - 订阅系统。这个过程让我意识到,我对ES6模块的工作原理并不完整。ES6模块 - 全局变量

const subscribers = {}; 
export default { 
    subscribe (key, callback) { 
    if (!Array.isArray(subscribers[key])) { 
     subscribers[key] = [callback]; 
    } else { 
     subscribers[key] = [...subscribers[key], callback]; 
    } 
    }, 
    publish (key, value) { 
    window.localStorage[key] = value; 
    subscribers[key].forEach(cb => cb(value)); 
    } 
}; 

无论何时我想订阅/发布到localStorage中的某个密钥,我都会导入此模块。问题在于,每次导入模块时,订户对象都会重新初始化。

有没有办法做到留住用户对象,不污染窗口?我认为导入语句只会在第一次导入时执行一次文件。

谢谢。

+0

由于浏览器目前不支持模块,您使用的是哪种打包系统? –

+0

Webpack + Babel + ES6模块 –

+0

你能告诉你如何使用它吗?所有进口应该共享相同的模块状态(当我在babel-node中测试时)。 –

回答

1

这是我的最终的监督。

我导入此模块(资本)时做了一个错字,我指定了错误的文件名。

有与等名称的另一个模块时的情况下被忽略。当在文件系统上进行编译时,这种 可能会导致意外行为,其他情况下的语义为 。如果预计有多个模块,则重命名模块,如果需要一个模块,则重命名模块 。

这导致模块重新初始化。

如果我错了,请纠正我的错误,但是我相信一个模块只会在整个应用程序中执行一次,而且是第一次导入的。

谢谢。