使用导入模块中main.js的功能

时间:2014-07-05 15:25:21

标签: javascript firefox-addon firefox-addon-sdk

我正在尝试使用Cu.import(...)功能在我的插件中加入IOUtil.jsChannelReplacement.js。这两个都使用xpcom_generateQI,我试图从XPCOM jsm获取,但两个脚本无法访问它。

const {Cc, Ci, Cu, Cr} = require("chrome");

Cu.import("resource://gre/modules/XPCOMUtils.jsm");
const xpcom_generateQI = XPCOMUtils.generateQI;
Cu.import(self.data.url("IOUtil.js"));
Cu.import(self.data.url("ChannelReplacement.js"));

给了我xpcom_generateQI is not defined 如何访问main.js中定义的函数?

1 个答案:

答案 0 :(得分:3)

问题

  1. 不要将Cu.import用于本地SDK模块。不要为SDK附加组件编写JS代码模块,SDK使用CommonJS-style modulesrequire()工具一起免费进行适当的清理,这对JS代码模块来说是不可能的。 Cu.import(您需要正确Cu.unload所有内容,并且可能会自行删除某些引用。)
  2. 那个https-everywhere的东西既不是JS代码模块也不是SDK模块,而是使用下标加载器。将其转换为SDK代码模块,或自己使用下标加载器。
  3. 可以在不同的范围/模块中导入内置的JS代码模块。实际上并不需要从main提供xpcom_generateQI(尽管可以这样做;好吧,实现它)。
  4. 为了将来证明,您应该正确绑定xpcom_generateQI快捷方式,例如XPCOMUtils.generateQI.bind(XPCOMUtils)。否则,如果实施更改并需要适当的this,那么您的内容将会中断。
  5. 要从任何CommonJS模块导出内容,您需要将其放入exports模块。请参阅第一个链接。
  6. 要导入内容,请使用require()(再次使用第一个链接)。
  7. 请注意循环引用,其中模块A导入模块B导入模块A.现在这种方法有效(但只是有点,因为当模块B像这样导入模块A时,模块A可能无法使用某些东西,如模块A没有满载)。最好避免它。
  8. 实施例1(循环)

    以下是循环requiremain导入modules导入main)的示例

    main.js

    function someFunction() {
      console.log("some function called");
    }
    
    exports.someFunction = someFunction;
    
    var mod = require("./module");
    mod.anotherFunction();
    

    module.js

    const { someFunction } = require("./main");
    
    exports.anotherFunction = function() {
      someFunction();
    }
    

    现在,由于循环引用,这是一个脆弱的构造。如果现在正常工作,但是当模块变得更复杂或SDK发生变化时,它可能会中断......最好将someFunction放入第三个模块。

    示例2(避免循环导入)

    main.js

    var mod = require("./module");
    mod.anotherFunction();
    
    // Or call someFunction directly
    var { someFunction } = require("./utils");
    someFunction();
    

    module.js

    const { someFunction } = require("./utils");
    
    exports.anotherFunction = function() {
      someFunction();
    }
    

    utils.js

    function someFunction() {
      console.log("some function called");
    }
    
    exports.someFunction = someFunction;
    

    再也没有圈子了。如果您想重复使用xpcom_generateQI,则必须将其作为exports的{​​{1}}属性(在此示例中),然后将其与utils.js一起使用。< / p>

    HTTPS-到处

    https-everywhere的东西需要使用下标加载器进行转换或加载。我建议不要使用下标加载器,因为在任何可能的情况下,逐字的https-everywhere代码都不会自行清理。我实际上还建议不要通过在(require("./utils"))中抛出一些内容来转换它。此代码不应在SDK中运行。更好地创建自己的实现,只需从https到任何需要的地方借用想法。