その要件を克服するためのいくつかの代替案について言及できます。
ライブラリを使用して依存関係を注入します (AMD または CommonJS モジュール)
モジュールを使用するだけです。ES2015: import
/ export
、または CommonJS: require()
.
script
プログラムでタグを作成しonload
、スクリプトが非同期でロードされたときに反応するようにコールバックを設定します。この属性async = true
はデフォルトで設定されています。
挿入するスクリプトを変更することが許可されている場合は、スクリプトの最後にobject
orを含む行を追加しarray
て、既にロードされているスクリプトを追跡します。
- スクリプトをテキスト ( ) として取得し、必要な順序でスクリプトを使用して を
XMLHttpRequest
構築し、最後に、次の方法でテキスト スクリプトを実行できます。string
eval()
- あまりお勧めしませんが頻繁に使用されるオプションで
setInterval
、スクリプトが既に実行されているかどうかを確認するように設定します。
最初のオプションを選択することをお勧めします。しかし、学術的な目的のために、2 番目のオプションを説明します。
script
プログラムでタグを作成しonload
、スクリプトが非同期でロードされたときに反応するようにコールバックを設定します。
スクリプトローダーについて読むことをお勧めします。
次の例は、スクリプト インジェクションを管理するための小さなモジュールであり、これがその背後にある基本的な考え方です。
let _scriptsToLoad = [
'path/to/script1.js',
'path/to/script2.js',
'path/to/script3.js'
];
function createScriptElement() {
// gets the first script in the list
let script = _scriptsToLoad.shift();
// all scripts were loaded
if (!script) return;
let js = document.createElement('script');
js.type = 'text/javascript';
js.src = script;
js.onload = onScriptLoaded;
let s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(js, s);
}
function onScriptLoaded(event) {
// loads the next script
createScriptElement();
};
このプランカーでは、スクリプトのインジェクションを特定の順序で非同期にテストできます。
主なアイデアは、次のメソッドを公開することにより、スクリプトと対話して注入できるようにする API を作成することでした。
addScript
: ロードする各スクリプトの URL または URL のリストを受け取ります。
load
: タスクを実行して、指定された順序でスクリプトをロードします。
reset
: スクリプトの配列をクリアするか、スクリプトのロードをキャンセルします。
afterLoad
: すべてのスクリプトがロードされた後に実行されるコールバック。
onComplete
: すべてのスクリプトがロードされた後に実行されるコールバック。
私はFluent Interfaceやメソッド チェーンテクニックが好きなので、そのようにモジュールを作成しました。
scriptsLoader
.reset()
.addScript("script1.js")
.addScript(["script2.js", "script3.js"])
.afterLoad((src) => console.warn("> loaded from jsuLoader:", src))
.onComplete(() => console.info("* ALL SCRIPTS LOADED *"))
.load();
上記のコードでは、最初に"script1.js"
ファイルをロードしてafterLoad()
コールバックを実行し、次に同じことを"script2.js"
行い"script3.js"
、すべてのスクリプトがロードされた後にonComplete()
コールバックが実行されます。