Skip to content

Commit

Permalink
Also re-add timings
Browse files Browse the repository at this point in the history
  • Loading branch information
drwpow committed Oct 20, 2021
1 parent d5f1f60 commit 5b09f9f
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 14 deletions.
29 changes: 15 additions & 14 deletions packages/astro/src/core/build/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import vite, { ViteDevServer } from '../vite.js';
import { fileURLToPath } from 'url';
import { createVite } from '../create-vite.js';
import { pad } from '../dev/util.js';
import { defaultLogOptions, levels, warn } from '../logger.js';
import { debug, defaultLogOptions, levels, timerMessage, warn } from '../logger.js';
import { ssr } from '../ssr/index.js';
import { generatePaginateFunction } from '../ssr/paginate.js';
import { createRouteManifest, validateGetStaticPathsModule, validateGetStaticPathsResult } from '../ssr/routing.js';
Expand Down Expand Up @@ -53,9 +53,10 @@ class AstroBuilder {

/** Build all pages */
async build() {
const start = performance.now();
const timer: Record<string, number> = {}; // keep track of performance timers

// 1. initialize fresh Vite instance
timer.viteStart = performance.now();
const { logging, origin } = this;
const viteConfig = await createVite(
{
Expand All @@ -70,8 +71,10 @@ class AstroBuilder {
);
const viteServer = await vite.createServer(viteConfig);
this.viteServer = viteServer;
debug(logging, 'build', timerMessage('Vite started', timer.viteStart));

// 2. get all routes
timer.renderStart = performance.now();
const assets: Record<string, string> = {}; // additional assets to be written
const allPages: Record<string, RouteData & { paths: string[] }> = {};

Expand Down Expand Up @@ -121,8 +124,10 @@ class AstroBuilder {
)
)
);
debug(logging, 'build', timerMessage('All pages rendered', timer.renderStart));

// 3. build with Vite
timer.buildStart = performance.now();
await vite.build({
logLevel: 'error',
mode: 'production',
Expand All @@ -144,38 +149,36 @@ class AstroBuilder {
root: viteConfig.root,
server: viteConfig.server,
});
debug(logging, 'build', timerMessage('Vite build finished', timer.buildStart));

// 4. write assets to disk
timer.assetsStart = performance.now();
Object.keys(assets).map((k) => {
if (!assets[k]) return;
const filePath = new URL(`file://${k}`);
fs.mkdirSync(new URL('./', filePath), { recursive: true });
fs.writeFileSync(filePath, assets[k], 'utf8');
delete assets[k]; // free up memory
});
debug(logging, 'build', timerMessage('Additional assets copied', timer.assetsStart));

// 5. build sitemap
let sitemapTime = 0;
timer.sitemapStart = performance.now();
if (this.config.buildOptions.sitemap && this.config.buildOptions.site) {
const sitemapStart = performance.now();
const sitemap = generateSitemap(input.map(({ name }) => new URL(`/${name}`, this.config.buildOptions.site).href));
const sitemapPath = new URL('./sitemap.xml', this.config.dist);
await fs.promises.mkdir(new URL('./', sitemapPath), { recursive: true });
await fs.promises.writeFile(sitemapPath, sitemap, 'utf8');
sitemapTime = performance.now() - sitemapStart;
}
debug(logging, 'build', timerMessage('Sitemap built', timer.sitemapStart));

// 6. clean up
await viteServer.close();

// 7. log output
if (logging.level && levels[logging.level] <= levels['info']) {
await this.printStats({
cwd: this.config.dist,
pageCount: input.length,
pageTime: Math.round(performance.now() - start),
sitemapTime,
});
await this.printStats({ cwd: this.config.dist, pageCount: input.length });
}
}

Expand All @@ -196,12 +199,11 @@ class AstroBuilder {
}

/** Stats */
private async printStats({ cwd, pageTime, pageCount, sitemapTime }: { cwd: URL; pageTime: number; pageCount: number; sitemapTime: number }) {
const end = Math.round(performance.now() - pageTime);
private async printStats({ cwd, pageCount }: { cwd: URL; pageCount: number }) {
const [js, html] = await Promise.all([profileJS({ cwd, entryHTML: new URL('./index.html', cwd) }), profileHTML({ cwd })]);

/* eslint-disable no-console */
console.log(`${pad(bold(cyan('Done')), 70)}${dim(` ${pad(`${end}ms`, 8, 'left')}`)}
console.log(`${bold(cyan('Done'))}
Pages (${pageCount} total)
${green(`✔ All pages under ${kb(html.maxSize)}`)}
JS
Expand All @@ -213,6 +215,5 @@ CSS
Images
${green(`✔ All images under 50 kB`)}
`);
if (sitemapTime > 0) console.log(`Sitemap\n ${green(`✔ Built in ${sitemapTime}`)}`);
}
}
7 changes: 7 additions & 0 deletions packages/astro/src/core/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -185,3 +185,10 @@ if (process.argv.includes('--verbose')) {
} else {
defaultLogLevel = 'info';
}

/** Print out a timer message for debug() */
export function timerMessage(message: string, startTime: number = performance.now()) {
let timeDiff = performance.now() - startTime;
let timeDisplay = timeDiff < 750 ? `${Math.round(timeDiff)}ms` : `${(timeDiff / 1000).toFixed(1)}s`;
return `${message}: ${dim(timeDisplay)}]`;
}

0 comments on commit 5b09f9f

Please sign in to comment.