我有一个可供多个用户脚本使用的库脚本。这个库执行一些繁重的任务(即CPU密集型操作),所以我希望只运行该库的一个实例。
下面是一个最小的例子:
lib.js
let callbacks = [];
document.addEventListener('click', function(event){
// pretend that something expensive happens in here
for (callback of callbacks)
callback();
});
script1.user.js
// @match foo.bar
// @require lib.js
callbacks.push(function(){
console.log('Script 1: '+callbacks.length+' callback(s) registered');
});
script2.user.js
// @match foo.bar
// @require lib.js
callbacks.push(function(){
console.log('Script 2: '+callbacks.length+' callback(s) registered');
});
使用此设置,鼠标单击后的输出将为:
Script 1: 1 callback(s) registered
Script 2: 1 callback(s) registered
因为每个用户脚本都有自己的库实例。我可以做些什么来让它们使用相同的库实例,这样我就会得到如下的输出:
Script 1: 2 callback(s) registered
Script 2: 2 callback(s) registered
注意:
发布于 2018-05-28 13:59:44
对于库脚本来说,最简单的方法是将自身分配给窗口,如果窗口还不存在的话,这是标准的单例样式。
lib.js
const win = typeof unsafeWindow === 'undefined' ? window : unsafeWindow;
if (!win.myLib) {
win.myLib = {
callbacks: []
// assign other properties/methods as needed
};
document.addEventListener('click', function(){
for (const callback of win.myLib.callbacks)
callback();
});
}
script1.user.js
// @require lib.js
const { myLib } = window;
myLibrary.callbacks.push(function(){
console.log('Script 1: ' + myLib.callbacks.length + ' callback(s) registered');
});
script2.user.js
// @require lib.js
const { myLib } = window;
myLibrary.callbacks.push(function(){
console.log('Script 2: ' + myLib.callbacks.length + ' callback(s) registered');
});
根据用户脚本管理器的不同,在某些情况下可能必须使用unsafeWindow
。
https://stackoverflow.com/questions/50559851
复制相似问题