Skip to content

Instantly share code, notes, and snippets.

@pi0
Last active July 31, 2025 11:50
Show Gist options
  • Save pi0/31a67fdb637eb945904a257add1dce97 to your computer and use it in GitHub Desktop.
Save pi0/31a67fdb637eb945904a257add1dce97 to your computer and use it in GitHub Desktop.
const nuxtBuildMonitor = async (_, nuxt) => {
const timings = {} as Record<string, number>;
const os = await import('node:os');
const fs = await import('node:fs');
fs.writeFileSync('timings.log', '', 'utf8');
const log = (message: string) => {
const timeTag = `[${new Date().toLocaleTimeString()}]`;
console.log(`${timeTag} ${message}`);
fs.appendFileSync('timings.log', `${timeTag} ${message}\n`, 'utf8');
};
const fmtTime = (ms: number) => `${(ms / 1000).toFixed(2)}s`;
const fmtPercent = (value: number) => `${(value * 100).toFixed(2)}%`;
const fmtBytes = (bytes: number) => (bytes / 1024 / 1024).toFixed(2) + 'MB';
log(`--- System info ---`);
log(`OS: ${os.platform()} ${os.release()} (${os.arch()})`);
log(`Node.js: ${process.version}`);
const stats = () => {
const { heapUsed, heapTotal, rss } = process.memoryUsage();
log(`Heap used: ${fmtPercent(heapUsed / heapTotal)} \t RSS: ${fmtBytes(rss)}`);
};
nuxt.hooks.hook('build:before', () => {
timings.beforeBuild = performance.now();
log(`--- Build started ---`);
stats();
});
nuxt.hooks.hook('vite:compiled', () => {
log(`Vite compiled in ${fmtTime(performance.now() - timings.beforeBuild)}`);
stats();
});
nuxt.hooks.hook('nitro:build:before', () => {
timings.nitroBuildBefore = performance.now();
log(`--- Nitro build started ---`);
stats();
});
nuxt.hooks.hook('nitro:init', (nitro) => {
nitro.hooks.hook('compiled', () => {
const afterBuild = performance.now();
log(`Nitro build completed in ${fmtTime(afterBuild - timings.nitroBuildBefore)}`);
stats();
});
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment