12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- 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
- }
|