Skip to content

Commit

Permalink
fix: 🐛 forbedring av async lasting av assets
Browse files Browse the repository at this point in the history
skriver om til promise-map for å holde styr hvilke apper man har startet
å laste inn. Dette gjøres fordi
`loadjs.isDefined`/`loadjs.ready`-oppsettet ikke fungerte optimalt og
man kunne komme i situasjoner hvor man prøvde å rendre appen mens
preloading fortsatt pågikk. `loadjs.isDefined`-guarden indikerte da at
appen var lastet inn siden det skjer synkront med kallet til loadjs,
mens den i realiteten ikke var klar enda. Ved bruk av ett promise-map så
erstatter vi `loadjs.isDefined`-guarden med vår egen logikk, som
returnerer eksisterene promise (e.g pågående eller ferdig innlasting)
ved påfølgende forsøk på å laste inn en app. Dette gir oss også deduping
av henting av assets og innlasting av ressurser som en side-effekt, men
introduserer en global variabel.
  • Loading branch information
nutgaard committed Jan 22, 2021
1 parent 5e31421 commit f5d37b2
Showing 1 changed file with 9 additions and 8 deletions.
17 changes: 9 additions & 8 deletions src/async/async-navspa.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,19 +30,20 @@ function fetchAssetUrls(appBaseUrl: string, assetManifestParser: AssetManifestPa
.then(manifest => assetManifestParser(manifest));
}

async function loadAssets(config: PreloadConfig): Promise<void> {
const loadingStatus: { [key: string]: Promise<void> } = {};
function loadAssets(config: PreloadConfig): Promise<void> {
const loadJsBundleId = createLoadJsBundleId(config.appName);
const assetManifestParser = config.assetManifestParser || createAssetManifestParser(config.appBaseUrl);

if (!loadjs.isDefined(loadJsBundleId)) {
if (!loadingStatus[loadJsBundleId]) {
if (process.env.NODE_ENV === 'development' && (scope[config.appName] || scopeV2[config.appName])) {
console.warn(asyncLoadingOfDefinedApp(config.appName))
}
const assets: string[] = await fetchAssetUrls(config.appBaseUrl, assetManifestParser)
if (!loadjs.isDefined(loadJsBundleId)) {
await loadjs(assets, loadJsBundleId, {returnPromise: true})
}

const assetManifestParser = config.assetManifestParser || createAssetManifestParser(config.appBaseUrl);
loadingStatus[loadJsBundleId] = fetchAssetUrls(config.appBaseUrl, assetManifestParser)
.then((assets) => loadjs(assets, loadJsBundleId, {returnPromise: true}))
}

return loadingStatus[loadJsBundleId];
}

export function preload(config: PreloadConfig) {
Expand Down

0 comments on commit f5d37b2

Please sign in to comment.