From b683b04d7d43fbc42be0953a5bbd029f3e1b647e Mon Sep 17 00:00:00 2001 From: Ryo Armanda Date: Thu, 22 Apr 2021 06:04:46 +0800 Subject: [PATCH 1/5] Adapt rebuildPageBeingViewed to use page generation tasks --- packages/core/src/Site/index.js | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/packages/core/src/Site/index.js b/packages/core/src/Site/index.js index 978d4737ea..f81e8f1255 100644 --- a/packages/core/src/Site/index.js +++ b/packages/core/src/Site/index.js @@ -747,26 +747,23 @@ class Site { to trigger multiple page builds before the first one has finished building, hence we need to take this into account. */ - const regeneratePagesBeingViewed = uniqueUrls.map(async (normalizedUrl) => { - this._setTimestampVariable(); - const pageToRebuild = this.pages.find(page => - FsUtil.removeExtension(page.pageConfig.sourcePath) === normalizedUrl); - if (!pageToRebuild) { - return; - } + const pagesToRebuild = this.pages.filter(page => + uniqueUrls.some(pageUrl => FsUtil.removeExtension(page.pageConfig.sourcePath) === pageUrl)); + const pageGenerationTask = { + mode: 'async', + pages: pagesToRebuild, + }; - this.toRebuild.delete(normalizedUrl); - try { - await pageToRebuild.generate(this.externalManager); - await this.writeSiteData(); - Site.calculateBuildTimeForRebuildPageBeingViewed(startTime); - } catch (error) { - await Site.rejectHandler(error, [this.tempPath, this.outputPath]); - } - }); + try { + this._setTimestampVariable(); + await this.runPageGenerationTasks([pageGenerationTask]); + await this.writeSiteData(); + Site.calculateBuildTimeForRebuildPageBeingViewed(startTime); + } catch (err) { + await Site.rejectHandler(err, [this.tempPath, this.outputPath]); + } - await Promise.all(regeneratePagesBeingViewed); await fs.remove(this.tempPath); } @@ -1047,6 +1044,7 @@ class Site { await utils.sequentialAsyncForEach(pages, async (page) => { try { await page.generate(this.externalManager); + this.toRebuild.delete(FsUtil.removeExtension(page.pageConfig.sourcePath)); progressBar.tick(); } catch (err) { logger.error(err); @@ -1070,6 +1068,7 @@ class Site { const pageGenerationQueue = pages.map(page => async () => { try { await page.generate(this.externalManager); + this.toRebuild.delete(FsUtil.removeExtension(page.pageConfig.sourcePath)); Site.generateProgressBarStatus(progressBar, counter, pageGenerationQueue, pages, resolve); } catch (err) { logger.error(err); From 589d7e67ac489014eb2d88bbb3962b99e326404a Mon Sep 17 00:00:00 2001 From: Ryo Armanda Date: Thu, 22 Apr 2021 06:05:57 +0800 Subject: [PATCH 2/5] Modify rebuildPageBeingViewed call on add/remove with current opened pages --- packages/core/src/Site/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/Site/index.js b/packages/core/src/Site/index.js index f81e8f1255..52762ff24a 100644 --- a/packages/core/src/Site/index.js +++ b/packages/core/src/Site/index.js @@ -798,7 +798,7 @@ class Site { if (this.onePagePath) { this.mapAddressablePagesToPages(this.addressablePages || [], this.getFavIconUrl()); - await this.rebuildPageBeingViewed(this.currentPageViewed); + await this.rebuildPageBeingViewed(this.currentOpenedPages); await this.lazyBuildAllPagesNotViewed(); return; } From c46eb6c2cbfdf1a79f95d7a3788525292a6fd35b Mon Sep 17 00:00:00 2001 From: Ryo Armanda Date: Thu, 22 Apr 2021 06:07:46 +0800 Subject: [PATCH 3/5] Modify lazyBuildAllPagesNotViewed to check against supplied viewed pages --- packages/core/src/Site/index.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/core/src/Site/index.js b/packages/core/src/Site/index.js index 52762ff24a..f627534bd3 100644 --- a/packages/core/src/Site/index.js +++ b/packages/core/src/Site/index.js @@ -682,12 +682,13 @@ class Site { } /** - * Adds all pages except the current page being viewed to toRebuild, flagging them for lazy building later. + * Adds all pages except the viewed pages to toRebuild, flagging them for lazy building later. */ - async lazyBuildAllPagesNotViewed() { + async lazyBuildAllPagesNotViewed(viewedPages) { + const viewedPagesArray = Array.isArray(viewedPages) ? viewedPages : [viewedPages]; this.pages.forEach((page) => { const normalizedUrl = FsUtil.removeExtension(page.pageConfig.sourcePath); - if (normalizedUrl !== this.currentPageViewed) { + if (!viewedPagesArray.some(viewedPage => normalizedUrl === viewedPage)) { this.toRebuild.add(normalizedUrl); } }); @@ -704,7 +705,7 @@ class Site { await this.generateLandingPage(); await this.copyLazySourceFiles(); await fs.remove(this.tempPath); - await this.lazyBuildAllPagesNotViewed(); + await this.lazyBuildAllPagesNotViewed(this.currentPageViewed); logger.info('Landing page built, other pages will be built as you navigate to them!'); } catch (error) { await Site.rejectHandler(error, [this.tempPath, this.outputPath]); @@ -799,7 +800,7 @@ class Site { this.mapAddressablePagesToPages(this.addressablePages || [], this.getFavIconUrl()); await this.rebuildPageBeingViewed(this.currentOpenedPages); - await this.lazyBuildAllPagesNotViewed(); + await this.lazyBuildAllPagesNotViewed(this.currentOpenedPages); return; } From fa4878268f9f6fdf4bb75ebde7e4fe430cebf876 Mon Sep 17 00:00:00 2001 From: Ryo Armanda Date: Thu, 22 Apr 2021 20:27:05 +0800 Subject: [PATCH 4/5] Rename rebuildPageBeingViewed to fit plural usecase --- packages/core/src/Site/index.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/core/src/Site/index.js b/packages/core/src/Site/index.js index 0b9446880b..bd20d2dd57 100644 --- a/packages/core/src/Site/index.js +++ b/packages/core/src/Site/index.js @@ -207,7 +207,7 @@ class Site { if (this.toRebuild.has(this.currentPageViewed)) { this.beforeSiteGenerate(); - this.rebuildPageBeingViewed(this.currentPageViewed); + this.rebuildPagesBeingViewed(this.currentPageViewed); return true; } @@ -751,7 +751,7 @@ class Site { } } - async _rebuildPageBeingViewed(normalizedUrls) { + async _rebuildPagesBeingViewed(normalizedUrls) { const startTime = new Date(); const normalizedUrlArray = Array.isArray(normalizedUrls) ? normalizedUrls : [normalizedUrls]; const uniqueUrls = _.uniq(normalizedUrlArray); @@ -775,7 +775,7 @@ class Site { this._setTimestampVariable(); await this.runPageGenerationTasks([pageGenerationTask]); await this.writeSiteData(); - Site.calculateBuildTimeForRebuildPageBeingViewed(startTime); + Site.calculateBuildTimeForRebuildPagesBeingViewed(startTime); } catch (err) { await Site.rejectHandler(err, [this.tempPath, this.outputPath]); } @@ -784,9 +784,9 @@ class Site { } /** - * Helper function for _rebuildPageBeingViewed(). + * Helper function for _rebuildPagesBeingViewed(). */ - static calculateBuildTimeForRebuildPageBeingViewed(startTime) { + static calculateBuildTimeForRebuildPagesBeingViewed(startTime) { const endTime = new Date(); const totalBuildTime = (endTime - startTime) / 1000; return logger.info(`Lazy website regeneration complete! Total build time: ${totalBuildTime}s`); @@ -851,7 +851,7 @@ class Site { if (this.onePagePath) { this.mapAddressablePagesToPages(this.addressablePages || [], this.getFavIconUrl()); - await this.rebuildPageBeingViewed(this.currentOpenedPages); + await this._rebuildPagesBeingViewed(this.currentOpenedPages); await this.lazyBuildAllPagesNotViewed(this.currentOpenedPages); return; } @@ -1638,7 +1638,7 @@ class Site { */ Site.prototype.buildAsset = delay(Site.prototype._buildMultipleAssets, 1000); -Site.prototype.rebuildPageBeingViewed = delay(Site.prototype._rebuildPageBeingViewed, 1000); +Site.prototype.rebuildPagesBeingViewed = delay(Site.prototype._rebuildPagesBeingViewed, 1000); /** * Rebuild pages that are affected by changes in filePaths From fdaa849c1cc5fcb20dc6ad4cfedabf4c67f43f08 Mon Sep 17 00:00:00 2001 From: Ryo Armanda Date: Thu, 22 Apr 2021 20:30:50 +0800 Subject: [PATCH 5/5] Move multiple-page build comment to changeCurrentPage call --- packages/core/src/Site/index.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/core/src/Site/index.js b/packages/core/src/Site/index.js index bd20d2dd57..5229112f0e 100644 --- a/packages/core/src/Site/index.js +++ b/packages/core/src/Site/index.js @@ -207,6 +207,11 @@ class Site { if (this.toRebuild.has(this.currentPageViewed)) { this.beforeSiteGenerate(); + /* + Lazy loading only builds the page being viewed, but the user may be quick enough + to trigger multiple page builds before the first one has finished building, + hence we need to take this into account by using the delayed variant of the method. + */ this.rebuildPagesBeingViewed(this.currentPageViewed); return true; } @@ -758,12 +763,6 @@ class Site { uniqueUrls.forEach(normalizedUrl => logger.info( `Building ${normalizedUrl} as some of its dependencies were changed since the last visit`)); - /* - Lazy loading only builds the page being viewed, but the user may be quick enough - to trigger multiple page builds before the first one has finished building, - hence we need to take this into account. - */ - const pagesToRebuild = this.pages.filter(page => uniqueUrls.some(pageUrl => FsUtil.removeExtension(page.pageConfig.sourcePath) === pageUrl)); const pageGenerationTask = {