refactor(build): own all task spinners in build()

bundle() and generateSitemap() are plain workers now; build() wraps
them in tasks alongside render. Keeps the MPA asset copies and the
MPA client build under the bundles spinner instead of running after
it resolves, and skips the sitemap spinner when sitemap generation
is off.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
pull/5342/head
Divyansh Singh 1 month ago
parent 9dfa3bf524
commit a53982f937

@ -56,7 +56,10 @@ export async function build(
const pageMetaMap = Object.create(null) as Record<string, PageMeta> const pageMetaMap = Object.create(null) as Record<string, PageMeta>
try { try {
const out = await bundle(siteConfig, buildOptions, pageMetaMap) const out = await task(
'building client + server bundles',
bundle.bind(null, siteConfig, buildOptions, pageMetaMap)
)
if (process.env.BUNDLE_ONLY) { if (process.env.BUNDLE_ONLY) {
return return
@ -74,7 +77,13 @@ export async function build(
} }
} }
await generateSitemap(siteConfig, pageMetaMap) if (siteConfig.sitemap?.hostname) {
await task(
'generating sitemap',
generateSitemap.bind(null, siteConfig, pageMetaMap)
)
}
await siteConfig.buildEnd?.(siteConfig) await siteConfig.buildEnd?.(siteConfig)
clearCache() clearCache()

@ -14,7 +14,6 @@ import { APP_PATH } from '../alias'
import type { SiteConfig } from '../config' import type { SiteConfig } from '../config'
import { createVitePressPlugin, type PageMeta } from '../plugin' import { createVitePressPlugin, type PageMeta } from '../plugin'
import { escapeRegExp, sanitizeFileName, slash } from '../shared' import { escapeRegExp, sanitizeFileName, slash } from '../shared'
import { task } from '../utils/task'
import { buildMPAClient } from './buildMPAClient' import { buildMPAClient } from './buildMPAClient'
// https://github.com/vitejs/vite/blob/a55d0b34400e3360c4100d05e422ae9cf10fa07b/packages/vite/src/node/constants.ts#L50 // https://github.com/vitejs/vite/blob/a55d0b34400e3360c4100d05e422ae9cf10fa07b/packages/vite/src/node/constants.ts#L50
@ -135,20 +134,12 @@ export async function bundle(
configFile: config.vite?.configFile configFile: config.vite?.configFile
}) })
let { clientResult, serverResult } = await task( let clientResult = config.mpa
'building client + server bundles', ? null
async () => { : ((await build(await resolveViteConfig(false))) as Rolldown.RolldownOutput)
const clientResult = config.mpa const serverResult = (await build(
? null await resolveViteConfig(true)
: ((await build( )) as Rolldown.RolldownOutput
await resolveViteConfig(false)
)) as Rolldown.RolldownOutput)
const serverResult = (await build(
await resolveViteConfig(true)
)) as Rolldown.RolldownOutput
return { clientResult, serverResult }
}
)
if (config.mpa) { if (config.mpa) {
// in MPA mode, we need to copy over the non-js asset files from the // in MPA mode, we need to copy over the non-js asset files from the

@ -10,68 +10,63 @@ import {
} from 'sitemap' } from 'sitemap'
import type { SiteConfig } from '../config' import type { SiteConfig } from '../config'
import type { PageMeta } from '../plugin' import type { PageMeta } from '../plugin'
import { task } from '../utils/task'
export async function generateSitemap( export async function generateSitemap(
siteConfig: SiteConfig, siteConfig: SiteConfig,
pageMetaMap: Record<string, PageMeta> pageMetaMap: Record<string, PageMeta>
) { ) {
if (!siteConfig.sitemap?.hostname) return const locales = siteConfig.userConfig.locales || {}
const defaultLang =
locales.root?.lang || siteConfig.userConfig.lang || 'en-US'
await task('generating sitemap', async () => { // locale directories whose pages are translations of each other
const locales = siteConfig.userConfig.locales || {} const localeDirs = Object.keys(locales).filter(
const defaultLang = (locale) => locale !== 'root' && locales[locale].lang
locales.root?.lang || siteConfig.userConfig.lang || 'en-US' )
// locale directories whose pages are translations of each other // group each page with its translations under a locale-independent key
const localeDirs = Object.keys(locales).filter( const pageGroups: Record<
(locale) => locale !== 'root' && locales[locale].lang string,
) { lang: string; url: string; lastmod?: number }[]
> = {}
// group each page with its translations under a locale-independent key for (const sourcePage of siteConfig.pages) {
const pageGroups: Record< const page = siteConfig.rewrites.map[sourcePage] || sourcePage
string, const localeDir = page.split('/')[0]
{ lang: string; url: string; lastmod?: number }[]
> = {}
for (const sourcePage of siteConfig.pages) { const url = page
const page = siteConfig.rewrites.map[sourcePage] || sourcePage .replace(/(^|\/)index\.md$/, '$1')
const localeDir = page.split('/')[0] .replace(/\.md$/, siteConfig.cleanUrls ? '' : '.html')
const url = page const key = localeDirs.includes(localeDir)
.replace(/(^|\/)index\.md$/, '$1') ? page.slice(localeDir.length + 1)
.replace(/\.md$/, siteConfig.cleanUrls ? '' : '.html') : page
const key = localeDirs.includes(localeDir) ;(pageGroups[key] ??= []).push({
? page.slice(localeDir.length + 1) lang: locales[localeDir]?.lang || defaultLang,
: page url,
lastmod: pageMetaMap[page]?.lastUpdated || undefined
})
}
;(pageGroups[key] ??= []).push({ // translated pages link to all their variants (including themselves)
lang: locales[localeDir]?.lang || defaultLang, let items: SitemapItem[] = Object.values(pageGroups).flatMap((variants) =>
url, variants.length < 2
lastmod: pageMetaMap[page]?.lastUpdated || undefined ? { url: variants[0].url, lastmod: variants[0].lastmod }
}) : variants.map(({ url, lastmod }) => ({
} url,
lastmod,
links: variants
}))
)
items = (await siteConfig.sitemap?.transformItems?.(items)) || items
// translated pages link to all their variants (including themselves) const sitemapPath = path.join(siteConfig.outDir, 'sitemap.xml')
let items: SitemapItem[] = Object.values(pageGroups).flatMap((variants) => const sitemapStream = new SitemapStream(siteConfig.sitemap)
variants.length < 2
? { url: variants[0].url, lastmod: variants[0].lastmod }
: variants.map(({ url, lastmod }) => ({
url,
lastmod,
links: variants
}))
)
items = (await siteConfig.sitemap?.transformItems?.(items)) || items
const sitemapPath = path.join(siteConfig.outDir, 'sitemap.xml') items.forEach((item) => sitemapStream.write(item))
const sitemapStream = new SitemapStream(siteConfig.sitemap) sitemapStream.end()
await pipeline(sitemapStream, fs.createWriteStream(sitemapPath))
items.forEach((item) => sitemapStream.write(item))
sitemapStream.end()
await pipeline(sitemapStream, fs.createWriteStream(sitemapPath))
})
} }
// ============================== Patched Types =============================== // ============================== Patched Types ===============================

Loading…
Cancel
Save