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

Ole*_*leg 12 javascript code-reuse google-chrome google-chrome-extension

比方说,我有一个功能:

var rand = function(n) {
    return Math.floor(Math.random() * n);
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Lio*_*ior 21

是.您可以拥有一个外部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"]
    }
 ]
Run Code Online (Sandbox Code Playgroud)

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

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

 "background": {
   "page": "background.html"
 },
 "content_scripts": [
     {
       "matches": ["*://*/*"],
       "js": ["js/sharedFunctions.js", "js/mainContentScript.js"]
     }
  ]
Run Code Online (Sandbox Code Playgroud)

并且background.html文件将具有以下脚本标记:

 <script type="text/javascript" src="js/sharedFunctions.js"></script>
Run Code Online (Sandbox Code Playgroud)

编辑:此外,与扩展的其他部分中的其他范围共享(遗憾的是,在内容脚本中不可用).

您还可以将要共享的功能驻留在后台脚本中并通过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();
})
Run Code Online (Sandbox Code Playgroud)

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