我正在尝试从与CommonJS兼容的插件代码(不是内容脚本)中加载模块,但本身需要一个需要指定路径的模块。
在阅读toolkit/loader
的文档后,我想我可以通过创建自定义Loader
并在其选项中指定modules
导出来完成我的目标。像这样:
let { Loader, Module, load } = require("toolkit/loader");
let self = require("sdk/self");
// `bar` is required by `foo`
let loader = Loader({
modules: {
"bar": require("./bar")
}
});
let module = Module("foo", self.data.url("../lib/foo.js"));
load(loader, module);
在foo
中,我只需要bar
:
require("bar");
无论出于何种原因,这种方法都行不通。也许它需要使用Cu.import
或其他一些。文档不是很清楚。
然后我采用了不同的方法,一种依赖于指定paths
属性:
let self = require("sdk/self");
let loader = Loader({
paths: {
"bar": self.data.url("../lib/bar.js"),
}
});
let module = Module("foo", self.data.url("../lib/foo.js"));
load(loader, module);
但是现在foo
内没有任何与SDK相关的内容。例如,以下操作失败:
require("sdk/timers")
这似乎意味着需要额外初始化Loader
实例,但我不知道从哪里开始。
问题:
lib
目录中检索资产的网址?我正在使用require("sdk/self").data.url("../lib/asset")
,如上所示,但肯定有更好的方法吗?答案 0 :(得分:0)
There is a simple way to load commonJS based modules.
for ex: if the below is folder structure of your add-on,
data\foo.js,
data\bar.js
then foo.js can simply include bar.js using the syntax.
var bar = require('bar');