1. Testing Strategies
a. Unit Testing with Jest
Set up Jest for testing individual functions and components:
Install dependencies:
npm install --save-dev jest babel-jest @babel/preset-env @babel/preset-reactConfigure Babel (
babel.config.js):module.exports = { presets: ['next/babel'] };Add tests (
__tests__/sum.test.js):import sum from '../utils/sum'; test('adds 1 + 2 to equal 3', () => { expect(sum(1, 2)).toBe(3); });Run tests:
npx jest
b. Component Testing with React Testing Library
Test React components in isolation:
Install:
npm install --save-dev @testing-library/react @testing-library/jest-domExample (
__tests__/button.test.js):import { render, screen, fireEvent } from '@testing-library/react'; import Button from '../components/Button'; test('renders button and handles click', () => { const handleClick = jest.fn(); render(<Button onClick={handleClick}>Click Me</Button>); const btn = screen.getByText(/Click Me/i); fireEvent.click(btn); expect(handleClick).toHaveBeenCalledTimes(1); });
c. End-to-End Testing with Cypress
Simulate user flows in a real browser:
Install:
npm install --save-dev cypressConfigure: add
cypress.json:{ "baseUrl": "http://localhost:3000" }Write a test (
cypress/integration/home.spec.js):describe('Home Page', () => { it('loads and displays welcome message', () => { cy.visit('/'); cy.contains('Welcome to Next.js'); }); });Run:
npx cypress open
2. Performance Optimization
a. Automatic Code Splitting
Every page only loads necessary JS:
Dynamic Imports for components:
import dynamic from 'next/dynamic'; const Chart = dynamic(() => import('../components/Chart'), { loading: () => <p>Loading chart...</p>, ssr: false, });
b. Image Optimization
Use the built-in <Image> component:
import Image from 'next/image';
export default function Avatar() {
return <Image src="/me.png" width={200} height={200} alt="My Avatar" />;
}c. Font Optimization
Host fonts locally or use next/font:
import { Inter } from 'next/font/google';
const inter = Inter({ subsets: ['latin'] });
export default function Home() {
return <div className={inter.className}>Hello with Inter</div>;
}d. Prefetching and Link Optimization
Next.js prefetches pages linked with <Link> when in viewport:
import Link from 'next/link';
<Link href="/about" prefetch={false}>About</Link>e. Bundle Analysis
Visualize and reduce bundle size:
Install:
npm install --save-dev @next/bundle-analyzerConfigure (
next.config.js):const withBundleAnalyzer = require('@next/bundle-analyzer')({ enabled: process.env.ANALYZE === 'true', }); module.exports = withBundleAnalyzer({});Run:
ANALYZE=true npm run build
f. Lighthouse Audits
Use Chrome DevTools or CLI:
npm install -g lighthouse
lighthouse https://your-deployment-url.com --viewg. Caching and CDN
Deploy on Vercel or use a CDN (e.g., Cloudflare) for static assets caching and edge functions.
h. Static Export (Sitemap & Robots)
Generate sitemap and robots.txt to improve SEO:
npm install --save-dev next-sitemapAdd next-sitemap.js:
module.exports = {
siteUrl: process.env.SITE_URL || 'https://example.com',
generateRobotsTxt: true,
};With solid testing in place and these optimizations, your Next.js application will be both reliable and lightning-fast. In Next Article, we’ll explore internationalization (i18n) and localization.