62 lines
1.4 KiB
JavaScript
62 lines
1.4 KiB
JavaScript
|
/**
|
||
|
* Before starting the Next.js runtime and requiring any module, we need to make
|
||
|
* sure the following scripts are executed in the correct order:
|
||
|
* - Polyfills
|
||
|
* - next/script with `beforeInteractive` strategy
|
||
|
*/
|
||
|
|
||
|
const version = process.env.__NEXT_VERSION
|
||
|
|
||
|
window.next = {
|
||
|
version,
|
||
|
appDir: true,
|
||
|
}
|
||
|
|
||
|
function loadScriptsInSequence(scripts, hydrate) {
|
||
|
if (!scripts || !scripts.length) {
|
||
|
return hydrate()
|
||
|
}
|
||
|
|
||
|
return scripts
|
||
|
.reduce((promise, [src, props]) => {
|
||
|
return promise.then(() => {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
const el = document.createElement('script')
|
||
|
|
||
|
if (props) {
|
||
|
for (const key in props) {
|
||
|
if (key !== 'children') {
|
||
|
el.setAttribute(key, props[key])
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (src) {
|
||
|
el.src = src
|
||
|
el.onload = resolve
|
||
|
el.onerror = reject
|
||
|
} else if (props) {
|
||
|
el.innerHTML = props.children
|
||
|
setTimeout(resolve)
|
||
|
}
|
||
|
|
||
|
document.head.appendChild(el)
|
||
|
})
|
||
|
})
|
||
|
}, Promise.resolve())
|
||
|
.then(() => {
|
||
|
hydrate()
|
||
|
})
|
||
|
.catch((err) => {
|
||
|
console.error(err)
|
||
|
// Still try to hydrate even if there's an error.
|
||
|
hydrate()
|
||
|
})
|
||
|
}
|
||
|
|
||
|
export function appBootstrap(callback) {
|
||
|
loadScriptsInSequence(self.__next_s, () => {
|
||
|
callback()
|
||
|
})
|
||
|
}
|