-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathnext.config.ts
More file actions
131 lines (121 loc) · 3.18 KB
/
next.config.ts
File metadata and controls
131 lines (121 loc) · 3.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
// Use webpack instead of turbopack for custom webpack config
turbopack: {},
// Performance optimizations for better INP
experimental: {
// Enable React 18 features for better performance
// optimizeCss: true, // Temporarily disabled due to critters module issue
optimizePackageImports: [
'lucide-react',
'framer-motion',
'crypto-js'
],
},
// Bundle optimization
webpack: (config, { dev, isServer }) => {
// Optimize bundle splitting for better INP
if (!dev && !isServer) {
config.optimization = config.optimization || {};
config.optimization.splitChunks = {
chunks: 'all',
cacheGroups: {
// Separate crypto libraries
crypto: {
test: /[\\/]node_modules[\\/](crypto-js|uuid)[\\/]/,
name: 'crypto',
chunks: 'all',
priority: 30,
},
// Separate UI libraries
ui: {
test: /[\\/]node_modules[\\/](@radix-ui|lucide-react)[\\/]/,
name: 'ui',
chunks: 'all',
priority: 20,
},
// Separate animation libraries
animations: {
test: /[\\/]node_modules[\\/](framer-motion)[\\/]/,
name: 'animations',
chunks: 'all',
priority: 10,
},
// Default vendor chunk
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all',
priority: 5,
},
},
};
}
// Optimize imports for better tree shaking
if (!dev) {
config.resolve = config.resolve || {};
config.resolve.alias = {
...config.resolve.alias,
// Optimize lodash imports if used
'lodash': 'lodash-es',
};
}
return config;
},
// Compiler optimizations
compiler: {
// Remove console.log in production
removeConsole: process.env.NODE_ENV === 'production',
},
// Image optimization
images: {
formats: ['image/webp', 'image/avif'],
minimumCacheTTL: 86400, // 24 hours
},
// Enable gzip compression
compress: true,
// Headers for better caching and performance
async headers() {
return [
{
source: '/(.*)',
headers: [
{
key: 'X-DNS-Prefetch-Control',
value: 'on'
},
{
key: 'Strict-Transport-Security',
value: 'max-age=63072000; includeSubDomains; preload'
},
{
key: 'X-XSS-Protection',
value: '1; mode=block'
},
{
key: 'X-Frame-Options',
value: 'DENY'
},
{
key: 'X-Content-Type-Options',
value: 'nosniff'
},
{
key: 'Referrer-Policy',
value: 'origin-when-cross-origin'
}
]
},
{
source: '/static/(.*)',
headers: [
{
key: 'Cache-Control',
value: 'public, max-age=31536000, immutable'
}
]
}
];
},
};
export default nextConfig;