Unable to use Components in WebExtensions: get "ReferenceError: Cu is not defined"

Unable to use Components in WebExtensions: get "ReferenceError: Cu is not defined"

我有一个简单的扩展,我使用 Cu.import 导入 JavaScript code module。但是,当我加载扩展时,出现此错误:

Cu is not defined

我尝试使用的代码是:

Cu.import("resource://gre/modules/MatchPattern.jsm");
Cu.import("resource://gre/modules/BrowserUtils.jsm");

var regExArray = [];
var myArray = ["facebook.com", "google.com"];

var myURL="http://www.google.co.uk/?gfe_rd";

for (var x=0; x<myArray.length; x++)
{   
    console.log("loop: "+x);
    var match = new MatchPattern(/(http:\/\/)(.*\.)*(myArray[x])(\/.*)*(\/)*/);
    log("match result is: "+match.matches(myURL));     
}//end for loop

我知道如何使用 require 在 Firefox Add-on SDK 中定义 Cu,但如何在 WebExtesnions 中定义它?

您可以在WebExtensions

中使用Components

对于较旧的 Firefox 扩展类型,Components 对象提供了对 Firefox 中低级功能的访问。常见的别名是:

  • Cc = Components.classes
  • Ci = Components.interfaces
  • Cu = Components.util
  • Cr = Components.results
  • Cm = Components.manager
  • components = Components

在附加 SDK 中,这些在 Chrome Authority 文档中进行了描述,并且可以通过使用

var {Cc, Ci, Cu, Cr, Cm, components} = require("chrome");

Components 在 WebExtensions

中不存在

WebExtensions 中不存在对这些低级功能的访问 。从您的代码中删除它并忘掉它。不要尝试使用任何与之相关的东西,因为你不能这样做。取消对 Components 提供的低级功能的访问是转向 WebExtensions 的具体原因之一。

如果您在 MDN 的某个页面中看到它,那么该页面与 WebExtensions 无关,对于 WebExtensions 开发应该忽略。您应该会在每个此类页面的顶部看到 一个大警告,说明您应该使用 WebExtensions 而不是该页面上描述的技术。当前 (2017-06-17) 的警告如下所示:

如果您需要旧扩展中存在的东西,但 WebExtensions 中没有,请尝试 WebExtensions Experiment

您可以通过构建 WebExtensions Experiment 来扩展 WebExtensions 的功能。目的是允许附加组件开发人员为建议包含到 Firefox 中的 WebExtensions 创建新的 API。但是,不能保证此类建议会实际集成到 Firefox 中。