8

我正在为 Firefox 4+ 编写扩展。

我在一个名为的文件中有一些代码utils.js,我想从插件main.jspage-mod内容脚本中调用这些代码。

是否可以同时引用两者utils.js?如果是这样,怎么做?

编辑:更好的解决方案是让我也可以在 Google Chrome 扩展程序中使用相同的代码。

4

4 回答 4

2

我遇到了同样的问题。你会认为会有一个明显的解决方案。这是我一直在为 firefox 做的事情(尚未使用 chrome):

我有一个文件 lib/dbg.js,其中包含我想在任何地方使用的基本调试功能。

在我的 main.js 中的每个内容脚本模块中,我都有这个:

contextMenu.Item({
...
contentScript: export_internals(require('dbg')),
contentScriptFile: my-actual-scripts.js
...

然后主要我有一个功能

function export_internals(module) {
    var code = '';
    for (name in module) {
        var val = module[name];
        if (val.constructor === String)
            code += name + ' = "' + val + '";';
        else
            code += val;
    }
    return code;
}

它基本上只是循环通过导出的属性(变量、函数等)并利用 Function.toString() 之类的东西基本上构建 dbg 模块的字符串化版本并将其作为内联内容脚本传递。这个函数可能不是很通用,因为我只是写它来处理简单的函数和字符串(我需要的唯一两种数据类型),但是即使你只是做类似的事情,这个原则也应该很容易应用

contentScript: require('dbg').my_function.toString()

显然,这有点像 hack,但到目前为止还是相当可靠的。那是你要找的吗?

于 2011-07-25T18:04:38.000 回答
1

我的解决方案是

  1. 将所有“逻辑”(和我的“实用程序”模块)放入插件代码中
  2. 保持内容脚本尽可能简单
  3. 每当内容脚本需要需要 utils 模块的信息时,我都会使用内容脚本(self.port.emit、self.on...)和插件代码(worker.port.on...)之间的异步通信系统

该解决方案为我的插件带来了更好的设计。但我不知道异步方法是否适用于您的情况。

于 2011-12-09T14:17:22.447 回答
0

感谢在 Mozilla 的附加 SDK 参考站点上实现可重用模块的指针。我仍然不太清楚如何进行exports调用。在他们的示例中,他们为函数和文件使用相同的名称。那么,在这一行exports.translate = translate;translate,左边是指函数translate(),而右边是指文件translate.js,或者反之亦然

magnoz 上面的回复(其中函数名和文件名因大小写敏感而不同)似乎建议我应该只使用两次函数名并忽略文件名。是这样吗?

于 2012-04-05T14:05:58.290 回答
0

由于我找不到现有的解决方案,我现在只是将同一个文件复制到多个目录(作为构建/调试过程的一部分)。

这似乎目前效果最好,特别是因为大部分源代码也在扩展的 Google Chrome 实现中被重用。

为了utils.js在 Firefox 内容脚本和 Chrome 中使用(两者都没有 CommonJS),我像这样导入它:

var Utils = Utils || require('utils').Utils; 

的相关部分utils.js如下所示:

function initUtils() {
    var result = {
        // ..define exported object...
    };
    return result;
};

// Chrome
var Utils = initUtils();
var exports = exports || {}; 
// Firefox
exports.Utils = Utils;
于 2011-07-14T16:52:07.363 回答