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
importsmodules
importsmain
)的示例
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中借用想法。这似乎非常基本,以至于让我很沮丧,几天都无法正确实现。谢谢!我想我真的应该自己找到模块结构指南。。