148 lines
4.2 KiB
JavaScript
148 lines
4.2 KiB
JavaScript
import bundleAnalyzer from '@next/bundle-analyzer';
|
|
|
|
const withBundleAnalyzer = bundleAnalyzer({ enabled: process.env.ANALYZE === 'true' });
|
|
|
|
/** @type {import('next').NextConfig} */
|
|
const baseConfig = {
|
|
output: 'standalone',
|
|
// Enable compression for better performance
|
|
compress: true,
|
|
images: {
|
|
remotePatterns: [
|
|
{
|
|
protocol: "https",
|
|
hostname: "api.telegram.org",
|
|
},
|
|
{
|
|
protocol: "https",
|
|
hostname: "telegram.org",
|
|
},
|
|
...(process.env.API_HOSTNAME ? [{
|
|
protocol: "https",
|
|
hostname: process.env.API_HOSTNAME,
|
|
}] : []),
|
|
],
|
|
},
|
|
async rewrites() {
|
|
const apiBaseUrl = process.env.API_BASE_URL;
|
|
|
|
if (!apiBaseUrl || apiBaseUrl === 'undefined') {
|
|
console.warn('⚠️ API_BASE_URL not set! Set it to your backend domain');
|
|
console.warn('⚠️ Using localhost fallback - this will fail in production!');
|
|
return [
|
|
{
|
|
source: '/api/:path*',
|
|
destination: 'http://localhost:3001/api/:path*',
|
|
},
|
|
];
|
|
}
|
|
|
|
console.log(`🔗 API rewrites pointing to: ${apiBaseUrl}`);
|
|
return [
|
|
{
|
|
source: '/api/:path*',
|
|
destination: `${apiBaseUrl}/api/:path*`,
|
|
},
|
|
];
|
|
},
|
|
compiler: {
|
|
removeConsole: process.env.NODE_ENV === 'production' ? {
|
|
exclude: ['error', 'warn'],
|
|
} : false,
|
|
},
|
|
poweredByHeader: false,
|
|
// Modularize imports for better tree-shaking (only for libraries that benefit from it)
|
|
modularizeImports: {
|
|
// date-fns: function-level imports for better tree-shaking
|
|
'date-fns': {
|
|
transform: 'date-fns/{{member}}',
|
|
},
|
|
},
|
|
// Enhanced webpack config for better bundle splitting
|
|
webpack: (config, { isServer, dev }) => {
|
|
if (!isServer && !dev) {
|
|
// Enhanced code splitting for better performance
|
|
config.optimization = {
|
|
...config.optimization,
|
|
moduleIds: 'deterministic',
|
|
splitChunks: {
|
|
chunks: 'all',
|
|
cacheGroups: {
|
|
default: false,
|
|
vendors: false,
|
|
// Separate React and related libraries
|
|
react: {
|
|
test: /[\\/]node_modules[\\/](react|react-dom|scheduler)[\\/]/,
|
|
name: 'react',
|
|
chunks: 'all',
|
|
priority: 50,
|
|
enforce: true,
|
|
},
|
|
// Separate UI library components
|
|
radix: {
|
|
test: /[\\/]node_modules[\\/]@radix-ui[\\/]/,
|
|
name: 'radix-ui',
|
|
chunks: 'all',
|
|
priority: 40,
|
|
},
|
|
// Separate charting libraries
|
|
charts: {
|
|
test: /[\\/]node_modules[\\/](recharts|d3-.*)[\\/]/,
|
|
name: 'charts',
|
|
chunks: 'all',
|
|
priority: 35,
|
|
},
|
|
// Separate icon libraries
|
|
icons: {
|
|
test: /[\\/]node_modules[\\/]lucide-react[\\/]/,
|
|
name: 'icons',
|
|
chunks: 'all',
|
|
priority: 30,
|
|
},
|
|
// Separate date utilities
|
|
dateUtils: {
|
|
test: /[\\/]node_modules[\\/]date-fns[\\/]/,
|
|
name: 'date-utils',
|
|
chunks: 'all',
|
|
priority: 25,
|
|
},
|
|
// Separate form libraries
|
|
forms: {
|
|
test: /[\\/]node_modules[\\/](react-hook-form|@hookform)[\\/]/,
|
|
name: 'forms',
|
|
chunks: 'all',
|
|
priority: 20,
|
|
},
|
|
// Group remaining vendor libraries
|
|
vendor: {
|
|
test: /[\\/]node_modules[\\/]/,
|
|
name: 'vendor',
|
|
chunks: 'all',
|
|
priority: 10,
|
|
enforce: true,
|
|
},
|
|
// Common application code
|
|
common: {
|
|
name: 'common',
|
|
minChunks: 3,
|
|
priority: 5,
|
|
},
|
|
},
|
|
},
|
|
};
|
|
}
|
|
return config;
|
|
},
|
|
productionBrowserSourceMaps: false,
|
|
typescript: {
|
|
ignoreBuildErrors: true,
|
|
},
|
|
// Turbopack configuration for optimal bundle sizes
|
|
// Turbopack automatically handles code splitting and tree-shaking
|
|
turbopack: {},
|
|
};
|
|
|
|
const nextConfig = withBundleAnalyzer(baseConfig);
|
|
|
|
export default nextConfig;
|