我有一個基本的SPA,它可以根據需要加載一些資源(主要是樣式表和腳本)。控制動態加載腳本的加載順序
加載程序是這樣的(這是一個簡化版本):
class ModuleXLoader
constructor: ->
@scripts = [
'https://www.example.com/assets/js/script1.js',
'https://www.example.net/assets/js/script2.js',
'https://www.example.org/assets/js/script3.js'
]
@scriptsLoaded = 0
load: (@callback) ->
document.head.appendChild @.scriptTag url for url in @scripts
scriptTag: (url) ->
domElement = document.createElement 'script'
domElement.type = 'text/javascript'
domElement.onload = (event) =>
console.log event.currentTarget.srC# This logs the script's URL
@.callback() if [email protected] is @scripts.length and typeof @callback is 'function'
domElement.src = url
return domElement
所以,當我需要加載ModuleX
我做的:
loader = new ModuleXLoader()
loader.load() =>
console.log 'All scripts have been loaded, let\'s do stuff!'
這追加所需的腳本我<head>
一切都按預期工作。
的問題當有需要的腳本之間的一些依賴出現。根據每個CDN的響應時間(比方說example.com
,example.net
...)腳本在隨機順序加載所以,有時我得到了經典:
Uncaught ReferenceError: ModuleXDependency is not defined
當然,我嘗試了不同的ordenations我@scripts
數組,但它並不重要。
我想對某種信號燈實現:
@scripts =
script1:
url: 'https://www.example.com/assets/js/script1.js'
requires: 'script3'
loaded: false
script2: # etc.
domElement.onload = (event) =>
# This is not a real implementation but kind of pseudocode idea...
@wait() while not @scripts[@scripts['script1'].requires].loaded
但說實話感覺太骯髒走這條路,所以我想知道是否也許有人有更好的主意......
使用AMD我不是假設你的選擇嗎?其他一切可能會影響性能。但方法很清楚:構建一個依賴關係圖並進行處理。動態添加的腳本在不同的瀏覽器中執行的方式不同。但是他們可能會執行'async',所以無法控制它。 – Lux
嗨@Lux,我不熟悉AMD。你能提供一些文件的鏈接嗎? –