私は Firefox 4+ 用の拡張機能を書いています。
という名前のファイルに、アドオンとのコンテンツ スクリプトのutils.js
両方から呼び出したいコードがあります。main.js
page-mod
両方から同じものを参照することはできutils.js
ますか? もしそうなら、どのように?
編集:Google Chrome拡張機能でも同じコードを使用できるようにするソリューションがあればさらに良いでしょう。
私は Firefox 4+ 用の拡張機能を書いています。
という名前のファイルに、アドオンとのコンテンツ スクリプトのutils.js
両方から呼び出したいコードがあります。main.js
page-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 モジュールの文字列化されたバージョンを構築し、それをインライン コンテンツ スクリプトとして渡します。この関数は、単純な関数と文字列 (必要な 2 つのデータ型のみ) を処理するために作成しただけなので、おそらく非常に一般的ではありませんが、次のようなことを行うだけでも、原則は簡単に適用できます。
contentScript: require('dbg').my_function.toString()
これは明らかにちょっとしたハックですが、これまでのところかなり信頼できるものです。それはあなたが探していたものですか?
私の解決策は
このソリューションにより、アドオンの設計が改善されました。しかし、あなたの状況で非同期アプローチが機能するかどうかはわかりません。
MozillaのアドオンSDKリファレンスサイトにある再利用可能なモジュールの実装へのポインタをありがとう。exports
呼び出しを行う方法については、まだよくわかりません。彼らの例では、関数とファイルに同じ名前を使用しています。それで、行の左側は関数を参照しexports.translate = translate;
、右側はファイルを参照していますか、またはその逆ですか?translate
translate()
translate.js
上記のmagnozの応答(大文字と小文字の区別により関数名とファイル名が異なる)は、関数名を2回使用し、ファイル名を無視する必要があることを示唆しているようです。これは本当ですか?
既存のソリューションが見つからなかったため、同じファイルを複数のディレクトリにコピーしています (ビルド/デバッグ プロセスの一部として)。
ソースコードのほとんどの部分が拡張機能の 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;