Javascript 是否保证在Web包或汇总模块绑定过程中保留singleton?
理解了singleton创建共享全局状态这一事实,我可能会在某些情况下需要singleton,例如redux存储/状态对象 如果我使用ES模块,我可以使用以下简单代码创建单例:Javascript 是否保证在Web包或汇总模块绑定过程中保留singleton?,javascript,webpack,singleton,web-frontend,rollupjs,Javascript,Webpack,Singleton,Web Frontend,Rollupjs,理解了singleton创建共享全局状态这一事实,我可能会在某些情况下需要singleton,例如redux存储/状态对象 如果我使用ES模块,我可以使用以下简单代码创建单例: // a.js (singleton module) class A {} // Create singleton export const a = new A(); 现在,我可以在其他模块中的任何位置使用此实例化对象: // b.js // Import singleton import { a } from '.
// 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。如果这些捆绑包意外/故意多次包含某些模块,该怎么办。我能想象的最简单的事情是,如果我有某种符号链接,它通过不同的路径解析到同一个模块。或者它可能只是模块解析过程中的一个bug
我的问题是-这些模块绑定器是否总是确保创建单例对象的模块在任何情况下都保持单例?
有一个话题我还没有完全研究过。我知道ES符号是全局唯一的,它们用于创建私有对象成员。这是我的下一个问题-符号的这种特性有没有办法帮助我创建一个真正的单身汉?(我相信,如果捆绑过程不健全,符号也会遇到同样的问题。)
最后,最后一个问题:是否有可能在JavaScript中可靠地创建一个真正的单例?
注意:我不是试图防范模块绑定器中的错误。Bug类比只是一个比喻来说明这个想法。我经常在汇总中使用这种模式,从来没有遇到过问题。或者,您可以这样定义单例:
//singleton.js
let instance;
class Singleton{
constructor(){
if(instance){
return instance;
}
instance = this;
}
}
var a = new Singleton();
var b = new Singleton();
a === b // true
我知道,如果Webpack应用代码拆分,不同的块会得到它们自己的上下文,并且不会保留单例。您可以通过引入commons块来解决此问题: