You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.1 KiB
82 lines
2.1 KiB
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 |
|
}
|
|
|