如何在内容脚本和插件之间共享代码?

我正在为Firefox 4+写一个扩展。

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

是否有可能从两个引用到相同的utils.js ? 如果是这样,怎么样?

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


我遇到了同样的问题。 你会认为会有一个明显的解决方案。 这就是我一直在为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()

这显然是一种黑客攻击,但是目前为止还是非常可靠的攻击。 那是你在找什么?


我的解决方案是

  • 把所有的“逻辑”(和我的“utils”模块)放入插件代码中
  • 保持内容脚本尽可能简单
  • 每当内容脚本需要使用utils模块的信息时,我会使用内容脚本(self.port.emit,self.on ...)和附加代码(worker.port.on ...)之间的异步通信系统
  • 该解决方案已导致我的插件更好的设计。 但我不知道异步方法是否适用于您的情况。


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

    这似乎目前效果最好,特别是因为大部分源代码也在谷歌浏览器的扩展实现中重复使用。

    为了使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;
    
    链接地址: http://www.djcxy.com/p/7985.html

    上一篇: How to share code between content script and addon?

    下一篇: OpenGL/PBO pixel drawing example needed