我正在尝试使用Cu.import(...)
功能在我的插件中加入IOUtil.js
和ChannelReplacement.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中定义的函数?
答案 0 :(得分:3)
Cu.import
用于本地SDK模块。不要为SDK附加组件编写JS代码模块,SDK使用CommonJS-style modules和require()
工具一起免费进行适当的清理,这对JS代码模块来说是不可能的。 Cu.import
(您需要正确Cu.unload
所有内容,并且可能会自行删除某些引用。)xpcom_generateQI
(尽管可以这样做;好吧,实现它)。xpcom_generateQI
快捷方式,例如XPCOMUtils.generateQI.bind(XPCOMUtils)
。否则,如果实施更改并需要适当的this
,那么您的内容将会中断。exports
模块。请参阅第一个链接。require()
(再次使用第一个链接)。以下是循环require
(main
导入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
放入第三个模块。
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-everywhere的东西需要使用下标加载器进行转换或加载。我建议不要使用下标加载器,因为在任何可能的情况下,逐字的https-everywhere代码都不会自行清理。我实际上还建议不要通过在(require("./utils")
)中抛出一些内容来转换它。此代码不应在SDK中运行。更好地创建自己的实现,只需从https到任何需要的地方借用想法。