首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在多个用户脚本之间共享库

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

Stack Overflow用户
提问于 2018-05-28 13:48:31
回答 1查看 41关注 0票数 2

我有一个可供多个用户脚本使用的库脚本。这个库执行一些繁重的任务(即CPU密集型操作),所以我希望只运行该库的一个实例。

下面是一个最小的例子:

lib.js

代码语言:javascript
复制
let callbacks = [];

document.addEventListener('click', function(event){
    // pretend that something expensive happens in here

    for (callback of callbacks)
        callback();
});

script1.user.js

代码语言:javascript
复制
// @match foo.bar
// @require lib.js

callbacks.push(function(){
    console.log('Script 1: '+callbacks.length+' callback(s) registered');
});

script2.user.js

代码语言:javascript
复制
// @match foo.bar
// @require lib.js

callbacks.push(function(){
    console.log('Script 2: '+callbacks.length+' callback(s) registered');
});

使用此设置,鼠标单击后的输出将为:

代码语言:javascript
复制
Script 1: 1 callback(s) registered
Script 2: 1 callback(s) registered

因为每个用户脚本都有自己的库实例。我可以做些什么来让它们使用相同的库实例,这样我就会得到如下的输出:

代码语言:javascript
复制
Script 1: 2 callback(s) registered
Script 2: 2 callback(s) registered

注意:

  • 这两个用户脚本运行在同一页面上
  • 用户脚本可能有也可能没有
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-28 13:59:44

对于库脚本来说,最简单的方法是将自身分配给窗口,如果窗口还不存在的话,这是标准的单例样式。

lib.js

代码语言:javascript
复制
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

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

script2.user.js

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

根据用户脚本管理器的不同,在某些情况下可能必须使用unsafeWindow

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50559851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档