Building for Production
Building your application for production requires specific configurations and best practices to ensure optimal performance, security, and maintainability. In this lesson, we will explore how to configure Turbopack for production builds and cover essential best practices for preparing your application for deployment.
Production-Specific Configurations
Set Mode to Production: Set the mode to
production
in your Turbopack configuration. This enables built-in optimizations such as minification and tree shaking.javascript module.exports = { mode: 'production', // Enable production optimizations entry: './src/index.js', output: { filename: '[name].[contenthash].js', path: path.resolve(__dirname, 'dist'), publicPath: '/' } };
Optimize Output: Use content hashes in filenames to enable long-term caching and ensure that updated files are fetched by the browser.
javascript output: { filename: '[name].[contenthash].js', path: path.resolve(__dirname, 'dist'), publicPath: '/', },
Minify CSS: Use
css-minimizer-webpack-plugin
to minify CSS files for smaller bundle sizes.javascript const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); module.exports = { optimization: { minimizer: [ `...`, // Include the default minimizers (e.g., Terser for JS) new CssMinimizerPlugin() ] } };
Extract CSS: Use
mini-css-extract-plugin
to extract CSS into separate files, which can be loaded in parallel with JavaScript.javascript const MiniCssExtractPlugin = require('mini-css-extract-plugin'); module.exports = { module: { rules: [ { test: /\.css$/, use: [MiniCssExtractPlugin.loader, 'css-loader'] } ] }, plugins: [ new MiniCssExtractPlugin({ filename: '[name].[contenthash].css' }) ] };
Optimize Images: Use
image-webpack-loader
to optimize image files.javascript module.exports = { module: { rules: [ { test: /\.(png|jpg|gif|svg)$/, use: [ 'file-loader', { loader: 'image-webpack-loader', options: { mozjpeg: { progressive: true, quality: 65 }, optipng: { enabled: true }, pngquant: { quality: [0.65, 0.9], speed: 4 }, gifsicle: { interlaced: false }, webp: { quality: 75 } } } ] } ] } };
Best Practices for Production Builds
Tree Shaking: Ensure tree shaking is enabled to remove unused code from your bundles.
javascript optimization: { usedExports: true, // Enable tree shaking },
Split Code: Use code splitting to load only the necessary code for each page or feature, improving initial load times.
javascript optimization: { splitChunks: { chunks: 'all', }, };
Lazy Loading: Implement lazy loading for non-critical resources to improve initial load times.
javascript // Example of lazy loading a module document.getElementById('loadButton').addEventListener('click', () => { import('./module').then((module) => { module.load(); }); });
Environment Variables: Use environment variables to manage configuration differences between development and production environments.
javascript const Dotenv = require('dotenv-webpack'); module.exports = { plugins: [ new Dotenv({ path: './.env.production' // Load production environment variables }) ] };
HTTPS and Security Headers: Configure your web server to use HTTPS and set security headers to protect your application.
apache # Apache example <IfModule mod_headers.c> Header always set Content-Security-Policy "default-src 'self';" Header always set X-Content-Type-Options "nosniff" Header always set X-Frame-Options "DENY" Header always set X-XSS-Protection "1; mode=block" </IfModule>
nginx # Nginx example server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /path/to/your/certificate.pem; ssl_certificate_key /path/to/your/key.pem; add_header Content-Security-Policy "default-src 'self';"; add_header X-Content-Type-Options "nosniff"; add_header X-Frame-Options "DENY"; add_header X-XSS-Protection "1; mode=block"; }
Example: Comprehensive Production Configuration
Here’s an example of a comprehensive Turbopack configuration for production:
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const Dotenv = require('dotenv-webpack');
module.exports = {
mode: 'production',
entry: {
app: './src/index.js'
},
output: {
filename: '[name].[contenthash].js',
path: path.resolve(__dirname, 'dist'),
publicPath: '/'
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: 'babel-loader'
},
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader']
},
{
test: /\.(png|jpg|gif|svg)$/,
use: [
'file-loader',
{
loader: 'image-webpack-loader',
options: {
mozjpeg: {
progressive: true,
quality: 65
},
optipng: {
enabled: true
},
pngquant: {
quality: [0.65, 0.9],
speed: 4
},
gifsicle: {
interlaced: false
},
webp: {
quality: 75
}
}
}
]
}
]
},
optimization: {
usedExports: true,
minimizer: [
`...`, // Include the default minimizers (e.g., Terser for JS)
new CssMinimizerPlugin()
],
splitChunks: {
chunks: 'all'
}
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
template: './src/index.html',
filename: 'index.html'
}),
new MiniCssExtractPlugin({
filename: '[name].[contenthash].css'
}),
new Dotenv({
path: './.env.production'
})
]
};
// src/index.js
import './styles.css';
function component() {
const element = document.createElement('div');
element.innerHTML = 'Hello, Turbopack!';
return element;
}
document.body.appendChild(component());
Production Mode:
mode: 'production'
enables optimizations for production.
Content Hashing:
- Filenames include content hashes for long-term caching.
CSS Extraction and Minification:
MiniCssExtractPlugin
extracts CSS into separate files.CssMinimizerPlugin
minifies CSS files.
Image Optimization:
image-webpack-loader
optimizes image files.
Environment Variables:
Dotenv
loads production-specific environment variables.
With these configurations and best practices, you can build a highly optimized and production-ready application using Turbopack.