了解单例创建共享全局状态这一事实,在某些情况下我可能需要单例,例如 redux store/state 对象。
如果我使用的是 ES 模块,我可以使用如下简单的代码来创建单例:
// a.js (singleton module)
class A {}
// Create singleton
export const a = new A();
现在我可以在其他模块的任何地方使用这个实例化对象:
// b.js
// Import singleton
import { a } from './a.js';
console.log(a);
// c.js - some other nested file
import { a } from '../../a.js';
console.log(a);
理论上,应该可以按上述方式管理单例创建。但截至今天,我们使用像 Webpack.js 或 Rollup.js 这样的模块打包器来为浏览器提供 JavaScript。如果这些打包器意外/故意多次包含某个模块怎么办。我能想到的最简单的事情是,如果我有某种符号链接(symbolic link),它们通过不同的路径解析到同一个模块。或者它可能只是模块解析过程中的错误。
我的问题是 - 这些模块打包器是否始终确保创建单例对象的模块在任何情况下都保持单例?
有一个主题我还没有完全研究过。我知道 ES 符号 是全局唯一的,它们用于创建私有(private)对象成员。这是我的下一个问题 - 符号的这种特性是否可以帮助我创建一个真正的单例?(我相信如果捆绑过程不合理,符号也会遇到同样的问题。) p>
最后,最后一个问题:是否有可能在 JavaScript 中可靠地创建一个真正的单例?
注意:我不是试图防止模块 bundler 中的错误。错误类比只是一个比喻来说明这个想法。
最佳答案
我经常在 rollup 中使用这种模式,从来没有遇到过问题。或者你可以像这样定义一个单例:
//singleton.js
let instance;
class Singleton{
constructor(){
if(instance){
return instance;
}
instance = this;
}
}
var a = new Singleton();
var b = new Singleton();
a === b // true
关于javascript - 是否保证在 webpack 或 rollup 模块打包过程中保留单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49569061/