在多个用户脚本之间共享库

时间:2018-05-28 05:48:31

标签: javascript require userscripts

我有一个由多个用户脚本使用的库脚本。这个库做了一些繁重的工作(即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

注意:

  • 两个用户脚本都在同一页面上运行
  • 用户脚本可能有也可能没有@grant none

1 个答案:

答案 0 :(得分:1)

最简单的方法是让库脚本将自己分配给窗口,如果它还不存在,标准单例样式。

<强> lib.js

// @require lib.js
const { myLib } = window;
myLibrary.callbacks.push(function(){
  console.log('Script 1: ' + myLib.callbacks.length + ' callback(s) registered');
});

<强> script1.user.js

// @require lib.js
const { myLib } = window;
myLibrary.callbacks.push(function(){
  console.log('Script 2: ' + myLib.callbacks.length + ' callback(s) registered');
});

<强> script2.user.js

unsafeWindow

根据用户脚本管理员的不同,您可能需要在某些情况下使用Random _rnd = new Random(); int[] input = { 90, 180, 270, 360 }; // dictionary of available numbers List<int> result = Enumerable.Range(0, 200).Select(x => input[_rnd.Next(0, input.Length)]).ToList();