私はChrome Extension。私のbackground.jsファイルが非常に大きいので、それを分割して、必要に応じて指定されたメソッドをロードしたいと思います(ある種の遅延ロード))と書きました。
私はこれをFirefoxで行いました:
// ( call for load specified lib )
var libPath = redExt.basePath + 'content/redExt/lib/' + redExt.browser + '/' + libName + '.js';
var service = Components.classes["@mozilla.org/moz/jssubscript-loader;1"].getService(Components.interfaces.mozIJSSubScriptLoader);
service.loadSubScript("chrome://" + libPath);
// ( executing loaded file )
Webkitベースのブラウザーで同様の方法を使用する可能性はありますか?複数のJSファイルを(manifest.json
を使用して)一致するページに挿入する方法の解決策を見つけましたが、拡張のためだけにJSファイルを含める方法が見つかりません。
可能な解決策が見つかりました。 JavaScriptコールバックトレースを使用してメイン拡張ファイルをロードするイベントを検索し、バインドが拡張コンテキストでそれを実行する、RequireJSメインメソッドrequireの簡単な実装があります。 https://github.com/salsita/browser-require/blob/master/require.js
それは動作するようですが、このソリューションにはいくつかの短所があります:
func.call
に挿入するため、バグレポートは「行1、列1」で報告されます-デバッグは非常に困難ですfile:///
)からの評価スクリプトを許可しないため、期待どおりに機能しない場合がありますここで説明されている非常に簡単な方法でこれを行うこともできます。 https://developer.chrome.com/extensions/background_pages#manifest
{
"name": "My extension",
...
"background": {
"scripts": [
"lib/fileone.js",
"lib/filetwo.js",
"background.js"
]
},
...
}
遅延読み込みを行うことはありませんが、コードを複数のファイルに分割し、それらがバックグラウンドページに読み込まれる順序を指定できます。
バックグラウンドページのコンテキストでJavaScriptファイルをロードし、eval
の使用を避けたい場合は、バックグラウンドページのDOMにscript
タグを追加するだけです。たとえば、ファイルが拡張機能のlib
フォルダーにある場合、これは機能します。
function loadScript(scriptName, callback) {
var scriptEl = document.createElement('script');
scriptEl.src = chrome.extension.getURL('lib/' + scriptName + '.js');
scriptEl.addEventListener('load', callback, false);
document.head.appendChild(scriptEl);
}
おそらく、Webワーカーを使用しようとする可能性があります。 background.jsに以下を含めます。
var worker = new Worker('new-script.js');
Webワーカーは、新しいワーカーを生成でき、importScript( "new-script.js")メソッドを使用することもできます。
ただし、Webワーカーは非常に制限される傾向があります。 Webワーカーに関する優れた記事については、 こちら を確認してください。
しかし、彼らがうまくいくかどうかはわかりません。もう1つのオプションは、XMLHTTPRequest(AJAX)を使用して動的にスクリプトを取得し、それを評価することです。ただし、HTTPS以外の接続では、中間者攻撃によりブロックされている可能性があります。または、これをmanifest.json
に追加することで、Chromeに非暗号化接続からスクリプトを強制的に評価させることができます(ただし、実行しないでください)。
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
"permissions": ["http://badpractic.es/insecure.js"]
Chromeメソッドの詳細については、 リモートページをバックグラウンドページで読み込む:AJAX拡張機能 をご覧ください。
したがって、オプションは限られているようです。
もちろんこれは一度にそれらをすべてロードします:
{
"name": "My extension",
...
"background": {
"scripts": ["background.js","background2.js","background3.js"] //and so on
},
...
}
私がやったことは遅延読み込みではありませんが、chrome拡張機能アイコンをクリックすると、他のファイルより先にいくつかのファイルが読み込まれます。私の場合、自分のutilファイルが他のファイルより先にそれを利用したかったのです。 :
chrome.browserAction.onClicked.addListener(function() {
chrome.tabs.executeScript(null, {file: "src/utils/utilFunction1.js"});
chrome.tabs.executeScript(null, {file: "src/utils/utilFunction2.js"});
chrome.tabs.executeScript(null, {file: "src/main.js"});
chrome.tabs.executeScript(null, {file: "src/otherFeature.js"});
});