docs: add Cloudflare Pages limitations section
- commit
- f4def24cd2b917c20f2215cbe65968251e3898b7
- author
- bnema · · 2026-01-18 21:44 UTC
- parent
- 8b02f58
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
1 file · +43 -0
M README.md +43 -0
| @@ -76,6 +76,49 @@ Vous pouvez visualiser et gérer vos données via le dashboard Convex : | |||
| 76 | 76 | npx convex dashboard | |
| 77 | 77 | ``` | |
| 78 | 78 | ||
| 79 | + | ## Déploiement Cloudflare Pages | |
| 80 | + | ||
| 81 | + | Le projet est déployé sur [Cloudflare Pages](https://pages.cloudflare.com/). Les Workers Cloudflare ont des **limitations strictes** à respecter. | |
| 82 | + | ||
| 83 | + | ### Opérations interdites au niveau global/module | |
| 84 | + | ||
| 85 | + | Cloudflare Workers **n'autorisent PAS** les opérations suivantes au niveau global (en dehors des handlers de requête) : | |
| 86 | + | ||
| 87 | + | ```typescript | |
| 88 | + | // INTERDIT - provoque "Disallowed operation called within global scope" | |
| 89 | + | setInterval(() => { ... }, 1000); | |
| 90 | + | setTimeout(() => { ... }, 1000); | |
| 91 | + | fetch('https://api.example.com'); | |
| 92 | + | crypto.getRandomValues(new Uint8Array(16)); | |
| 93 | + | ||
| 94 | + | // AUTORISE - à l'intérieur d'un handler | |
| 95 | + | export const GET: RequestHandler = async () => { | |
| 96 | + | const random = crypto.getRandomValues(new Uint8Array(16)); | |
| 97 | + | const response = await fetch('https://api.example.com'); | |
| 98 | + | // ... | |
| 99 | + | }; | |
| 100 | + | ``` | |
| 101 | + | ||
| 102 | + | ### Bonnes pratiques | |
| 103 | + | ||
| 104 | + | | A eviter | Alternative | | |
| 105 | + | |------------|----------------| | |
| 106 | + | | `setInterval` pour cleanup | Lazy cleanup à chaque requête | | |
| 107 | + | | `fetch()` au chargement du module | `fetch()` dans les handlers | | |
| 108 | + | | Création de clients API au niveau module | Création lazy ou dans les handlers | | |
| 109 | + | | `process.exit()` | Retourner une Response avec status d'erreur | | |
| 110 | + | | Bibliothèques avec worker threads (ex: `pino-pretty`) | Versions compatibles edge (ex: `pino` sans transports) | | |
| 111 | + | ||
| 112 | + | ### Variables d'environnement | |
| 113 | + | ||
| 114 | + | - Utilisez `$env/dynamic/private` (runtime) au lieu de `$env/static/private` (build-time) | |
| 115 | + | - Les variables définies dans le dashboard Cloudflare ne sont disponibles qu'au runtime | |
| 116 | + | ||
| 117 | + | ### Références | |
| 118 | + | ||
| 119 | + | - [Cloudflare Workers Runtime APIs](https://developers.cloudflare.com/workers/runtime-apis/) | |
| 120 | + | - [SvelteKit Cloudflare Adapter](https://svelte.dev/docs/kit/adapter-cloudflare) | |
| 121 | + | ||
| 79 | 122 | ## Documentation et Ressources | |
| 80 | 123 | ||
| 81 | 124 | Si vous n'avez jamais utilisé Svelte/Kit ou Convex, référez-vous aux documentations officielles : | |
| @@ -76,6 +76,49 @@ Vous pouvez visualiser et gérer vos données via le dashboard Convex : | |||||
| 76 | npx convex dashboard | 76 | npx convex dashboard | ||
| 77 | ``` | 77 | ``` | ||
| 78 | 78 | ||||
| 79 | + | ## Déploiement Cloudflare Pages | |||
| 80 | + | ||||
| 81 | + | Le projet est déployé sur [Cloudflare Pages](https://pages.cloudflare.com/). Les Workers Cloudflare ont des **limitations strictes** à respecter. | |||
| 82 | + | ||||
| 83 | + | ### Opérations interdites au niveau global/module | |||
| 84 | + | ||||
| 85 | + | Cloudflare Workers **n'autorisent PAS** les opérations suivantes au niveau global (en dehors des handlers de requête) : | |||
| 86 | + | ||||
| 87 | + | ```typescript | |||
| 88 | + | // INTERDIT - provoque "Disallowed operation called within global scope" | |||
| 89 | + | setInterval(() => { ... }, 1000); | |||
| 90 | + | setTimeout(() => { ... }, 1000); | |||
| 91 | + | fetch('https://api.example.com'); | |||
| 92 | + | crypto.getRandomValues(new Uint8Array(16)); | |||
| 93 | + | ||||
| 94 | + | // AUTORISE - à l'intérieur d'un handler | |||
| 95 | + | export const GET: RequestHandler = async () => { | |||
| 96 | + | const random = crypto.getRandomValues(new Uint8Array(16)); | |||
| 97 | + | const response = await fetch('https://api.example.com'); | |||
| 98 | + | // ... | |||
| 99 | + | }; | |||
| 100 | + | ``` | |||
| 101 | + | ||||
| 102 | + | ### Bonnes pratiques | |||
| 103 | + | ||||
| 104 | + | | A eviter | Alternative | | |||
| 105 | + | |------------|----------------| | |||
| 106 | + | | `setInterval` pour cleanup | Lazy cleanup à chaque requête | | |||
| 107 | + | | `fetch()` au chargement du module | `fetch()` dans les handlers | | |||
| 108 | + | | Création de clients API au niveau module | Création lazy ou dans les handlers | | |||
| 109 | + | | `process.exit()` | Retourner une Response avec status d'erreur | | |||
| 110 | + | | Bibliothèques avec worker threads (ex: `pino-pretty`) | Versions compatibles edge (ex: `pino` sans transports) | | |||
| 111 | + | ||||
| 112 | + | ### Variables d'environnement | |||
| 113 | + | ||||
| 114 | + | - Utilisez `$env/dynamic/private` (runtime) au lieu de `$env/static/private` (build-time) | |||
| 115 | + | - Les variables définies dans le dashboard Cloudflare ne sont disponibles qu'au runtime | |||
| 116 | + | ||||
| 117 | + | ### Références | |||
| 118 | + | ||||
| 119 | + | - [Cloudflare Workers Runtime APIs](https://developers.cloudflare.com/workers/runtime-apis/) | |||
| 120 | + | - [SvelteKit Cloudflare Adapter](https://svelte.dev/docs/kit/adapter-cloudflare) | |||
| 121 | + | ||||
| 79 | ## Documentation et Ressources | 122 | ## Documentation et Ressources | ||
| 80 | 123 | ||||
| 81 | Si vous n'avez jamais utilisé Svelte/Kit ou Convex, référez-vous aux documentations officielles : | 124 | Si vous n'avez jamais utilisé Svelte/Kit ou Convex, référez-vous aux documentations officielles : | ||