1
0
mirror of synced 2025-12-25 02:17:36 -05:00

Merge branch 'middleware-perf-part2' of github.com:github/docs-internal into middleware-perf

This commit is contained in:
Sarah Schneider
2021-05-21 12:24:12 -04:00
5 changed files with 55 additions and 53 deletions

View File

@@ -1,7 +1,6 @@
const fs = require('fs').promises
const path = require('path')
const Page = require('./page')
const { sortBy } = require('lodash')
const basePath = path.posix.join(__dirname, '..', 'content')
module.exports = async function createTree (originalPath, langObj) {
@@ -42,13 +41,9 @@ module.exports = async function createTree (originalPath, langObj) {
// Process frontmatter children recursively.
if (item.page.children) {
item.childPages = sortBy(
(await Promise.all(item.page.children
.map(async (child) => await createTree(path.posix.join(originalPath, child), langObj))))
.filter(Boolean),
// Sort by the ordered array of `children` in the frontmatter.
item.page.children
)
item.childPages = (await Promise.all(item.page.children
.map(async (child) => await createTree(path.posix.join(originalPath, child), langObj))))
.filter(Boolean)
}
return item

View File

@@ -1,9 +1,13 @@
const path = require('path')
const languages = require('./languages')
const versions = Object.keys(require('./all-versions'))
const enterpriseServerVersions = versions.filter(v => v.startsWith('enterprise-server@'))
const createTree = require('./create-tree')
const renderContent = require('./render-content')
const loadSiteData = require('./site-data')
const nonEnterpriseDefaultVersion = require('./non-enterprise-default-version')
const englishPath = path.posix.join(__dirname, '..', 'content')
const renderOpts = { textOnly: true, encodeEntities: true }
/**
* We only need to initialize pages _once per language_ since pages don't change per version. So we do that
@@ -33,7 +37,8 @@ async function loadUnversionedTree () {
*
* Order of languages and versions doesn't matter, but order of child page arrays DOES matter (for navigation).
*/
async function loadSiteTree (unversionedTree) {
async function loadSiteTree (unversionedTree, siteData) {
const site = siteData || await loadSiteData()
const rawTree = Object.assign({}, (unversionedTree || await loadUnversionedTree()))
const siteTree = {}
@@ -43,7 +48,7 @@ async function loadSiteTree (unversionedTree) {
// in every version...
await Promise.all(versions.map(async (version) => {
// "version" the pages.
treePerVersion[version] = versionPages(Object.assign({}, rawTree[langCode]), version)
treePerVersion[version] = await versionPages(Object.assign({}, rawTree[langCode]), version, langCode, siteData)
}))
siteTree[langCode] = treePerVersion
@@ -52,20 +57,56 @@ async function loadSiteTree (unversionedTree) {
return siteTree
}
// This step can't be asynchronous because the order of child pages matters.
function versionPages (obj, version) {
async function versionPages (obj, version, langCode, siteData) {
// Add a versioned href as a convenience for use in layouts.
obj.href = obj.page.permalinks
.find(pl => pl.pageVersion === version || (pl.pageVersion === 'homepage' && version === nonEnterpriseDefaultVersion))
.href
const context = {
currentLanguage: langCode,
currentVersion: version,
enterpriseServerVersions,
site: site[langCode].site
}
// Render any titles, short titles, and intros that contain Liquid.
// Note the Liquid parseAndRender method is MUCH faster than renderContent or renderProp.
obj.renderedFullTitle = obj.page.title.includes('{')
? await renderContent.liquid.parseAndRender(obj.page.title, context, renderOpts)
: obj.page.title
if (obj.page.shortTitle) {
obj.renderedShortTitle = obj.page.shortTitle.includes('{')
? await renderContent.liquid.parseAndRender(obj.page.shortTitle, context, renderOpts)
: obj.page.shortTitle
}
if (obj.page.intro) {
obj.renderedIntro = obj.page.intro.includes('{')
? await renderContent.liquid.parseAndRender(obj.page.intro, context, renderOpts)
: obj.page.intro
}
// Surface any Liquid within Liquid that may not have been parsed, since we are not doing
// parsing round trips above in order to protect our warm-server performance.
if (obj.renderedFullTitle.includes('}')) {
console.error(`WARNING: found Liquid in parsed title on ${obj.page.fullPath}`)
}
if (obj.renderedShortTitle && obj.renderedShortTitle.includes('}')) {
console.error(`WARNING: found Liquid in parsed short title on ${obj.page.fullPath}`)
}
if (obj.renderedIntro && obj.renderedIntro.includes('}')) {
console.error(`WARNING: found Liquid in parsed intro on ${obj.page.fullPath}`)
}
if (!obj.childPages) return obj
const versionedChildPages = obj.childPages
const versionedChildPages = await Promise.all(obj.childPages
// Drop child pages that do not apply to the current version.
.filter(childPage => childPage.page.applicableVersions.includes(version))
// Version the child pages recursively.
.map(childPage => versionPages(Object.assign({}, childPage), version))
.map(async (childPage) => await versionPages(Object.assign({}, childPage), version, langCode, siteData)))
obj.childPages = [...versionedChildPages]

View File

@@ -44,8 +44,12 @@ async function warmServer () {
unversionedTree = await dog.loadUnversionedTree()
}
if (!site) {
site = dog.loadSiteData()
}
if (!siteTree) {
siteTree = await dog.loadSiteTree(unversionedTree)
siteTree = await dog.loadSiteTree(unversionedTree, site)
}
if (!pageList) {
@@ -56,10 +60,6 @@ async function warmServer () {
pageMap = await dog.loadPageMap(pageList)
}
if (!site) {
site = dog.loadSiteData()
}
if (!redirects) {
redirects = await dog.loadRedirects(pageList)
}