guide

Web Performance Optimization: A Developer's Guide

Learn essential techniques for optimizing web application performance, from bundle splitting to image optimization and caching strategies.

Cristian Paredes
5 min read
#performance #optimization #web-development #javascript

Web Performance Optimization: A Developer's Guide

Web performance is crucial for user experience and business success. In this guide, we'll explore practical techniques to make your web applications faster and more efficient.

Why Performance Matters

  • User Experience: Faster sites provide better user experiences
  • SEO Rankings: Google considers page speed in search rankings
  • Conversion Rates: Every 100ms delay can reduce conversions by 1%
  • Mobile Users: Performance is even more critical on mobile devices

Core Web Vitals

Focus on Google's Core Web Vitals metrics:

Largest Contentful Paint (LCP)

Measures loading performance. Aim for LCP to occur within 2.5 seconds.

// Optimize LCP with resource hints
<link rel="preload" href="/hero-image.jpg" as="image">
<link rel="preconnect" href="https://fonts.googleapis.com">

First Input Delay (FID)

Measures interactivity. Aim for FID of less than 100 milliseconds.

// Use code splitting to reduce main thread blocking
const LazyComponent = defineAsyncComponent(
  () => import("./components/HeavyComponent.vue")
);
// It's very helpful use async components

Cumulative Layout Shift (CLS)

Measures visual stability. Aim for CLS of less than 0.1.

/* Reserve space for images to prevent layout shift */
.image-container {
  aspect-ratio: 16 / 9;
  background-color: #f0f0f0;
}

Bundle Optimization

Code Splitting

Split your code into smaller chunks:

// Route-based splitting in Nuxt
const routes = [
  {
    path: "/dashboard",
    component: () => import("~/pages/dashboard.vue"),
  },
];

// Component-based splitting
const HeavyChart = defineAsyncComponent(
  () => import("~/components/HeavyChart.vue")
);

Tree Shaking

Remove unused code from your bundles:

// Import only what you need
import { debounce } from "lodash-es";
// Instead of
import * as lodash from "lodash";

Image Optimization

Modern Formats

Use modern image formats like WebP and AVIF:

<template>
  <NuxtImg
    src="/hero.jpg"
    alt="Hero image"
    format="webp"
    quality="80"
    sizes="sm:100vw md:50vw lg:400px"
  />
</template>

Lazy Loading

Implement lazy loading for images:

<template>
  <NuxtImg src="/image.jpg" loading="lazy" placeholder="/placeholder.jpg" />
</template>

Caching Strategies

HTTP Caching

Set appropriate cache headers:

// nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    routeRules: {
      "/api/**": {
        headers: { "Cache-Control": "max-age=300" },
      },
      "/assets/**": {
        headers: { "Cache-Control": "max-age=31536000" },
      },
    },
  },
});

Service Worker Caching

Implement service worker for offline caching:

// Use Nuxt PWA module
export default defineNuxtConfig({
  modules: ["@vite-pwa/nuxt"],
  pwa: {
    strategies: "generateSW",
    workbox: {
      runtimeCaching: [
        {
          urlPattern: /^https:\/\/api\./,
          handler: "StaleWhileRevalidate",
          options: {
            cacheName: "api-cache",
            expiration: {
              maxEntries: 100,
              maxAgeSeconds: 60 * 60 * 24, // 24 hours
            },
          },
        },
      ],
    },
  },
});

Performance Monitoring

Web Vitals Tracking

Monitor your Core Web Vitals:

// composables/useWebVitals.ts
export function useWebVitals() {
  const vitals = ref({});

  onMounted(async () => {
    const { getCLS, getFID, getFCP, getLCP, getTTFB } = await import(
      "web-vitals"
    );

    getCLS((metric) => (vitals.value.cls = metric.value));
    getFID((metric) => (vitals.value.fid = metric.value));
    getLCP((metric) => (vitals.value.lcp = metric.value));
  });

  return { vitals };
}

Performance Budget

Set performance budgets in your build process:

// nuxt.config.ts
export default defineNuxtConfig({
  vite: {
    build: {
      rollupOptions: {
        output: {
          manualChunks: {
            vendor: ["vue", "vue-router"],
            ui: ["@nuxt/ui"],
          },
        },
      },
    },
  },
});

Tools and Resources

Performance Testing Tools

  • Lighthouse: Built into Chrome DevTools
  • WebPageTest: Comprehensive performance testing
  • GTmetrix: Performance monitoring and analysis
  • Pingdom: Website speed testing

Development Tools

  • Nuxt DevTools: Built-in performance insights
  • Vue DevTools: Component performance profiling
  • Bundle Analyzer: Visualize bundle composition

Conclusion

Web performance optimization is an ongoing process that requires attention to detail and continuous monitoring. By implementing these techniques and regularly measuring your application's performance, you can provide users with fast, responsive experiences that drive engagement and conversions.

Remember: measure first, optimize second, and always test the impact of your changes!

© 2026 Cristian Stalin Paredes Sánchez