mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-23 14:15:13 +00:00
84 lines
2.1 KiB
JavaScript
84 lines
2.1 KiB
JavaScript
const chunks = {} // chunkId => exports
|
|
const chunksInstalling = {} // chunkId => Promise
|
|
const failedChunks = {}
|
|
|
|
function importChunk(chunkId, src) {
|
|
// Already installed
|
|
if (chunks[chunkId]) {
|
|
return Promise.resolve(chunks[chunkId])
|
|
}
|
|
|
|
// Failed loading
|
|
if (failedChunks[chunkId]) {
|
|
return Promise.reject(failedChunks[chunkId])
|
|
}
|
|
|
|
// Installing
|
|
if (chunksInstalling[chunkId]) {
|
|
return chunksInstalling[chunkId]
|
|
}
|
|
|
|
// Set a promise in chunk cache
|
|
let resolve, reject
|
|
const promise = chunksInstalling[chunkId] = new Promise((_resolve, _reject) => {
|
|
resolve = _resolve
|
|
reject = _reject
|
|
})
|
|
|
|
// Clear chunk data from cache
|
|
delete chunks[chunkId]
|
|
|
|
// Start chunk loading
|
|
const script = document.createElement('script')
|
|
script.charset = 'utf-8'
|
|
script.timeout = 120
|
|
script.src = src
|
|
let timeout
|
|
|
|
// Create error before stack unwound to get useful stacktrace later
|
|
const error = new Error()
|
|
|
|
// Complete handlers
|
|
const onScriptComplete = script.onerror = script.onload = (event) => {
|
|
// Cleanups
|
|
clearTimeout(timeout)
|
|
delete chunksInstalling[chunkId]
|
|
|
|
// Avoid mem leaks in IE
|
|
script.onerror = script.onload = null
|
|
|
|
// Verify chunk is loaded
|
|
if (chunks[chunkId]) {
|
|
return resolve(chunks[chunkId])
|
|
}
|
|
|
|
// Something bad happened
|
|
const errorType = event && (event.type === 'load' ? 'missing' : event.type)
|
|
const realSrc = event && event.target && event.target.src
|
|
error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'
|
|
error.name = 'ChunkLoadError'
|
|
error.type = errorType
|
|
error.request = realSrc
|
|
failedChunks[chunkId] = error
|
|
reject(error)
|
|
}
|
|
|
|
// Timeout
|
|
timeout = setTimeout(() => {
|
|
onScriptComplete({ type: 'timeout', target: script })
|
|
}, 120000)
|
|
|
|
// Append script
|
|
document.head.appendChild(script)
|
|
|
|
// Return promise
|
|
return promise
|
|
}
|
|
|
|
export function installJsonp() {
|
|
window.__NUXT_JSONP__ = function (chunkId, exports) { chunks[chunkId] = exports }
|
|
window.__NUXT_JSONP_CACHE__ = chunks
|
|
window.__NUXT_IMPORT__ = importChunk
|
|
}
|
|
|