-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathnext.config.new.js
More file actions
132 lines (115 loc) · 3.74 KB
/
next.config.new.js
File metadata and controls
132 lines (115 loc) · 3.74 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
132
const withNextIntl = require('next-intl/plugin')('./src/i18n/request.ts');
/** @type {import('next').NextConfig} */
const nextConfig = {
typescript: {
// ⚠️ Dangereux: Ignore les erreurs TypeScript pendant la production build
ignoreBuildErrors: true,
},
images: {
domains: ['pbs.twimg.com', 'abs.twimg.com', 'cdn.bsky.app']
},
// 🚀 OPTIMISATIONS DE CACHE ET PERFORMANCES POUR LE DÉVELOPPEMENT
experimental: {
// Cache les réponses fetch dans les Server Components pendant le HMR
serverComponentsHmrCache: true,
// Configuration des temps de cache pour le router
staleTimes: {
dynamic: 30, // 30 secondes pour les pages dynamiques
static: 300, // 5 minutes pour les pages statiques
},
// Optimise les imports de packages pour de meilleures performances
optimizePackageImports: ['lucide-react', '@heroicons/react', 'react-icons'],
},
// Nouvelle configuration Turbopack (remplace experimental.turbo)
...(process.env.NODE_ENV === 'development' && {
turbopack: {
resolveAlias: {
// Évite les résolutions multiples
'react': 'react',
'react-dom': 'react-dom'
}
}
}),
// Webpack config - s'applique en dev ET en production
webpack: (config, { dev, isServer }) => {
// FIX pour embedding-atlas: résout le conflit avec asset/inline modules
if (config.module.generator && config.module.generator.asset) {
config.module.generator['asset/resource'] = config.module.generator['asset'];
config.module.generator['asset/source'] = config.module.generator['asset'];
delete config.module.generator['asset'];
}
// Ignorer les warnings de duckdb-wasm (dev + build)
config.ignoreWarnings = [
...(config.ignoreWarnings || []),
{ module: /@duckdb\/duckdb-wasm/ },
];
// Ne pas bundler duckdb-wasm côté serveur (évite les erreurs de build)
if (isServer) {
config.externals = [...(config.externals || []), '@duckdb/duckdb-wasm'];
}
// Optimisations spécifiques au développement Docker
if (dev && !isServer) {
config.watchOptions = {
poll: 1000,
aggregateTimeout: 300,
ignored: ['**/node_modules/**', '**/.git/**', '**/.next/**'],
};
config.resolve.symlinks = false;
config.resolve.cacheWithContext = false;
}
return config;
},
// Optimisations spécifiques pour Docker + développement
...(process.env.NODE_ENV === 'development' && {
// Active les logs pour diagnostiquer les lenteurs
logging: {
fetches: {
fullUrl: true,
},
},
// Optimise la gestion mémoire en développement
onDemandEntries: {
// Réduit le temps de garde des pages en mémoire
maxInactiveAge: 25 * 1000, // 25 secondes au lieu de 60
// Réduit le nombre de pages gardées en mémoire
pagesBufferLength: 2, // 2 pages au lieu de 5
},
}),
headers: async () => [
{
source: '/:path*',
headers: [
{
key: 'Strict-Transport-Security',
value: 'max-age=63072000; includeSubDomains; preload'
},
{
key: 'X-DNS-Prefetch-Control',
value: 'on'
},
{
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'
},
{
key: 'Permissions-Policy',
value: 'camera=(), microphone=(), geolocation=()'
}
]
}
],
output: 'standalone',
};
module.exports = withNextIntl(nextConfig);