我可以在Chrome扩展程序的不同部分之间共享代码吗?

时间:2014-06-15 08:29:43

标签: javascript google-chrome google-chrome-extension code-reuse

让我们说,我有一个功能:

var rand = function(n) {
    return Math.floor(Math.random() * n);
}

我可以在没有copypaste的内容脚本和后台脚本中使用此功能吗?

谢谢。

2 个答案:

答案 0 :(得分:18)

是。 您可以拥有一个外部JS文件,该文件作为后台和内容脚本(与任何普通的JS文件一样)的一部分加载。只需将它添加到清单中的后台和内容脚本文件数组中,它就会为您加载。

例如,如果我们的共享功能位于sharedFunctions.js,则使用它们的内容脚本位于mainContentScript.js中,后台代码位于mainBackground.js中(全部位于js子文件夹中)我们可以在清单中做这样的事情:

 "background": {
   "scripts": [ "js/sharedFunctions.js", "js/mainBackground.js" ]
 },

 "content_scripts": [
    {
      "matches": ["*://*/*"],
      "js": ["js/sharedFunctions.js", "js/mainContentScript.js"]
    }
 ]

注意:请确保在使用它的其他文件之前按正确的顺序加载。

或者您也可以在background.html中将其添加为脚本标记(带有相对URL),并且只在清单中将其添加到内容脚本的JS数组中。所以清单看起来像:

 "background": {
   "page": "background.html"
 },
 "content_scripts": [
     {
       "matches": ["*://*/*"],
       "js": ["js/sharedFunctions.js", "js/mainContentScript.js"]
     }
  ]

并且background.html文件将包含以下脚本标记:

 <script type="text/javascript" src="js/sharedFunctions.js"></script>

修改:此外,还要与扩展程序的其他部分中的其他作用域共享(遗憾的是,内容脚本中没有这些作用域)。

您还可以将要共享的功能驻留在后台脚本中,并通过chrome.runtime.getBackgroundPage()与您联系,您可以在此处详细了解:  https://developer.chrome.com/extensions/runtime#method-getBackgroundPage

所以,假设您在背景脚本中将rand()函数声明为全局变量(这意味着它是背景窗口对象的属性),您可以在脚本开头处执行此类操作在另一个范围内(这可以是一个像browserAction窗口一样的弹出上下文):

var background, newRandomNumber;
chrome.runtime.getBackgroundPage(function(backgroundWindow){
 background = backgroundWindow;
 newRandomNumber = background.rand();
})

这样,您还可以使用变量background来访问背景窗口对象上的任何属性或方法集。请注意,此函数以异步方式运行,这意味着只有在调用回调之后才会定义变量background和newRandomNumber。

答案 1 :(得分:1)

是的,你可以把它放在一个单独的JS文件中并加载它们。

说,你有一个包含所有这些功能的文件utils.js

然后你可以像这样加载背景页面:

"background": {
  "scripts": [ "utils.js", "background.js" ]
},

内容脚本如下:

"content_scripts": [
  {
    "matches": ["..."],
    "js": ["utils.js", "content.js"]
  }
],

或者,如果您正在使用程序化注入,请将调用链接起来:

chrome.tabs.executeScript(tabId, {file: "utils.js"}, function(){
  chrome.tabs.executeScript(tabId, {file: "content.js"}, yourActualCallback);
});