Javascript 在导入的模块中使用main.js中的函数

Javascript 在导入的模块中使用main.js中的函数,javascript,firefox-addon,firefox-addon-sdk,Javascript,Firefox Addon,Firefox Addon Sdk,我正在尝试使用Cu.import(…)函数将和包含在我的加载项中。这两个脚本都使用xpcom\u 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

我正在尝试使用
Cu.import(…)
函数将和包含在我的加载项中。这两个脚本都使用
xpcom\u 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\u generateQI未定义

如何访问main.js中定义的函数?

问题
  • 不要对本地SDK模块使用
    Cu.import
    。不要为SDK附加组件编写JS代码模块,SDK与
    require()
    工具一起使用,该工具还附带免费的适当清理功能,这对于JS代码模块和
    Cu.import
    (您需要正确地
    Cu.unload
    所有内容,并且可能会自己杀死一些引用)
  • https everywhere既不是JS代码模块也不是SDK模块,而是使用下标加载器。将其转换为SDK代码模块,或者自己使用下标加载器
  • 可以导入不同范围/模块中的内置JS代码模块。实际上不需要从main提供
    xpcom\u generateQI
    (尽管可以做到;好吧,开始吧)
  • 为了保证将来的安全,您应该正确绑定
    xpcom\u generateQI
    快捷方式,如
    XPCOMUtils.generateQI.bind(XPCOMUtils)
    中所述。否则,如果实现发生更改,并且需要正确的
    ,则您的东西将损坏
  • 要从任何CommonJS模块导出某些内容,需要将其放入
    exports
    模块。请参阅第一个链接
  • 要导入某些内容,请使用
    require()
    (再次使用第一个链接)
  • 请注意循环引用,模块A导入模块B导入模块A。目前这种方式可以工作(但只有一种,因为当模块B像这样导入时,模块A可能无法提供某些内容,因为模块A未完全加载)。最好避免
  • 示例1(循环) 下面是一个循环
    require
    main
    imports
    modules
    imports
    main
    )的示例

    main.js

    function someFunction() {
      console.log("some function called");
    }
    
    exports.someFunction = someFunction;
    
    var mod = require("./module");
    mod.anotherFunction();
    
    const { someFunction } = require("./main");
    
    exports.anotherFunction = function() {
      someFunction();
    }
    
    var mod = require("./module");
    mod.anotherFunction();
    
    // Or call someFunction directly
    var { someFunction } = require("./utils");
    someFunction();
    
    const { someFunction } = require("./utils");
    
    exports.anotherFunction = function() {
      someFunction();
    }
    
    function someFunction() {
      console.log("some function called");
    }
    
    exports.someFunction = someFunction;
    
    module.js

    function someFunction() {
      console.log("some function called");
    }
    
    exports.someFunction = someFunction;
    
    var mod = require("./module");
    mod.anotherFunction();
    
    const { someFunction } = require("./main");
    
    exports.anotherFunction = function() {
      someFunction();
    }
    
    var mod = require("./module");
    mod.anotherFunction();
    
    // Or call someFunction directly
    var { someFunction } = require("./utils");
    someFunction();
    
    const { someFunction } = require("./utils");
    
    exports.anotherFunction = function() {
      someFunction();
    }
    
    function someFunction() {
      console.log("some function called");
    }
    
    exports.someFunction = someFunction;
    
    现在,由于循环引用,这是一个脆弱的构造。如果现在可以工作,但当模块变得更复杂或SDK发生更改时,它可能会中断。。。最好将
    someFunction
    放入第三个模块

    示例2(避免循环导入)
    main.js

    function someFunction() {
      console.log("some function called");
    }
    
    exports.someFunction = someFunction;
    
    var mod = require("./module");
    mod.anotherFunction();
    
    const { someFunction } = require("./main");
    
    exports.anotherFunction = function() {
      someFunction();
    }
    
    var mod = require("./module");
    mod.anotherFunction();
    
    // Or call someFunction directly
    var { someFunction } = require("./utils");
    someFunction();
    
    const { someFunction } = require("./utils");
    
    exports.anotherFunction = function() {
      someFunction();
    }
    
    function someFunction() {
      console.log("some function called");
    }
    
    exports.someFunction = someFunction;
    
    module.js

    function someFunction() {
      console.log("some function called");
    }
    
    exports.someFunction = someFunction;
    
    var mod = require("./module");
    mod.anotherFunction();
    
    const { someFunction } = require("./main");
    
    exports.anotherFunction = function() {
      someFunction();
    }
    
    var mod = require("./module");
    mod.anotherFunction();
    
    // Or call someFunction directly
    var { someFunction } = require("./utils");
    someFunction();
    
    const { someFunction } = require("./utils");
    
    exports.anotherFunction = function() {
      someFunction();
    }
    
    function someFunction() {
      console.log("some function called");
    }
    
    exports.someFunction = someFunction;
    
    utils.js

    function someFunction() {
      console.log("some function called");
    }
    
    exports.someFunction = someFunction;
    
    var mod = require("./module");
    mod.anotherFunction();
    
    const { someFunction } = require("./main");
    
    exports.anotherFunction = function() {
      someFunction();
    }
    
    var mod = require("./module");
    mod.anotherFunction();
    
    // Or call someFunction directly
    var { someFunction } = require("./utils");
    someFunction();
    
    const { someFunction } = require("./utils");
    
    exports.anotherFunction = function() {
      someFunction();
    }
    
    function someFunction() {
      console.log("some function called");
    }
    
    exports.someFunction = someFunction;
    
    不再有圆圈了。如果您想重用
    xpcom\u generateQI
    ,您应该将它作为
    exports
    的属性放在
    utils.js
    (在本例中)中,然后在
    require(./utils”)
    中要求它

    https无处不在
    https everywhere内容需要使用下标加载器进行转换或加载。我建议不要使用下标加载器,因为在所有情况下,逐字的https everywhere代码很可能不会自行清理。实际上,我还建议不要仅仅通过在中添加一些东西来转换它(
    exports.xzy=…
    )。此代码不打算在SDK中运行。最好创建您自己的实现,并在需要的地方从https中借用想法。

    这似乎非常基本,以至于让我很沮丧,几天都无法正确实现。谢谢!我想我真的应该自己找到模块结构指南。。