Skip to main content

Gasket Next.js Pages Template

A modern TypeScript web application template built with Gasket, Next.js Pages Router, HTTPS proxy, and internationalization support.

Overview​

This template provides a production-ready starting point for building web applications using:

  • Next.js 15 with Pages Router - React framework with file-based routing
  • HTTPS Proxy - Secure development environment with proxy server
  • TypeScript - Type-safe development with modern JavaScript features
  • Gasket - Plugin architecture for extensible applications
  • React Intl - Internationalization with multi-language support
  • Vitest - Lightning-fast unit testing with React Testing Library

Features​

  • ✅ Next.js Pages Router with TypeScript support
  • ✅ HTTPS development proxy for secure local testing
  • ✅ Internationalization pre-configured with English and French
  • ✅ Server-side rendering with Gasket data injection
  • ✅ API routes support via Next.js API directory
  • ✅ Testing setup with Vitest, React Testing Library, and JSDOM
  • ✅ ESLint configuration with React and Next.js rules
  • ✅ Development tools with hot reloading and TypeScript watching
  • ✅ Production build optimization

Quick Start​

Create a new Next.js Pages Router project:

npx create-gasket-app@latest my-app --template @gasket/template-nextjs-pages

Project Structure​

my-app/
├── pages/ # Next.js Pages Router
│ ├── _app.tsx # App component wrapper
│ ├── _document.ts # Document component
│ └── index.tsx # Home page component
├── components/ # React components
│ └── head.tsx # Reusable head component
├── locales/ # Internationalization files
│ ├── en-US.json # English translations
│ └── fr-FR.json # French translations
├── test/ # Test files
├── gasket.ts # Gasket configuration
├── server.ts # HTTPS proxy server
├── intl.ts # Internationalization manager
├── next.config.js # Next.js configuration
├── tsconfig.json # TypeScript configuration
└── dist/ # Built server files

Available Scripts​

ScriptDescription
npm run localStart development with HTTPS proxy, TypeScript watch, and Next.js dev server
npm run buildBuild TypeScript proxy server and Next.js application
npm run startStart production servers (HTTPS proxy + Next.js)
npm run previewBuild and start production servers
npm run testRun unit tests
npm run test:watchRun tests in watch mode
npm run test:coverageRun tests with coverage report
npm run docsGenerate and serve documentation
npm run lintCheck code style and quality

Development​

HTTPS Development Proxy​

The template includes an HTTPS proxy server that runs alongside Next.js during development:

  • HTTPS Proxy: https://localhost:80
  • Next.js Dev Server: http://localhost:3000
  • Proxy Target: Routes HTTPS traffic to the Next.js dev server

This allows you to:

  • Test HTTPS features locally (secure cookies, service workers, etc.)
  • Simulate production environment with secure connections
  • Debug SSL/TLS issues during development
  • Test PWA features that require HTTPS

Development Setup​

Three concurrent processes run during development:

  1. TypeScript Watch - Compiles server TypeScript files on change
  2. HTTPS Proxy Server - Provides secure development environment
  3. Next.js Dev Server - Hot reloads React components and pages

Pages Router Architecture​

This template uses Next.js Pages Router, which provides:

  • File-based routing in the pages/ directory
  • _app.tsx for global app wrapper and providers
  • _document.ts for HTML document structure
  • Data fetching with getServerSideProps, getStaticProps, and getInitialProps
  • API routes in pages/api/ directory
  • Automatic code splitting per page

Internationalization​

The template includes full i18n support with React Intl and @gasket/react-intl.

Pages and Components​

App Component (pages/_app.tsx)​

The app component wraps all pages and includes:

  • IntlProvider for internationalization
  • Router-based locale detection
  • Global providers and context

Document Component (pages/_document.ts)​

Enhanced with Gasket data injection using withGasketData:

import Document from 'next/document';
import { withGasketData } from '@gasket/nextjs/document';
import gasket from '@/gasket';

export default withGasketData(gasket)(Document);

Adding New Pages​

Create new pages in the pages/ directory:

// pages/about.tsx
import Head from '../components/head';
import { FormattedMessage } from 'react-intl';

export default function AboutPage() {
return (
<div>
<Head title="About" description="About our app" />
<h1><FormattedMessage id="about_title" /></h1>
</div>
);
}

API Routes​

Add API routes in pages/api/:

// pages/api/users.ts
import type { NextApiRequest, NextApiResponse } from 'next';

export default function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method === 'GET') {
res.status(200).json({ users: [] });
} else {
res.setHeader('Allow', ['GET']);
res.status(405).end(`Method ${req.method} Not Allowed`);
}
}

Data Fetching​

Use Next.js data fetching methods:

// Server-side rendering
export async function getServerSideProps() {
const data = await fetchData();
return { props: { data } };
}

// Static generation
export async function getStaticProps() {
const data = await fetchData();
return { props: { data }, revalidate: 60 };
}

// Client-side only
export async function getInitialProps() {
const data = await fetchData();
return { data };
}

Configuration​

The template includes these Gasket plugins by default:

  • @gasket/plugin-nextjs - Next.js integration
  • @gasket/plugin-https-proxy - HTTPS development proxy
  • @gasket/plugin-intl - Internationalization support
  • @gasket/plugin-webpack - Webpack configuration
  • @gasket/plugin-winston - Structured logging
  • @gasket/plugin-command - CLI command support

HTTPS Proxy Configuration​

Configure the proxy settings in gasket.ts:

export default makeGasket({
httpsProxy: {
protocol: 'http', // Protocol to proxy server
hostname: 'localhost', // Proxy hostname
port: 80, // Proxy port
target: {
host: 'localhost', // Target hostname
port: 3000 // Target port (Next.js dev server)
},
xfwd: true, // Add X-Forwarded-* headers
ws: true // Enable WebSocket proxying
}
});

Testing​

The template includes comprehensive testing setup:

  • Vitest - Fast test runner
  • React Testing Library - React component testing utilities
  • JSDOM - DOM simulation for server-side testing
  • TypeScript support - Type-safe tests

Write tests in the test/ directory:

import { render, screen } from '@testing-library/react';
import { IntlProvider } from 'react-intl';
import { describe, it, expect } from 'vitest';
import IndexPage from '@/pages/index';

const messages = {
gasket_welcome: 'Welcome to Gasket!',
gasket_learn: 'Learn Gasket',
gasket_edit_page: 'To get started, edit pages/index.js and save to reload.'
};

describe('IndexPage', () => {
it('renders welcome message', () => {
render(
<IntlProvider locale="en-US" messages={messages}>
<IndexPage />
</IntlProvider>
);
expect(screen.getByText('Welcome to Gasket!')).toBeInTheDocument();
});
});

Next Steps​

  • Add more pages in the pages/ directory
  • Create API routes in pages/api/
  • Customize the HTTPS proxy settings
  • Add additional languages for internationalization
  • Add database connections and authentication
  • Set up CI/CD pipeline
  • Add more comprehensive testing