指定包含模块

时间:2015-10-28 17:57:49

标签: firefox-addon firefox-addon-sdk

我正在尝试从与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实例,但我不知道从哪里开始。

问题:

  1. 如何指定包含在某个地方的模块的路径而不会造成严重破坏?
  2. 如何在扩展程序的lib目录中检索资产的网址?我正在使用require("sdk/self").data.url("../lib/asset"),如上所示,但肯定有更好的方法吗?

1 个答案:

答案 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');