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 モジュールの文字列化されたバージョンを構築し、それをインライン コンテンツ スクリプトとして渡します。この関数は、単純な関数と文字列 (必要な 2 つのデータ型のみ) を処理するために作成しただけなので、おそらく非常に一般的ではありませんが、次のようなことを行うだけでも、原則は簡単に適用できます。

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

これは明らかにちょっとしたハックですが、これまでのところかなり信頼できるものです。それはあなたが探していたものですか?

于 2011-07-25T18:04:38.000 に答える
1

私の解決策は

  1. すべての「ロジック」(および「utils」モジュール) をアドオン コードに入れる
  2. コンテンツ スクリプトをできるだけシンプルにする
  3. また、コンテンツ スクリプトが utils モジュールを必要とする情報を必要とするときはいつでも、コンテンツ スクリプト (self.port.emit、self.on...) とアドオン コード (worker.port.on...) の間で非同期通信システムを使用します。

このソリューションにより、アドオンの設計が改善されました。しかし、あなたの状況で非同期アプローチが機能するかどうかはわかりません。

于 2011-12-09T14:17:22.447 に答える
0

MozillaのアドオンSDKリファレンスサイトにある再利用可能なモジュールの実装へのポインタをありがとう。exports呼び出しを行う方法については、まだよくわかりません。彼らの例では、関数とファイルに同じ名前を使用しています。それで、行の左側は関数を参照しexports.translate = translate;、右側はファイルを参照していますか、またはその逆ですか?translatetranslate()translate.js

上記のmagnozの応答(大文字と小文字の区別により関数名とファイル名が異なる)は、関数名を2回使用し、ファイル名を無視する必要があることを示唆しているようです。これは本当ですか?

于 2012-04-05T14:05:58.290 に答える
0

既存のソリューションが見つからなかったため、同じファイルを複数のディレクトリにコピーしています (ビルド/デバッグ プロセスの一部として)。

ソースコードのほとんどの部分が拡張機能の Google Chrome 実装でも再利用されているため、これは現時点では特にうまくいくようです。

utils.jsFirefox コンテンツ スクリプトと 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 に答える