[{"data":1,"prerenderedAt":8262},["ShallowReactive",2],{"i-ic:outline-arrow-upward":3,"Footer_afPiwGMwNiEyV4syWzw87ovzxHAgs4iwKtCn4zqBf8E":8,"bloglist":16,"i-material-symbols:home":8203,"i-mdi:arrow-right":8205,"Brand_bAcjTzQpW6OVpFK319jfMki97vH1GrZiqHmeI7Xg4o":8207,"ArticleDetails_0P8Z0Mg3LoXLmxP1NNjdPMpSQofkyhLX9WIneLANGo":8212,"ArticleDetails_SJqMjkXyWnm739Y8cY2qrNoTMPLRa2bK01tkU3J7dE":8217,"ArticleDetails_O7L5xwzFngs2mbFXGSRpMQgtWvaU14E7Lp9WzIRw":8222,"ArticleDetails_F2dLmuPM9cWu3A5gAcYc1nWQXMdK9pu1s1OhQ3aSlY":8227,"ArticleDetails_N1OWfV5pHg5LHMVNtPGpRYl6L8LJ9Xxr1k3a5xM":8232,"ArticleDetails_hXLhGvql7jjYZIlPrZBkvBsaMmdK1rEFs7iIb5c3fE":8237,"ArticleDetails_EzO25ILzyATomZEzUT3qTlYvNk7rI9tcKsUNMZnYzzM":8242,"ArticleDetails_538h6uC5w6PXO7rbbvdHBFmXY2d7TnKfATK7Td0TxWg":8247,"ArticleDetails_47yqC54LPLi0cVpoRRkLz79yp9JGD62QUPxgn14dBI":8252,"ArticleDetails_bKa9YAef2qnd6n4RWKNaIeVOB86JLu8hnpsnM2WnA":8257},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"currentColor\" d=\"m4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8z\"\u002F>",["Island",9],{"key":10,"result":11},"Footer_afPiwGMwNiEyV4syWzw87ovzxHAgs4iwKtCn4zqBf8E",{"head":12},{"style":13},[14],{"innerHTML":15},":where(.i-mdi\\:github){display:inline-block;width:1em;height:1em;background-color:currentColor;-webkit-mask-image:var(--svg);mask-image:var(--svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;--svg:url(\"data:image\u002Fsvg+xml,%3Csvg xmlns='http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='black' d='M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5c.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34c-.46-1.16-1.11-1.47-1.11-1.47c-.91-.62.07-.6.07-.6c1 .07 1.53 1.03 1.53 1.03c.87 1.52 2.34 1.07 2.91.83c.09-.65.35-1.09.63-1.34c-2.22-.25-4.55-1.11-4.55-4.92c0-1.11.38-2 1.03-2.71c-.1-.25-.45-1.29.1-2.64c0 0 .84-.27 2.75 1.02c.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02c.55 1.35.2 2.39.1 2.64c.65.71 1.03 1.6 1.03 2.71c0 3.82-2.34 4.66-4.57 4.91c.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2'\u002F%3E%3C\u002Fsvg%3E\")}",[17,1331,1945,2551,4041,5103,5291,6167,7463,8061],{"id":18,"title":19,"author":20,"body":23,"description":1323,"extension":1324,"meta":1325,"navigation":1154,"path":1326,"publicationDate":1327,"seo":1328,"stem":1329,"__hash__":1330},"articles\u002Farticles\u002Fia-local.md","Faire tourner une IA en local en 2026: outils, modèles et configuration matérielle",{"name":21,"url":22},"@patrickfaramaz ","https:\u002F\u002Ftwitter.com\u002Fpatrickfaramaz",{"type":24,"value":25,"toc":1287},"minimark",[26,31,61,64,67,71,76,81,84,99,105,109,140,143,147,150,153,156,159,163,166,169,173,177,183,186,190,197,211,215,297,304,308,315,320,323,329,334,337,342,347,350,355,360,363,368,372,375,379,389,414,421,427,431,437,442,446,452,455,460,464,471,476,480,490,500,510,520,524,636,639,642,646,649,668,672,683,697,701,716,719,726,729,751,762,766,769,773,780,786,792,796,804,809,814,823,827,838,848,860,865,869,877,881,885,897,906,911,915,923,932,937,941,1069,1073,1087,1098,1122,1128,1214,1217,1233,1243,1247,1250,1267,1283],[27,28,30],"h2",{"id":29},"une-ia-local-en-quelques-minutes","Une IA local, en quelques minutes",[32,33,34,35,42,43,48,49,54,55,60],"p",{},"La meilleure façon de faire tourner une IA en local en 2026, c'est d'installer ",[36,37,41],"a",{"href":38,"rel":39},"https:\u002F\u002Follama.com",[40],"nofollow","Ollama",", de télécharger un modèle comme Llama 4 Scout ou Gemma 4, et d'obtenir vos premières réponses en quelques minutes, tout sur votre propre machine, sans aucune donnée envoyée à l'extérieur. Si vous préférez une interface graphique, ",[36,44,47],{"href":45,"rel":46},"https:\u002F\u002Flmstudio.ai",[40],"LM Studio"," vous y amène sans la moindre ligne de commande. Et si vous ne savez pas si votre machine peut tenir la charge, des outils comme ",[36,50,53],{"href":51,"rel":52},"https:\u002F\u002Fwww.canirun.ai",[40],"canirun.ai"," et ",[36,56,59],{"href":57,"rel":58},"https:\u002F\u002Fgithub.com\u002FAlexsJones\u002Fllmfit",[40],"llmfit"," vous indiquent précisément quels modèles correspondent à votre configuration avant même de télécharger quoi que ce soit.",[32,62,63],{},"Les modèles open source ont franchi un seuil décisif. Un modèle de 14 milliards de paramètres tournant sur un GPU grand public atteint aujourd'hui le niveau de GPT-4 d'il y a deux ans. C'est pourquoi des milliers de développeurs, d'équipes et d'utilisateurs soucieux de leur vie privée pensent à migrer l'IA du cloud vers leurs propres machines.",[32,65,66],{},"Cet article couvre tout: comment tester votre matériel, quel runtime choisir, quels modèles open source valent votre temps en 2026, et comment passer de zéro à votre première réponse locale en quelques minutes.",[27,68,70],{"id":69},"lépisode-en-lien-avec-larticle","L'épisode en lien avec l'article",[72,73],"video-player",{"videoLink":74,"videoTitle":75},"bItXp5CWpjs","Faire tourner une IA en local: outils, modèles et configuration matérielle",[77,78,80],"h3",{"id":79},"lia-local-progresse-rapidement","L'IA local progresse rapidement !",[32,82,83],{},"En temoigne ce tweet de Clement Delangue (cofondateur et PDG d'HuggingFace) du 11 mai 2026 :",[85,86,87,90,93,96],"blockquote",{},[32,88,89],{},"L'IA open-weight locale sur un ordinateur portable s'améliore plus du double de vitesse que la loi de Moore !",[32,91,92],{},"Entre mai 2024 et mai 2026, le MacBook Pro le plus cher que vous pouviez acheter est resté à 128 Go de mémoire  unifiée. Le plafond matériel a à peine bougé.",[32,94,95],{},"Mais le modèle open-weight le plus intelligent de huggingface que vous pouviez réellement exécuter dessus est passé d'un score de 10 (Llama 3 70B) à 47 (DeepSeek V4 Flash sur le GGUF mixed-Q2 de antirez) sur l'indice Artificial Anlys Intelligence Index.",[32,97,98],{},"C'est 4,7× en 24 mois, soit un doublement de l'intelligence tous les 10,7 mois. La loi de Moore (nombre de transistors> ) double tous les 24 mois. L'IA open-weight locale sur un ordinateur portable s'améliore plus du double de vitesse que la loi de Moore, sur du matériel complètement inchangé.",[100,101],"img",{"align":102,"alt":103,"src":104},"center","Open Weight","https:\u002F\u002Fdouble-slash.dev\u002Fassets\u002Farticles\u002Fopen-weight.jpg",[77,106,108],{"id":107},"les-points-clés-de-larticle","Les points clés de l'article",[110,111,112,120,123,134,137],"ul",{},[113,114,115,116],"li",{},"Ollama est la solution la plus rapide pour démarrer : une commande d'installation, puis ",[117,118,119],"code",{},"ollama run [modèle]",[113,121,122],{},"LM Studio propose une interface graphique complète avec un navigateur de modèles Hugging Face intégré",[113,124,125,126,129,130,133],{},"Utilisez ",[36,127,53],{"href":51,"rel":128},[40]," (navigateur, sans installation) ou ",[36,131,59],{"href":57,"rel":132},[40]," (terminal, plus détaillé) pour tester votre matériel avant de télécharger",[113,135,136],{},"Llama 4 Scout, Gemma 4 E4B, DeepSeek V4 Flash et Mistral Medium 3.5 sont les modèles open source les plus solides de début 2026",[113,138,139],{},"16 Go de RAM et 8 Go de VRAM GPU constituent le minimum recommandé pour une expérience fluide sur les modèles 7B",[100,141],{"align":102,"alt":41,"src":142},"https:\u002F\u002Fdouble-slash.dev\u002Fassets\u002Farticles\u002Follama.jpg",[27,144,146],{"id":145},"pourquoi-faire-tourner-une-ia-en-local","Pourquoi faire tourner une IA en local?",[32,148,149],{},"Le cloud est pratique. Mais il comporte des compromis que les organisations et les développeurs acceptent de moins en moins.",[32,151,152],{},"Chaque prompt envoyé à une API cloud transite par un serveur tiers. Pour les développeurs travaillant sur des bases de code propriétaires, les équipes juridiques traitant des documents confidentiels ou les professionnels de santé manipulant des données sensibles, c'est un problème de conformité, parfois un problème légal. Faire tourner une IA en local signifie que vos données ne quittent jamais votre machine.",[32,154,155],{},"Le coût est l'autre facteur. Une petite équipe qui consomme beaucoup d'appels à l'API peut facilement dépenser 200 à 500 euros par mois. Une mise à niveau GPU unique et un modèle local éliminent cet abonnement permanent.",[32,157,158],{},"Les dernières sorties de Llama, Qwen, Gemma, Kimi et Phi ont changé la donne pour de bon. Les modèles open source entre 7 et 14 milliards de paramètres atteignent aujourd'hui un niveau qui était réservé aux modèles frontier il y a 18 mois. La question n'est plus \"est-ce assez bon?\" mais \"lequel correspond à mon matériel?\"",[27,160,162],{"id":161},"étape-1-testez-votre-machine-avant-de-télécharger-quoi-que-ce-soit","Étape 1: testez votre machine avant de télécharger quoi que ce soit",[32,164,165],{},"L'erreur la plus courante est de télécharger un fichier modèle de 40 Go pour découvrir ensuite que votre GPU peut à peine le faire tourner. Deux outils règlent ce problème proprement.",[32,167,168],{},"À noter qu'avec LM Studio, dans la liste des modèles, il y a une option pour afficher ceux qui sont compatibles avec votre machine. Donc cette étape peut être évitée. Mais il est toujours intéressant de tester.",[100,170],{"align":102,"alt":171,"src":172},"Choix du model sur LM Studio","https:\u002F\u002Fdouble-slash.dev\u002Fassets\u002Farticles\u002Flm-studio-model.jpg",[77,174,176],{"id":175},"canirunai-le-diagnostic-matériel-en-deux-minutes-dans-le-navigateur","canirun.ai : le diagnostic matériel en deux minutes dans le navigateur",[32,178,179,182],{},[36,180,53],{"href":51,"rel":181},[40]," détecte vos spécifications système directement dans le navigateur via les API web standard. Il lit votre VRAM GPU, votre RAM système, le nombre de cœurs processeur et la bande passante mémoire, puis note chaque modèle de sa base de données sur une échelle allant de \"Tourne parfaitement\" à \"Trop lourd\".",[32,184,185],{},"La base couvre des centaines de modèles de Meta, Google, Alibaba, Microsoft et DeepSeek. Vous pouvez filtrer par type de tâche (chat, code, raisonnement, vision), licence, fournisseur et famille de modèles. Pour un premier bilan de ce que votre machine peut gérer, cela prend moins de deux minutes et ne nécessite aucune installation.",[77,187,189],{"id":188},"llmfit-lanalyse-matérielle-en-profondeur-avec-benchmarks-communautaires","llmfit : l'analyse matérielle en profondeur avec benchmarks communautaires",[32,191,192,193,196],{},"Pour aller plus loin, ",[36,194,59],{"href":57,"rel":195},[40]," tourne en tant qu'utilitaire terminal et vous donne un score multidimensionnel couvrant qualité, vitesse, adéquation et contexte. Il détecte les GPU NVIDIA, AMD, Intel Arc et Apple Silicon, en plus de votre RAM système et votre CPU.",[32,198,199,200,204,205,210],{},"Ce qui rend llmfit particulièrement utile, c'est la ",[201,202,203],"strong",{},"simulation matérielle",": vous pouvez entrer une configuration cible et voir quels modèles tourneraient dessus. L'outil tire également des benchmarks communautaires montrant des tokens par seconde, temps au premier token et utilisation VRAM réels, des données bien plus fiables que les spécifications théoriques. Il s'intègre directement avec Ollama, ",[36,206,209],{"href":207,"rel":208},"https:\u002F\u002Fgithub.com\u002Fggml-org\u002Fllama.cpp",[40],"llama.cpp",", MLX et Docker Model Runner.",[77,212,214],{"id":213},"configurations-minimales-par-taille-de-modèle","Configurations minimales par taille de modèle",[216,217,218,237],"table",{},[219,220,221],"thead",{},[222,223,224,228,231,234],"tr",{},[225,226,227],"th",{},"Taille du modèle",[225,229,230],{},"RAM système",[225,232,233],{},"VRAM GPU",[225,235,236],{},"Vitesse attendue",[238,239,240,255,269,283],"tbody",{},[222,241,242,246,249,252],{},[243,244,245],"td",{},"1-3B",[243,247,248],{},"8 Go",[243,250,251],{},"4 Go",[243,253,254],{},"30-50 tok\u002Fs",[222,256,257,260,263,266],{},[243,258,259],{},"7B",[243,261,262],{},"16 Go",[243,264,265],{},"6-8 Go",[243,267,268],{},"15-25 tok\u002Fs",[222,270,271,274,277,280],{},[243,272,273],{},"13B",[243,275,276],{},"32 Go",[243,278,279],{},"12 Go",[243,281,282],{},"8-15 tok\u002Fs",[222,284,285,288,291,294],{},[243,286,287],{},"70B (Q4)",[243,289,290],{},"64 Go",[243,292,293],{},"24 Go",[243,295,296],{},"3-8 tok\u002Fs",[32,298,299,300,303],{},"La règle d'or: ",[201,301,302],{},"la VRAM compte plus que tout le reste",". Si un modèle tient en VRAM, votre GPU gère l'inférence à pleine vitesse. S'il déborde sur la RAM système, la vitesse chute de 5 à 10 fois. En cas de doute, lancez canirun.ai d'abord, puis validez avec llmfit.",[77,305,307],{"id":306},"avec-16-go-de-ram-que-peut-on-faire-tourner-concrètement","Avec 16 Go de RAM, que peut-on faire tourner concrètement?",[32,309,310,311,314],{},"16 Go de RAM est une configuration commune. Le facteur déterminant est ",[201,312,313],{},"ce qui accompagne cette RAM",", pas la RAM elle-même.",[32,316,317],{},[201,318,319],{},"16 Go RAM, pas de GPU dédié (processeur graphique intégré)",[32,321,322],{},"L'inférence tourne entièrement sur le CPU. C'est possible, mais lent. Un modèle 3B tourne à 5-10 tokens\u002Fseconde : utilisable pour une réponse courte, pénible pour une conversation longue. Un 7B descend à 2-5 tok\u002Fs: chaque réponse prend 30 à 60 secondes. Le seuil d'utilisation confortable est à 10 tok\u002Fs minimum pour une conversation fluide.",[32,324,325,328],{},[201,326,327],{},"Verdict",": avec un GPU intégré classique, limitez-vous aux modèles 1-3B ou attendez-vous à de la patience.",[32,330,331],{},[201,332,333],{},"16 Go RAM + GPU dédié avec 4-6 Go de VRAM",[32,335,336],{},"Un modèle 7B en quantisation Q4_K_M occupe environ 4,1 Go de VRAM, il tient donc dans un GPU de 6 Go. Résultat: 15 à 25 tok\u002Fs, ce qui est confortable pour une conversation. Avec 4 Go de VRAM, le modèle déborde partiellement sur la RAM système et la vitesse chute à 5-10 tok\u002Fs.",[32,338,339,341],{},[201,340,327],{},": un GPU 6 Go permet de faire tourner un modèle 7B utilisable. C'est le minimum recommandé pour une expérience acceptable.",[32,343,344],{},[201,345,346],{},"16 Go RAM + GPU avec 8 Go de VRAM",[32,348,349],{},"Confortable sur les modèles 7B (25-35 tok\u002Fs), avec de la marge pour expérimenter. Les modèles 13B passent en quantisation agressive (Q3), mais la qualité baisse.",[32,351,352,354],{},[201,353,327],{},": configuration solide pour commencer. Un 7B comme Gemma 4 E4B ou Mistral Small 3 tourne sans contrainte.",[32,356,357],{},[201,358,359],{},"Cas particulier: Apple Silicon (M1\u002FM2\u002FM3\u002FM..) avec 16 Go de mémoire unifiée",[32,361,362],{},"Sur Apple Silicon, la RAM et la VRAM partagent le même pool. Un MacBook Air M2 avec 16 Go voit ce total comme de la mémoire GPU. Cela permet de faire tourner un modèle 13B à 15-20 tok\u002Fs, et même un 27B avec quantisation poussée. C'est l'une des meilleures configurations pour l'IA locale en mobilité, sans GPU dédié séparé.",[32,364,365,367],{},[201,366,327],{},": avec un Mac Apple Silicon 16 Go, vous pouvez faire tourner des modèles 13B confortablement, bien au-delà de ce qu'offre un PC équivalent sans GPU.",[27,369,371],{"id":370},"étape-2-choisir-votre-runtime-pour-faire-tourner-une-ia-en-local","Étape 2: choisir votre runtime pour faire tourner une IA en local",[32,373,374],{},"Le runtime est la couche logicielle qui charge un modèle et gère l'inférence. Plusieurs options solides existent en 2026, et le bon choix dépend de votre profil et de votre cas d'usage.",[77,376,378],{"id":377},"ollama-le-point-de-départ-recommandé","Ollama : le point de départ recommandé",[32,380,381,384,385,388],{},[36,382,41],{"href":38,"rel":383},[40]," enveloppe ",[36,386,209],{"href":207,"rel":387},[40]," avec une interface CLI propre et expose une API REST compatible OpenAI en localhost. L'installation se fait en une seule commande sur macOS, Linux et Windows. Une fois installé, lancer un modèle est aussi simple que:",[390,391,396],"pre",{"className":392,"code":393,"language":394,"meta":395,"style":395},"language-bash shiki shiki-themes synthwave-84","ollama run llama4\n","bash","",[117,397,398],{"__ignoreMap":395},[399,400,403,407,411],"span",{"class":401,"line":402},"line",1,[399,404,406],{"class":405},"sRQ1T","ollama",[399,408,410],{"class":409},"soy-K"," run",[399,412,413],{"class":409}," llama4\n",[32,415,416,417,420],{},"Ollama gère automatiquement le téléchargement du modèle, la détection du GPU et la sélection de la quantisation. Il embarque un registre de modèles intégré pour parcourir et télécharger des modèles par nom. Pour les développeurs, l'API compatible OpenAI signifie qu'un code existant appelant un modèle ",[117,418,419],{},"gpt"," peut être redirigé vers une instance Ollama locale en changeant une seule ligne : l'URL de base.",[32,422,423,426],{},[201,424,425],{},"Idéal pour",": développeurs, power users, toute personne intégrant un modèle local dans une application.",[77,428,430],{"id":429},"lm-studio-loption-graphique","LM Studio : l'option graphique",[32,432,433,436],{},[36,434,47],{"href":45,"rel":435},[40]," propose une interface graphique soignée pour découvrir, télécharger et faire tourner des modèles. Il se connecte au hub de modèles Hugging Face, permet de naviguer par catégorie et taille, et télécharge directement les fichiers GGUF. Un serveur API local, également compatible OpenAI, tourne en arrière-plan et est accessible à toute application capable d'appeler un endpoint HTTP.",[32,438,439,441],{},[201,440,425],{},": non-développeurs, membres d'équipe souhaitant évaluer rapidement plusieurs modèles, toute personne intimidée par le terminal.",[77,443,445],{"id":444},"llamacpp-le-contrôle-maximum","llama.cpp : le contrôle maximum",[32,447,448,451],{},[36,449,209],{"href":207,"rel":450},[40]," est le moteur d'inférence C++ qui propulse à la fois Ollama et LM Studio en coulisses. L'utiliser directement vous donne le contrôle sur chaque paramètre de quantisation, stratégie d'allocation mémoire et option matérielle. Il supporte l'inférence CPU seul, les configurations multi-GPU, Metal sur Apple Silicon, ROCm sur AMD et CUDA sur NVIDIA.",[32,453,454],{},"La contrepartie est la complexité: pas de navigateur de modèles, pas de détection automatique du GPU. Mais pour les développeurs optimisant la latence d'inférence en production, ou les chercheurs expérimentant avec la quantisation, l'accès direct en vaut la peine.",[32,456,457,459],{},[201,458,425],{},": développeurs avancés, charges de travail critiques en performance, recherche et expérimentation.",[77,461,463],{"id":462},"jan-ai","Jan AI",[32,465,466,470],{},[36,467,463],{"href":468,"rel":469},"https:\u002F\u002Fjan.ai",[40]," se positionne comme un remplacement local complet pour la pile API OpenAI. Au-delà du texte, il gère images, audio, vidéo et embeddings, tous disponibles via un endpoint local unifié. La compatibilité avec l'API Anthropic a été ajoutée en janvier 2026. Pour les équipes qui font tourner des outils internes appelant déjà l'API OpenAI, Jan AI est le chemin de migration le plus rapide vers une infrastructure entièrement locale.",[32,472,473,475],{},[201,474,425],{},": équipes migrant des applications existantes intégrées OpenAI vers une infrastructure locale.",[77,477,479],{"id":478},"autres-outils-à-connaître","Autres outils à connaître",[32,481,482,489],{},[201,483,484],{},[36,485,488],{"href":486,"rel":487},"https:\u002F\u002Flocallyai.app",[40],"LocallyAI"," permet de faire tourner des modèles sur iPhone, iPad et Mac. L'application exploite au maximum les puces Apple.",[32,491,492,499],{},[201,493,494],{},[36,495,498],{"href":496,"rel":497},"https:\u002F\u002Fwww.nomic.ai\u002Fgpt4all",[40],"GPT4All"," inclut une fonctionnalité LocalDocs permettant de discuter avec vos propres fichiers (PDF, Word, dépôts de code) entièrement sur l'appareil. La version 2026 a ajouté le raisonnement sur l'appareil et les appels d'outils. C'est le meilleur choix pour les workflows RAG privés sans infrastructure supplémentaire.",[32,501,502,509],{},[201,503,504],{},[36,505,508],{"href":506,"rel":507},"https:\u002F\u002Fvllm.ai",[40],"vLLM"," est la référence en production pour les équipes qui font tourner des modèles sur infrastructure GPU à grande échelle. Son architecture PagedAttention et son batching continu supportent les déploiements multi-GPU. Pour servir un modèle à des dizaines d'utilisateurs simultanés, vLLM est le bon outil, mais nettement plus complexe à configurer qu'Ollama ou LM Studio.",[511,512,513],"info",{"type":511},[32,514,515,516],{},"Infomaniak a sorti une série d’articles pour bien utiliser vLLM : ",[36,517,518],{"href":518,"rel":519},"https:\u002F\u002Fengineering.infomaniak.com\u002Fvllm-ultimate-guide-part-1\u002F",[40],[77,521,523],{"id":522},"tableau-comparatif","Tableau comparatif",[216,525,526,541],{},[219,527,528],{},[222,529,530,533,536,538],{},[225,531,532],{},"Outil",[225,534,535],{},"Interface",[225,537,425],{},[225,539,540],{},"Complexité",[238,542,543,559,575,591,607,621],{},[222,544,545,550,553,556],{},[243,546,547],{},[36,548,41],{"href":38,"rel":549},[40],[243,551,552],{},"CLI + API",[243,554,555],{},"Développeurs, intégrations",[243,557,558],{},"Faible",[222,560,561,566,569,572],{},[243,562,563],{},[36,564,47],{"href":45,"rel":565},[40],[243,567,568],{},"Graphique",[243,570,571],{},"Non-développeurs, évaluation",[243,573,574],{},"Très faible",[222,576,577,582,585,588],{},[243,578,579],{},[36,580,209],{"href":207,"rel":581},[40],[243,583,584],{},"CLI",[243,586,587],{},"Avancés, performance",[243,589,590],{},"Élevée",[222,592,593,598,601,604],{},[243,594,595],{},[36,596,463],{"href":468,"rel":597},[40],[243,599,600],{},"API",[243,602,603],{},"Migration API OpenAI",[243,605,606],{},"Moyenne",[222,608,609,614,616,619],{},[243,610,611],{},[36,612,498],{"href":496,"rel":613},[40],[243,615,568],{},[243,617,618],{},"Chat avec documents privés (RAG)",[243,620,558],{},[222,622,623,628,631,634],{},[243,624,625],{},[36,626,508],{"href":506,"rel":627},[40],[243,629,630],{},"Serveur",[243,632,633],{},"Production, multi-utilisateurs",[243,635,590],{},[32,637,638],{},"Un workflow pratique adopté par beaucoup de développeurs: LM Studio pour la découverte et l'évaluation initiale des modèles, Ollama pour le développement et l'intégration locale, vLLM lors du passage en production.",[640,641],"hr",{},[27,643,645],{"id":644},"étape-3-choisir-le-bon-modèle-open-source-pour-tourner-en-local","Étape 3: choisir le bon modèle open source pour tourner en local",[32,647,648],{},"Le paysage des modèles a évolué significativement cette année. Plusieurs sorties entre 7 et 27 milliards de paramètres égalent ou dépassent ce qui nécessitait 70B+ de paramètres en 2024.",[85,650,651],{},[32,652,653,656,657,54,662,667],{},[201,654,655],{},"Note",": le marché des modèles open source évolue extrêmement vite : de nouvelles sorties importantes ont lieu toutes les 4 à 8 semaines. Les recommandations ci-dessous sont à jour en mai 2026. Pour suivre l'évolution en temps réel, consultez l'",[36,658,661],{"href":659,"rel":660},"https:\u002F\u002Fhuggingface.co\u002Fspaces\u002Fopen-llm-leaderboard\u002Fopen_llm_leaderboard",[40],"Open LLM Leaderboard de Hugging Face",[36,663,666],{"href":664,"rel":665},"https:\u002F\u002Fllm-stats.com\u002Fleaderboards\u002Fopen-llm-leaderboard",[40],"llm-stats.com\u002Fleaderboards"," : ils reflètent les benchmarks actuels des modèles disponibles localement.",[77,669,671],{"id":670},"que-signifie-7b-70b-235b","Que signifie \"7B\", \"70B\", \"235B\"?",[32,673,674,675,678,679,682],{},"Le ",[201,676,677],{},"\"B\""," signifie ",[201,680,681],{},"milliards"," (billion en anglais). Un modèle 70B contient 70 milliards de paramètres : des valeurs numériques apprises pendant l'entraînement qui déterminent comment le modèle traite et génère du texte. Plus il y en a, plus le modèle est capable en général. Mais plus il y en a, plus il faut de VRAM pour le charger, et plus l'inférence est lente.",[32,684,685,686,688,689,692,693,696],{},"La règle pratique: un modèle ",[201,687,259],{}," convient au chat général sur un GPU entrée de gamme; un ",[201,690,691],{},"14B"," commence à mieux traiter les tâches complexes; un ",[201,694,695],{},"70B"," (quantisé) s'approche des gros modèles propriétaires mais nécessite 24 Go de VRAM minimum.",[77,698,700],{"id":699},"paramètres-totaux-vs-paramètres-actifs-à-linférence-architecture-moe","Paramètres totaux vs paramètres actifs à l'inférence (architecture MoE)",[32,702,703,704,707,708,711,712,715],{},"Certains modèles affichent deux chiffres: par exemple ",[201,705,706],{},"\"235B-A22B\""," ou ",[201,709,710],{},"\"109B\u002F17B actifs\"",". Cela désigne une architecture ",[201,713,714],{},"Mixture of Experts (MoE)",".",[32,717,718],{},"Le Mixture of Experts (MoE) est une approche d’optimisation des modèles IA qui consiste à activer uniquement certaines parties du réseau de neurones en fonction de la requête, plutôt que d’utiliser l’ensemble du modèle à chaque exécution.",[32,720,721,722,725],{},"Dans un modèle dense classique, tous les paramètres sont utilisés pour chaque token généré. Dans un modèle MoE, les paramètres sont regroupés en \"experts\" spécialisés, et pour chaque token, seule une fraction de ces experts est activée. Les autres restent ",[201,723,724],{},"fermés"," (inactifs) pendant ce calcul précis.",[32,727,728],{},"Concrètement:",[110,730,731,741],{},[113,732,733,736,737,740],{},[201,734,735],{},"Llama 4 Scout",": 109 milliards de paramètres au total, mais seulement ",[201,738,739],{},"17B actifs"," à chaque inférence",[113,742,743,746,747,750],{},[201,744,745],{},"DeepSeek V4 Flash",": 284 milliards au total, mais seulement ",[201,748,749],{},"13B actifs"," à l'inférence",[32,752,753,754,757,758,761],{},"Cela a deux conséquences distinctes sur votre machine. La ",[201,755,756],{},"vitesse d'inférence"," (tokens par seconde) correspond aux paramètres actifs : un modèle MoE avec 13B actifs génère des tokens aussi vite qu'un modèle dense 13B. En revanche, la ",[201,759,760],{},"mémoire nécessaire pour charger le modèle"," correspond aux paramètres totaux : tous les experts doivent rester en mémoire (VRAM ou RAM), même inactifs. Un DeepSeek V4 Flash à 284B nécessite ainsi environ 160 Go de mémoire totale pour charger l'ensemble des poids, malgré sa rapidité à l'inférence.",[77,763,765],{"id":764},"quantization","Quantization",[32,767,768],{},"La quantization est une technique qui vise à réduire la précision numérique des nombres flottants utilisés comme paramètres des réseaux de neurones profonds qui composent les LLM, afin de diminuer leur empreinte en mémoire GPU. Concrètement, les paramètres encodés en 32 ou 64 bits sont convertis vers des formats plus légers (FP16, BF16, INT8 ou INT4), ce qui permet de diviser par environ 3 la taille du modèle tout en limitant la perte de performance. On distingue le Quantization-Aware Training (QAT), appliqué pendant l'entraînement, et le Post-Training Quantization (PTQ), réalisé après entraînement et plus facile à mettre en œuvre, avec des méthodes populaires comme GPTQ ou NF4. Au final, la quantization réduit la consommation mémoire et énergétique ainsi que les temps d'inférence, au prix d'un compromis à trouver avec la précision du modèle.",[77,770,772],{"id":771},"meilleur-modèle-généraliste-llama-4-scout-meta","Meilleur modèle généraliste: Llama 4 Scout (Meta)",[32,774,775,779],{},[36,776,735],{"href":777,"rel":778},"https:\u002F\u002Fhuggingface.co\u002Fmeta-llama\u002FLlama-4-Scout-17B-16E",[40]," (64GB) est un modèle Mixture-of-Experts de 109 milliards de paramètres total avec seulement 17B actifs pendant l'inférence. Sa fenêtre de contexte est de 10 millions de tokens et il est nativement multimodal (texte et images).",[32,781,782,785],{},[201,783,784],{},"VRAM requise",": Scout en quantisation 1.78-bit tient sur un GPU de 24 Go (RTX 4090) à environ 20 tokens\u002Fseconde. En INT4 standard, il faut 48-55 Go (deux H100 ou une H100 80 Go). Pour la plupart des usages grand public, Scout reste un modèle orienté infrastructure. Les variantes Q4 sur GPU 24 Go existent mais restent limitées en débit.",[32,787,788,791],{},[201,789,790],{},"Licence",": Meta Llama 4 Community License (usage commercial autorisé avec attribution).",[77,793,795],{"id":794},"meilleur-pour-les-ordinateurs-portables-et-ledge-gemma-4-e4b-google","Meilleur pour les ordinateurs portables et l'edge: Gemma 4 E4B (Google)",[32,797,798,803],{},[36,799,802],{"href":800,"rel":801},"https:\u002F\u002Fhuggingface.co\u002Fgoogle\u002Fgemma-4-E4B",[40],"Gemma 4 E4B"," (9.6GB) est conçu pour les appareils légers. Il est nativement multimodal (texte, image, vidéo, audio) et tourne sur MacBook Apple Silicon, machines avec graphiques intégrés et appareils de type Raspberry Pi.",[32,805,806,808],{},[201,807,784],{},": 5 Go minimum (Q4_K_M); 6-8 Go recommandés pour un usage confortable au quotidien. Une GPU de 8 Go (RTX 3070, etc.) offre une expérience fluide.",[32,810,811,813],{},[201,812,790],{},": Apache 2.0.",[511,815,816],{"type":511},[32,817,818,819],{},"Un article de Yoandev qui teste le modèle Gemma 4 sur du code ",[36,820,821],{"href":821,"rel":822},"https:\u002F\u002Fyoandev.co\u002Fgemma4-opencode-benchmark",[40],[77,824,826],{"id":825},"meilleur-pour-le-code-haute-performance-deepseek-v4-flash-284b13b-actifs","Meilleur pour le code haute performance: DeepSeek V4 Flash (284B\u002F13B actifs)",[32,828,829,833,834,837],{},[36,830,745],{"href":831,"rel":832},"https:\u002F\u002Fhuggingface.co\u002Fdeepseek-ai\u002FDeepSeek-V4-Flash",[40]," uniquement en preview et en ollama cloud pour le moment, sorti en avril 2026, obtient ",[201,835,836],{},"91,6"," sur LiveCodeBench et 94,8 sur HMMT 2026. C'est un modèle MoE de 284 milliards de paramètres avec seulement 13B actifs à l'inférence. Il supporte une fenêtre de contexte d'1 million de tokens et propose trois modes de raisonnement : réponse directe, réflexion standard, et raisonnement approfondi.",[32,839,840,843,844,847],{},[201,841,842],{},"Important",": DeepSeek V4 Flash est disponible sur Ollama via un endpoint cloud (",[117,845,846],{},"deepseek-v4-flash:cloud","). Contrairement aux autres modèles de cette liste, il n'est pas téléchargeable localement : les appels sont routés vers l'API DeepSeek. À utiliser pour des capacités d'agents avancées via l'interface Ollama, mais pas pour un usage 100% local et hors ligne.",[32,849,850,853,854,859],{},[201,851,852],{},"Pour le code sur GPU grand public (16-17 Go VRAM)",": ",[36,855,858],{"href":856,"rel":857},"https:\u002F\u002Fhuggingface.co\u002FQwen\u002FQwen3.6-27B",[40],"Qwen3.6-27B"," reste la référence accessible, avec 77,2% sur SWE-bench Verified et Apache 2.0.",[32,861,862,864],{},[201,863,790],{},": MIT.",[77,866,868],{"id":867},"meilleur-pour-le-raisonnement-phi-4-reasoning-plus-microsoft-14b","Meilleur pour le raisonnement: Phi-4 Reasoning Plus (Microsoft, 14B)",[32,870,871,876],{},[36,872,875],{"href":873,"rel":874},"https:\u002F\u002Fhuggingface.co\u002Fmicrosoft\u002FPhi-4-reasoning-plus",[40],"Phi-4 Reasoning Plus"," (9,1GB) de Microsoft dépasse Llama 3.1 70B sur les benchmarks de raisonnement mathématique et de logique multi-étapes avec seulement 14 milliards de paramètres. En Q4_K_M, il nécessite environ 7,8 Go de VRAM, ce qui le rend accessible sur une RTX 3080 ou une RTX 4070.",[32,878,879,864],{},[201,880,790],{},[77,882,884],{"id":883},"généraliste-haute-performance-mistral-medium-35-128b","Généraliste haute performance: Mistral Medium 3.5 (128B)",[32,886,887,892,893,896],{},[36,888,891],{"href":889,"rel":890},"https:\u002F\u002Follama.com\u002Flibrary\u002Fmistral-medium-3.5",[40],"Mistral Medium 3.5"," (80GB) combine instruction-following, raisonnement et code dans un seul modèle dense de 128 milliards de paramètres. Il obtient ",[201,894,895],{},"77,6%"," sur SWE-bench Verified, supporte la vision, est multilingue natif et expose des appels de fonctions natifs avec sortie JSON. Sa fenêtre de contexte est de 256K tokens.",[32,898,899,902,903,715],{},[201,900,901],{},"Infrastructure requise",": modèle dense de 128B, environ 70-80 Go en Q4. Nécessite plusieurs GPU ou une station de travail dédiée pour fonctionner à pleine vitesse. Disponible directement via ",[117,904,905],{},"ollama run mistral-medium-3.5",[32,907,908,910],{},[201,909,790],{},": Modified MIT (usage commercial autorisé, avec exceptions pour les entreprises dépassant un certain seuil de revenus).",[77,912,914],{"id":913},"agent-autonome-et-coding-longue-durée-kimi-k26-moonshot-ai","Agent autonome et coding longue durée: Kimi K2.6 (Moonshot AI)",[32,916,917,922],{},[36,918,921],{"href":919,"rel":920},"https:\u002F\u002Follama.com\u002Flibrary\u002Fkimi-k2.6",[40],"Kimi K2.6"," est conçu pour les tâches de coding complexes et les workflows autonomes longue durée. Il peut orchestrer jusqu'à 300 sous-agents exécutant 4 000 étapes coordonnées, supporte la vision (texte et image) et dispose d'une fenêtre de 256K tokens.",[32,924,925,927,928,931],{},[201,926,842],{},": Kimi K2.6 est disponible sur Ollama via un endpoint cloud (",[117,929,930],{},"kimi-k2.6:cloud","). Contrairement aux autres modèles de cette liste, il n'est pas téléchargeable localement : les appels sont routés vers l'API Moonshot AI. À utiliser pour des capacités d'agents avancées via l'interface Ollama, mais pas pour un usage 100% local et hors ligne.",[32,933,934,936],{},[201,935,790],{},": open-source via API Moonshot AI.",[77,938,940],{"id":939},"tableau-de-sélection-rapide","Tableau de sélection rapide",[216,942,943,958],{},[219,944,945],{},[222,946,947,950,953,956],{},[225,948,949],{},"Besoin",[225,951,952],{},"Modèle",[225,954,955],{},"Mémoire requise",[225,957,790],{},[238,959,960,976,992,1007,1023,1038,1054],{},[222,961,962,965,970,973],{},[243,963,964],{},"Laptop \u002F edge",[243,966,967],{},[36,968,802],{"href":800,"rel":969},[40],[243,971,972],{},"5-8 Go VRAM",[243,974,975],{},"Apache 2.0",[222,977,978,981,986,989],{},[243,979,980],{},"Raisonnement accessible",[243,982,983],{},[36,984,875],{"href":873,"rel":985},[40],[243,987,988],{},"~8 Go VRAM",[243,990,991],{},"MIT",[222,993,994,997,1002,1005],{},[243,995,996],{},"Code accessible (GPU 16 Go)",[243,998,999],{},[36,1000,858],{"href":856,"rel":1001},[40],[243,1003,1004],{},"16-17 Go VRAM",[243,1006,975],{},[222,1008,1009,1012,1017,1020],{},[243,1010,1011],{},"Chat généraliste (infra)",[243,1013,1014],{},[36,1015,735],{"href":777,"rel":1016},[40],[243,1018,1019],{},"24 Go VRAM (1.78-bit)",[243,1021,1022],{},"Community",[222,1024,1025,1028,1033,1036],{},[243,1026,1027],{},"Code haute performanc (cloud Ollama) e",[243,1029,1030],{},[36,1031,745],{"href":831,"rel":1032},[40],[243,1034,1035],{},"API cloud",[243,1037,991],{},[222,1039,1040,1043,1048,1051],{},[243,1041,1042],{},"Généraliste + vision (serveur)",[243,1044,1045],{},[36,1046,891],{"href":889,"rel":1047},[40],[243,1049,1050],{},"~80 Go (multi-GPU)",[243,1052,1053],{},"Modified MIT",[222,1055,1056,1059,1064,1066],{},[243,1057,1058],{},"Agent autonome (cloud Ollama)",[243,1060,1061],{},[36,1062,921],{"href":919,"rel":1063},[40],[243,1065,1035],{},[243,1067,1068],{},"Open-source",[27,1070,1072],{"id":1071},"étape-4-votre-première-ia-locale-en-pratique","Étape 4: votre première IA locale en pratique",[32,1074,1075,1078,1079,1082,1083,1086],{},[201,1076,1077],{},"1. Testez votre matériel"," : ouvrez ",[36,1080,53],{"href":51,"rel":1081},[40]," dans un navigateur. Notez quels modèles obtiennent la note \"Tourne parfaitement\" ou \"Tourne bien\". Pour plus de détails, installez ",[36,1084,59],{"href":57,"rel":1085},[40]," et lancez-le depuis un terminal.",[32,1088,1089,1092,1093,1097],{},[201,1090,1091],{},"2. Installez Ollama"," : téléchargez l'installeur sur ",[36,1094,1096],{"href":38,"rel":1095},[40],"ollama.com",". Sur macOS, il tourne en tant qu'application dans la barre de menu. Sur Linux, une seule commande curl gère l'installation:",[390,1099,1101],{"className":392,"code":1100,"language":394,"meta":395,"style":395},"curl -fsSL https:\u002F\u002Follama.com\u002Finstall.sh | sh\n",[117,1102,1103],{"__ignoreMap":395},[399,1104,1105,1108,1112,1115,1119],{"class":401,"line":402},[399,1106,1107],{"class":405},"curl",[399,1109,1111],{"class":1110},"sSmKr"," -fsSL",[399,1113,1114],{"class":409}," https:\u002F\u002Follama.com\u002Finstall.sh",[399,1116,1118],{"class":1117},"scrqX"," |",[399,1120,1121],{"class":405}," sh\n",[32,1123,1124,1127],{},[201,1125,1126],{},"3. Téléchargez et lancez votre premier modèle"," selon votre matériel :",[390,1129,1131],{"className":392,"code":1130,"language":394,"meta":395,"style":395},"# Ordinateur portable sans GPU dédié (\u003C 8 Go VRAM)\nollama run gemma4:e4b\n\n# GPU milieu de gamme (8-12 Go VRAM) - usage général\nollama run mistral-small3\n\n# GPU puissant (16-17 Go VRAM) - code\nollama run qwen3.6:27b\n\n# GPU haut de gamme (24 Go VRAM, quantisation agressive) - généraliste\nollama run llama4:scout\n",[117,1132,1133,1139,1149,1156,1162,1172,1177,1183,1193,1198,1204],{"__ignoreMap":395},[399,1134,1135],{"class":401,"line":402},[399,1136,1138],{"class":1137},"sjThu","# Ordinateur portable sans GPU dédié (\u003C 8 Go VRAM)\n",[399,1140,1142,1144,1146],{"class":401,"line":1141},2,[399,1143,406],{"class":405},[399,1145,410],{"class":409},[399,1147,1148],{"class":409}," gemma4:e4b\n",[399,1150,1152],{"class":401,"line":1151},3,[399,1153,1155],{"emptyLinePlaceholder":1154},true,"\n",[399,1157,1159],{"class":401,"line":1158},4,[399,1160,1161],{"class":1137},"# GPU milieu de gamme (8-12 Go VRAM) - usage général\n",[399,1163,1165,1167,1169],{"class":401,"line":1164},5,[399,1166,406],{"class":405},[399,1168,410],{"class":409},[399,1170,1171],{"class":409}," mistral-small3\n",[399,1173,1175],{"class":401,"line":1174},6,[399,1176,1155],{"emptyLinePlaceholder":1154},[399,1178,1180],{"class":401,"line":1179},7,[399,1181,1182],{"class":1137},"# GPU puissant (16-17 Go VRAM) - code\n",[399,1184,1186,1188,1190],{"class":401,"line":1185},8,[399,1187,406],{"class":405},[399,1189,410],{"class":409},[399,1191,1192],{"class":409}," qwen3.6:27b\n",[399,1194,1196],{"class":401,"line":1195},9,[399,1197,1155],{"emptyLinePlaceholder":1154},[399,1199,1201],{"class":401,"line":1200},10,[399,1202,1203],{"class":1137},"# GPU haut de gamme (24 Go VRAM, quantisation agressive) - généraliste\n",[399,1205,1207,1209,1211],{"class":401,"line":1206},11,[399,1208,406],{"class":405},[399,1210,410],{"class":409},[399,1212,1213],{"class":409}," llama4:scout\n",[32,1215,1216],{},"Le premier lancement télécharge le modèle (2 à 80 Go selon le modèle). Les lancements suivants sont instantanés.",[32,1218,1219,1222,1223,1228,1229,1232],{},[201,1220,1221],{},"4. Connectez une interface"," : si vous voulez une interface de chat plutôt qu'un terminal, ",[36,1224,1227],{"href":1225,"rel":1226},"https:\u002F\u002Fopenwebui.com",[40],"Open WebUI"," est l'option la plus populaire. Il se connecte automatiquement à votre instance Ollama locale et est disponible en application desktop native (sans Docker). ",[36,1230,47],{"href":45,"rel":1231},[40]," se connecte également à Ollama comme backend.",[32,1234,1235,1238,1239,1242],{},[201,1236,1237],{},"5. Benchmarkez votre configuration"," : installez ",[36,1240,59],{"href":57,"rel":1241},[40]," pour voir vos tokens par seconde réels et identifier si un niveau de quantisation différent améliorerait les performances sur votre matériel spécifique.",[27,1244,1246],{"id":1245},"conclusion","Conclusion",[32,1248,1249],{},"Faire tourner une IA en local n'est plus un projet de week-end réservé aux passionnés de matériel. En 2026, un GPU milieu de gamme et quelques minutes de configuration suffisent à disposer d'un modèle de langage capable, privé et sans abonnement sur votre propre machine.",[32,1251,1252,1253,707,1256,1259,1260,707,1263,1266],{},"Le chemin pratique est simple: testez votre machine avec ",[36,1254,53],{"href":51,"rel":1255},[40],[36,1257,59],{"href":57,"rel":1258},[40],", installez ",[36,1261,41],{"href":38,"rel":1262},[40],[36,1264,47],{"href":45,"rel":1265},[40]," selon votre niveau de confort avec la ligne de commande, et choisissez un modèle adapté à votre VRAM. Pour la plupart des configurations, cela signifie Gemma 4 E4B (ordinateurs portables, 5-8 Go VRAM), Mistral Small 3 (usage général, 8-12 Go), ou Qwen3.6-27B (code, 16-17 Go). Pour les équipes avec infrastructure, DeepSeek V4 Flash et Mistral Medium 3.5 représentent l'état de l'art en mai 2026.",[32,1268,1269,1270,1273,1274,54,1277,1282],{},"Le marché évolue à un rythme inhabituel : de nouveaux modèles importants sortent toutes les 4 à 8 semaines. L'",[36,1271,661],{"href":659,"rel":1272},[40],", ",[36,1275,666],{"href":664,"rel":1276},[40],[36,1278,1281],{"href":1279,"rel":1280},"https:\u002F\u002Farena.ai\u002Fleaderboard\u002Ftext",[40],"Chatbot Arena"," restent les références pour suivre ce qui change.",[1284,1285,1286],"style",{},"html pre.shiki code .sRQ1T, html code.shiki .sRQ1T{--shiki-default:#FE4450}html pre.shiki code .soy-K, html code.shiki .soy-K{--shiki-default:#BBBBBB}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sSmKr, html code.shiki .sSmKr{--shiki-default:#F97E72}html pre.shiki code .scrqX, html code.shiki .scrqX{--shiki-default:#FEDE5D}html pre.shiki code .sjThu, html code.shiki .sjThu{--shiki-default:#848BBD;--shiki-default-font-style:italic}",{"title":395,"searchDepth":1141,"depth":1141,"links":1288},[1289,1290,1294,1295,1301,1309,1321,1322],{"id":29,"depth":1141,"text":30},{"id":69,"depth":1141,"text":70,"children":1291},[1292,1293],{"id":79,"depth":1151,"text":80},{"id":107,"depth":1151,"text":108},{"id":145,"depth":1141,"text":146},{"id":161,"depth":1141,"text":162,"children":1296},[1297,1298,1299,1300],{"id":175,"depth":1151,"text":176},{"id":188,"depth":1151,"text":189},{"id":213,"depth":1151,"text":214},{"id":306,"depth":1151,"text":307},{"id":370,"depth":1141,"text":371,"children":1302},[1303,1304,1305,1306,1307,1308],{"id":377,"depth":1151,"text":378},{"id":429,"depth":1151,"text":430},{"id":444,"depth":1151,"text":445},{"id":462,"depth":1151,"text":463},{"id":478,"depth":1151,"text":479},{"id":522,"depth":1151,"text":523},{"id":644,"depth":1141,"text":645,"children":1310},[1311,1312,1313,1314,1315,1316,1317,1318,1319,1320],{"id":670,"depth":1151,"text":671},{"id":699,"depth":1151,"text":700},{"id":764,"depth":1151,"text":765},{"id":771,"depth":1151,"text":772},{"id":794,"depth":1151,"text":795},{"id":825,"depth":1151,"text":826},{"id":867,"depth":1151,"text":868},{"id":883,"depth":1151,"text":884},{"id":913,"depth":1151,"text":914},{"id":939,"depth":1151,"text":940},{"id":1071,"depth":1141,"text":1072},{"id":1245,"depth":1141,"text":1246},"Comment faire tourner une IA en local en 2026? Comparez Ollama, LM Studio et llama.cpp, testez votre machine avec canirun.ai et choisissez le bon modèle open source.","md",{},"\u002Farticles\u002Fia-local","2026-05-11",{"title":19,"description":1323},"articles\u002Fia-local","qKZZzqb2MY7DiXTFsimA-5-CHd4SdGLoMo7ACN4KsRU",{"id":1332,"title":1333,"author":1334,"body":1335,"description":1938,"extension":1324,"meta":1939,"navigation":1154,"path":1940,"publicationDate":1941,"seo":1942,"stem":1943,"__hash__":1944},"articles\u002Farticles\u002Fvibe-coding-bmad-spec-driven-methode-developpement-ia.md","Vibe Coding, BMAD, Spec-Driven: développer avec l'IA est-il vraiment plus simple ?",{"name":21,"url":22},{"type":24,"value":1336,"toc":1913},[1337,1340,1343,1346,1349,1370,1372,1376,1380,1383,1386,1389,1393,1396,1402,1406,1409,1412,1418,1424,1430,1436,1440,1443,1445,1449,1452,1456,1459,1462,1480,1483,1487,1493,1500,1503,1510,1513,1521,1525,1532,1535,1538,1546,1550,1556,1559,1562,1569,1573,1579,1590,1593,1600,1604,1610,1613,1616,1623,1627,1633,1640,1643,1650,1656,1659,1667,1671,1677,1680,1683,1686,1689,1693,1696,1710,1717,1720,1726,1732,1758,1761,1768,1782,1784,1788,1791,1794,1798,1801,1804,1807,1811,1814,1831,1834,1838,1841,1844,1847,1849,1853,1856,1859,1862,1865,1868,1870],[32,1338,1339],{},"En 2025, Andrej Karpathy popularisait le \"vibe coding\" avec une idée séduisante: laissez l'IA écrire le code, suivez le flow, ne lisez même pas ce qui est généré. La promesse? N'importe qui pouvait créer un logiciel.",[32,1341,1342],{},"En 2026, pour \"bien\" développer avec l'IA, il faut maîtriser BMAD et ses 21 agents spécialisés. Ou comprendre les specs EARS de Kiro. Ou orchestrer des subagents avec GSD. Ou versionner des PRD dans OpenSpec. Plus simple, vraiment?",[32,1344,1345],{},"Quelque chose s'est passé entre ces deux moments. Les limites des LLMs, hallucinations, perte de contexte, incohérences à grande échelle, ont provoqué une réponse industrielle massive: des frameworks de plus en plus sophistiqués pour compenser ce que l'IA ne sait pas encore faire seule. La complexité n'a pas disparu. Elle s'est déplacée.",[32,1347,1348],{},"Cet article analyse honnêtement ce paradoxe. On compare les principales méthodes de développement avec l'IA disponibles en 2026, on regarde ce qu'elles apportent vraiment, et on tire une conclusion qui va à contre-courant du discours ambiant: les développeurs n'ont jamais été aussi indispensables.",[85,1350,1351,1356],{},[32,1352,1353],{},[201,1354,1355],{},"Points clés",[110,1357,1358,1361,1364,1367],{},[113,1359,1360],{},"Le vibe coding fonctionne pour les prototypes rapides, pas pour les projets en production: la dette technique et le code spaghetti s'accumulent en 3 mois.",[113,1362,1363],{},"Les frameworks SDD (BMAD, Spec Kit, GSD, Kiro...) compensent les limites des LLMs en déplaçant la complexité vers la documentation et les specs.",[113,1365,1366],{},"Matt Pocock (Ralph Loop) défend l'inverse du vibe coding: les fondamentaux d'ingénierie (TDD, design, revue) comptent plus que jamais avec l'IA.",[113,1368,1369],{},"Les développeurs ne sont pas remplacés: ils sont repositionnés comme architectes, relecteurs de code IA, et concepteurs de specs.",[640,1371],{},[27,1373,1375],{"id":1374},"le-vibe-coding-la-promesse-et-ce-quelle-cache","Le Vibe Coding: la promesse et ce qu'elle cache",[77,1377,1379],{"id":1378},"quest-ce-que-le-vibe-coding-exactement","Qu'est-ce que le vibe coding, exactement?",[32,1381,1382],{},"Le terme \"vibe coding\" a été popularisé par Andrej Karpathy, membre fondateur de l'équipe technique d'OpenAI et ancien directeur de l'IA chez Tesla, début 2025. Sa définition était claire: on interagit avec l'IA en langage naturel, on accepte les suggestions sans trop analyser, on \"vibre\" avec le flow plutôt que de lire chaque ligne.",[32,1384,1385],{},"L'idée résonnait avec une réalité: les LLMs avaient fait des progrès spectaculaires en génération de code. Pour un développeur solo avec un projet précis et borné, laisser Claude ou GPT écrire les fonctions de base permettait effectivement d'aller beaucoup plus vite.",[32,1387,1388],{},"Mais Karpathy lui-même avait posé une limite importante, souvent oubliée dans les articles enthousiastes: le vibe coding était conçu pour les \"throwaway weekend projects\". Pas pour la production.",[77,1390,1392],{"id":1391},"ce-pour-quoi-le-vibe-coding-fonctionne-vraiment","Ce pour quoi le vibe coding fonctionne vraiment",[32,1394,1395],{},"Il faut être honnête: le vibe coding est redoutablement efficace dans certains contextes.",[32,1397,1398,1401],{},[201,1399,1400],{},"Pour un MVP en 48h",", un prototype pour un client, une landing page, un script interne ou un outil personnel, la méthode fait gagner un temps considérable. Pas besoin de documentation, pas de réunion de conception, on itère en temps réel avec l'IA.",[77,1403,1405],{"id":1404},"les-limites-concrètes-des-llms-qui-ont-tout-changé","Les limites concrètes des LLMs qui ont tout changé",[32,1407,1408],{},"Le problème n'est pas l'IA. C'est ce qu'un LLM est, fondamentalement: un modèle qui prédit le texte le plus probable, pas celui qui est correct.",[32,1410,1411],{},"Quatre limites se manifestent de façon répétée sur les projets réels:",[32,1413,1414,1417],{},[201,1415,1416],{},"Les hallucinations."," Le modèle invente des fonctions, des APIs, des dépendances qui n'existent pas. Il génère du code qui compile mais fait faux. Sur un projet de 500 lignes, c'est détectable. Sur 50 000 lignes, c'est catastrophique.",[32,1419,1420,1423],{},[201,1421,1422],{},"La perte de contexte."," Les LLMs ont une fenêtre de contexte limitée. Quand le projet grandit, le modèle perd le fil. Il réécrit des fonctions existantes, crée des incohérences entre modules, contredit ses propres choix d'architecture d'une session à l'autre.",[32,1425,1426,1429],{},[201,1427,1428],{},"L'incohérence temporelle."," L'IA n'a pas de mémoire entre les sessions. Chaque conversation repart de zéro. Sans mécanisme pour maintenir un contexte partagé et persistant, le code produit diverge inexorablement.",[32,1431,1432,1435],{},[201,1433,1434],{},"Le code spaghetti structurel."," C'est peut-être la limite la plus insidieuse. Un LLM optimise pour satisfaire la demande immédiate, pas pour produire un code maintenable sur la durée. Il génère des solutions localement correctes mais globalement incohérentes: des fonctions dupliquées avec des noms légèrement différents, des logiques métier éparpillées sans architecture claire, des couplages implicites entre modules qui rendent chaque modification risquée. Le code \"marche\" mais personne ne peut le lire, le tester, ni le faire évoluer sans tout casser. La maintenance devient exponentiellement coûteuse, et paradoxalement, même l'IA finit par ne plus comprendre ce qu'elle a elle-même produit quelques sessions plus tôt.",[77,1437,1439],{"id":1438},"la-3-month-wall-quand-le-projet-vibe-codé-seffondre","La \"3-month wall\": quand le projet vibe-codé s'effondre",[32,1441,1442],{},"Red Hat Developer a publié en février 2026 \"The uncomfortable truth about vibe coding\": un constat documenté sur des dizaines de projets. La dette technique générée par le vibe coding ne se voit pas dans les premières semaines. Elle explose aux alentours du troisième mois, précisément quand le code spaghetti accumulé session après session rend chaque nouvelle fonctionnalité plus coûteuse que la précédente.",[640,1444],{},[27,1446,1448],{"id":1447},"la-réponse-de-lindustrie-une-prolifération-de-frameworks","La réponse de l'industrie: une prolifération de frameworks",[32,1450,1451],{},"Face à ces limites, l'industrie n'a pas attendu. En l'espace de quelques mois, des dizaines de frameworks ont émergé avec la même ambition: donner à l'IA les rails dont elle a besoin pour rester cohérente. Voici les principaux.",[77,1453,1455],{"id":1454},"le-spec-driven-development-le-principe-fondateur","Le Spec-Driven Development: le principe fondateur",[32,1457,1458],{},"Avant de parler des frameworks, il faut comprendre le principe qui les sous-tend tous: le Spec-Driven Development (SDD).",[32,1460,1461],{},"L'idée est simple mais radicale. Au lieu de laisser le code être la source de vérité, on donne ce rôle à la spécification. Le code devient un artefact dérivé de la spec, pas l'inverse.",[32,1463,1464,1465,1468,1469,1472,1473,54,1476,1479],{},"Concrètement, le workflow SDD suit trois phases: ",[201,1466,1467],{},"Requirements"," (définir précisément ce qu'on veut construire), ",[201,1470,1471],{},"Design"," (l'architecture et les choix techniques), puis seulement ",[201,1474,1475],{},"Tasks",[201,1477,1478],{},"Code",". L'IA intervient à chaque étape, mais toujours contrainte par les artefacts des étapes précédentes.",[32,1481,1482],{},"Le Thoughtworks Tech Radar a classé le spec-driven development en catégorie \"Adopt\" en 2026. C'est la recommandation la plus forte du radar. Autrement dit: ce n'est plus une tendance, c'est une pratique mainstream.",[77,1484,1486],{"id":1485},"bmad-method-le-framework-le-plus-ambitieux","BMAD Method: le framework le plus ambitieux",[32,1488,1489,1492],{},[201,1490,1491],{},"BMAD"," (Breakthrough Method for Agile AI-Driven Development) est le framework SDD le plus complet disponible. Il est open source, gratuit, et s'intègre directement dans Claude Code, Cursor et Windsurf.",[32,1494,1495,1496,1499],{},"Sa spécificité: il orchestre une équipe virtuelle de ",[201,1497,1498],{},"21 agents spécialisés",". Chaque agent a un rôle défini (Product Manager, Architect, Developer, Scrum Master, UX Designer...) et des responsabilités précises. Ils communiquent via des artefacts standardisés: PRDs, user stories, documents d'architecture.",[32,1501,1502],{},"Le concept central de BMAD est \"Agent as Code\": chaque agent est défini dans un fichier Markdown versionnable. Comme l'Infrastructure as Code, mais pour les comportements IA. Cela signifie que la configuration de votre équipe d'agents peut être commitée, reviewée et partagée comme du code ordinaire.",[32,1504,1505,1506,1509],{},"BMAD propose plus de ",[201,1507,1508],{},"50 workflows guidés"," qui s'adaptent à la complexité du projet. Son cycle principal: Analysis (capter le problème en une page) → Planning (user stories avec critères d'acceptation) → Solutioning (architecture + plan d'implémentation) → Implementation (itérations courtes, story par story).",[32,1511,1512],{},"La documentation officielle résume bien le changement de paradigme: \"Source code is no longer the sole source of truth, documentation is. Code becomes merely a downstream derivative of specifications.\"",[32,1514,1515,1516],{},"Projet GitHub: ",[36,1517,1520],{"href":1518,"rel":1519},"https:\u002F\u002Fgithub.com\u002Fbmad-code-org\u002FBMAD-METHOD",[40],"github.com\u002Fbmad-code-org\u002FBMAD-METHOD",[77,1522,1524],{"id":1523},"github-spec-kit-le-plus-adopté-le-plus-accessible","GitHub Spec Kit: le plus adopté, le plus accessible",[32,1526,1527,1528,1531],{},"Créé et maintenu par GitHub, le ",[201,1529,1530],{},"Spec Kit"," a dépassé les 75 000 étoiles sur GitHub, c'est le framework SDD le plus adopté par la communauté. Son avantage principal: il est compatible avec GitHub Copilot, Claude Code et Gemini CLI, ce qui le rend accessible aux équipes qui utilisent déjà ces outils.",[32,1533,1534],{},"Son workflow est plus simple que BMAD. On part d'une idée, on génère une spec structurée, on la décompose en tâches, et l'IA implémente tâche par tâche. Moins d'agents, moins de cérémonie, mais la même philosophie: la spec prime sur le code.",[32,1536,1537],{},"Pour les équipes qui cherchent à adopter le SDD sans une courbe d'apprentissage trop raide, le Spec Kit est souvent le bon point d'entrée.",[32,1539,1540,1541],{},"Documentation: ",[36,1542,1545],{"href":1543,"rel":1544},"https:\u002F\u002Fgithub.blog\u002Fai-and-ml\u002Fgenerative-ai\u002Fspec-driven-development-with-ai-get-started-with-a-new-open-source-toolkit\u002F",[40],"github.blog",[77,1547,1549],{"id":1548},"gsd-get-shit-done-la-complexité-cachée-derrière-la-simplicité-affichée","GSD (Get Shit Done): la complexité cachée derrière la simplicité affichée",[32,1551,1552,1555],{},[201,1553,1554],{},"GSD"," (Get Shit Done) adopte une philosophie différente: \"Move complexity into the system, not the workflow.\" Pour l'utilisateur, l'interface est simple, quelques commandes qui \"just work\". Mais en coulisses, GSD orchestre du context engineering avancé, du prompt XML, des subagents et de la gestion d'état.",[32,1557,1558],{},"GSD est utilisé par des ingénieurs chez Amazon, Google, Shopify et Webflow. Il est particulièrement adapté aux développeurs solo qui veulent aller vite sans gérer eux-mêmes la complexité de l'orchestration.",[32,1560,1561],{},"La nuance importante: GSD est simple à utiliser, pas simple à comprendre. Quand quelque chose ne fonctionne pas comme prévu, debugger le système peut être délicat.",[32,1563,1515,1564],{},[36,1565,1568],{"href":1566,"rel":1567},"https:\u002F\u002Fgithub.com\u002Fgsd-build\u002Fget-shit-done",[40],"github.com\u002Fgsd-build\u002Fget-shit-done",[77,1570,1572],{"id":1571},"openspec-pour-les-projets-existants","OpenSpec: pour les projets existants",[32,1574,1575,1578],{},[201,1576,1577],{},"OpenSpec"," répond à un problème différent: comment utiliser l'IA sur un projet brownfield, un codebase existant avec de la dette technique, sans introduire de nouvelles incohérences?",[32,1580,1581,1582,1585,1586,1589],{},"Sa clé conceptuelle: \"version control for intent\". OpenSpec sépare physiquement l'état actuel du projet (dans un répertoire ",[117,1583,1584],{},"specs\u002F",") des modifications proposées (dans un répertoire ",[117,1587,1588],{},"changes\u002F","). Avant d'écrire une seule ligne de code, on s'accorde sur ce qu'on veut construire. L'IA ne peut pas \"dériver\" parce que les frontières entre l'existant et le proposé sont explicites.",[32,1591,1592],{},"Pour les agences web qui travaillent sur des sites WordPress par exemple ou des applications existantes et veulent commencer à intégrer l'IA sans tout casser, OpenSpec mérite sérieusement d'être évalué.",[32,1594,1515,1595],{},[36,1596,1599],{"href":1597,"rel":1598},"https:\u002F\u002Fgithub.com\u002FFission-AI\u002FOpenSpec",[40],"github.com\u002FFission-AI\u002FOpenSpec",[77,1601,1603],{"id":1602},"claude-task-master-la-gestion-de-tâches-pour-lia","Claude Task Master: la gestion de tâches pour l'IA",[32,1605,1606,1609],{},[201,1607,1608],{},"Claude Task Master"," est un système de task management pensé spécifiquement pour le développement assisté par l'IA. Il s'installe directement dans Cursor, Windsurf, Lovable ou Roo sans changer fondamentalement votre workflow.",[32,1611,1612],{},"Son principe: décomposer automatiquement une fonctionnalité en tâches granulaires, les prioriser par dépendances, et permettre à l'IA de les adresser une par une avec un contexte précis. Plutôt que de donner à l'IA une user story complexe et espérer un résultat cohérent, Claude Task Master découpe le problème en unités que le LLM peut traiter de façon fiable.",[32,1614,1615],{},"C'est un outil complémentaire plus qu'un framework complet. Il s'intègre bien avec BMAD ou le Spec Kit.",[32,1617,1515,1618],{},[36,1619,1622],{"href":1620,"rel":1621},"https:\u002F\u002Fgithub.com\u002Feyaltoledano\u002Fclaude-task-master",[40],"github.com\u002Feyaltoledano\u002Fclaude-task-master",[77,1624,1626],{"id":1625},"aws-kiro-le-seul-ide-nativement-spec-driven","AWS Kiro: le seul IDE nativement spec-driven",[32,1628,1629,1632],{},[201,1630,1631],{},"Kiro"," est une catégorie à part. Ce n'est pas un framework à installer dans votre IDE existant: c'est un IDE complet construit par AWS autour du spec-driven development.",[32,1634,1635,1636,1639],{},"Son workflow: vous décrivez une fonctionnalité en langage naturel, Kiro génère automatiquement des ",[201,1637,1638],{},"requirements formalisés"," (en notation EARS, un standard pour les spécifications d'ingénierie), puis une architecture, puis un plan d'implémentation avec des tâches séquencées par dépendances. Vous validez chaque étape avant que le code soit écrit.",[32,1641,1642],{},"Kiro introduit aussi deux concepts originaux:",[32,1644,1645,1646,1649],{},"Les ",[201,1647,1648],{},"Agent Hooks",": des triggers automatiques qui exécutent des actions prédéfinies sur des événements (save, create, delete). Par exemple, à chaque fois que vous sauvegardez un fichier, Kiro peut automatiquement mettre à jour la documentation correspondante.",[32,1651,1645,1652,1655],{},[201,1653,1654],{},"Steering files",": des fichiers Markdown qui décrivent les conventions, librairies et standards de votre projet. Au lieu de répéter vos préférences à chaque session, vous les définissez une fois. Kiro les intègre en contexte persistant.",[32,1657,1658],{},"Pour les projets qui démarrent de zéro avec une volonté forte de structure dès le départ, Kiro est probablement la solution la plus mature.",[32,1660,1661,1662],{},"Site officiel: ",[36,1663,1666],{"href":1664,"rel":1665},"https:\u002F\u002Fkiro.dev\u002F",[40],"kiro.dev",[77,1668,1670],{"id":1669},"tdd-avec-lia-la-méthode-classique-qui-retrouve-une-nouvelle-jeunesse","TDD avec l'IA: la méthode classique qui retrouve une nouvelle jeunesse",[32,1672,674,1673,1676],{},[201,1674,1675],{},"Test-Driven Development"," n'est pas nouveau, c'est une pratique des années 1990. Mais avec l'IA, il prend une dimension nouvelle et particulièrement pertinente.",[32,1678,1679],{},"Le principe du TDD: écrire les tests avant le code. On définit ce que le code doit faire (les assertions), puis on écrit le code qui fait passer ces tests.",[32,1681,1682],{},"Avec un LLM, les tests deviennent une spec exécutable. On donne à l'IA les tests à passer, elle génère le code correspondant. L'avantage majeur: les tests agissent comme garde-fou contre les hallucinations. Si l'IA génère du code incorrect, les tests échouent immédiatement et visiblement.",[32,1684,1685],{},"Le site codemanship.wordpress.com l'exprime bien: \"TDD works so well in AI-assisted programming because the developer can set the quality barriers and define the design.\" L'IA écrit le code, le développeur définit les critères de succès. Chacun fait ce qu'il fait le mieux.",[32,1687,1688],{},"En pratique, TDD et SDD convergent: les specs deviennent des tests, les tests deviennent des specs. C'est d'ailleurs ce qu'AWS Kiro fait nativement avec les critères d'acceptation de ses Feature Specs.",[77,1690,1692],{"id":1691},"ralph-loop-matt-pocock-les-fondamentaux-dabord-lautonomie-ensuite","Ralph Loop (Matt Pocock) — les fondamentaux d'abord, l'autonomie ensuite",[32,1694,1695],{},"Matt Pocock, formateur TypeScript et créateur d'AI Hero, défend une position qui résonne directement avec la thèse de cet article. Sa conférence \"It Ain't Broke\" (AI Engineer Europe, 2026) est explicite: les fondamentaux du développement logiciel ne sont pas rendus obsolètes par l'IA. Ils sont devenus encore plus critiques.",[32,1697,1698,1699,715],{},"Son workflow complet: ",[201,1700,1701,1702,1705,1706,1709],{},"Idea → ",[117,1703,1704],{},"\u002Fwrite-a-prd"," → PRD → ",[117,1707,1708],{},"\u002Fprd-to-issues"," → Kanban → Ralph Loop → Manual QA",[32,1711,1712,1713,1716],{},"Le coeur de sa méthode est le ",[201,1714,1715],{},"Ralph Loop",", une technique pour faire tourner des agents IA en boucles autonomes prolongées. L'idée: au lieu de superviser chaque échange avec l'IA, on configure un agent qui lit le backlog, choisit la prochaine tâche, l'implémente en TDD (red-green-refactor), fait tourner les tests et les vérifications de types, committe si ça passe, et recommence. On revient quelques heures plus tard à du code fonctionnel et committé.",[32,1718,1719],{},"Deux concepts structurent son approche:",[32,1721,1722,1725],{},[201,1723,1724],{},"La \"Smart Zone\"."," Les LLMs ont une fenêtre de performance optimale, autour de 100 000 tokens de contexte. En dessous, ils sont efficaces. Au-delà, ils entrent dans la \"dumb zone\": la qualité chute, les hallucinations augmentent. Sa règle: ne jamais donner à l'IA plus qu'elle ne peut \"chew\" à la fois. Décomposer les tâches en unités atomiques plutôt que de tout envoyer en une seule requête.",[32,1727,1728,1731],{},[201,1729,1730],{},"Le prompt \"Grill me\"."," Avant d'écrire une spec, Pocock utilise un skill qui demande à l'IA de challenger ses hypothèses de conception. L'IA joue l'avocat du diable sur l'architecture envisagée. L'objectif: découvrir les angles morts avant de committer une direction, pas après avoir codé 500 lignes dans le mauvais sens.",[32,1733,1734,1735,1738,1739,1273,1742,1273,1745,1273,1748,1273,1751,1273,1754,1757],{},"Sa collection de 21 skills Claude Code (installables via ",[117,1736,1737],{},"npx",") formalisent ces pratiques: ",[117,1740,1741],{},"to-prd",[117,1743,1744],{},"to-issues",[117,1746,1747],{},"grill-me",[117,1749,1750],{},"tdd",[117,1752,1753],{},"improve-codebase-architecture",[117,1755,1756],{},"git-guardrails-claude-code","... Chaque skill impose une discipline de workflow à l'agent, pas juste au développeur.",[32,1759,1760],{},"Ce qui distingue l'approche Pocock des autres frameworks: elle ne cherche pas à remplacer les pratiques d'ingénierie par des specs IA. Elle les renforce. Le TDD reste du TDD, le design reste du design. L'IA s'insère dans un processus éprouvé plutôt que de proposer un nouveau paradigme.",[32,1762,1763,1764],{},"Vidéo d'explication : ",[36,1765,1766],{"href":1766,"rel":1767},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=v4F1gFy-hqg",[40],[32,1769,1770,1771,1776,1777],{},"Skills: ",[36,1772,1775],{"href":1773,"rel":1774},"https:\u002F\u002Fwww.everydev.ai\u002Ftools\u002Fmattpocock-skills",[40],"everydev.ai\u002Ftools\u002Fmattpocock-skills"," — Ralph Loop: ",[36,1778,1781],{"href":1779,"rel":1780},"https:\u002F\u002Fgithub.com\u002Fsnwfdhmp\u002Fawesome-ralph",[40],"github.com\u002Fsnwfdhmp\u002Fawesome-ralph",[640,1783],{},[27,1785,1787],{"id":1786},"le-paradoxe-a-t-on-vraiment-simplifié-le-développement","Le paradoxe: a-t-on vraiment simplifié le développement?",[32,1789,1790],{},"Posons la question franchement. En 2025, vibe coding = ouvrir un chat et taper une demande. En 2026, \"bien développer avec l'IA\" = choisir entre 8 frameworks, apprendre leurs concepts (agents, PRDs, specs EARS, steering files, agent hooks...), configurer des dizaines de fichiers, et maintenir une documentation qui précède le code.",[32,1792,1793],{},"Est-ce vraiment plus simple?",[77,1795,1797],{"id":1796},"la-complexité-sest-déplacée-pas-disparue","La complexité s'est déplacée, pas disparue",[32,1799,1800],{},"Ce qui a changé: vous écrivez moins de code bas niveau. Ce qui n'a pas changé: vous devez comprendre exactement ce que vous voulez construire, comment l'architecturer, et comment vérifier que ce qui est produit est correct.",[32,1802,1803],{},"En fait, les frameworks SDD ont révélé quelque chose d'intéressant. Les LLMs échouent précisément là où les développeurs juniors échouent aussi: sur les parties floues, mal définies, sans spécification claire. Quand le problème est précisément formulé, comme dans un bon test unitaire ou une user story bien rédigée, l'IA performe remarquablement. Quand c'est vague, elle hallucine.",[32,1805,1806],{},"Les frameworks SDD ne compensent pas les limites de l'IA. Ils compensent les limites de la formulation humaine. Ils forcent à définir précisément ce qu'on veut, et c'est exactement ce qu'un bon développeur senior faisait déjà avant même d'écrire la première ligne.",[77,1808,1810],{"id":1809},"ce-qui-a-changé-pour-les-développeurs","Ce qui a changé pour les développeurs",[32,1812,1813],{},"Le repositionnement des compétences développeur avec l'IA est réel:",[110,1815,1816,1822],{},[113,1817,1818,1821],{},[201,1819,1820],{},"Avant",": savoir écrire du code, connaître les patterns, débugger à la main",[113,1823,1824,1827,1828],{},[201,1825,1826],{},"Maintenant",": savoir architecturer un système, rédiger des specs précises, et surtout ",[201,1829,1830],{},"relire et valider du code généré par l'IA",[32,1832,1833],{},"Cette dernière compétence est critique et sous-estimée. Un LLM peut produire du code qui compile, passe les tests basiques, et reste pourtant fondamentalement défaillant sur des edge cases ou des problèmes de sécurité. Un développeur qui ne sait pas lire du code, qui délègue entièrement la compréhension à l'IA, ne peut pas détecter ces défaillances.",[77,1835,1837],{"id":1836},"ce-qui-na-absolument-pas-changé","Ce qui n'a absolument pas changé",[32,1839,1840],{},"Savoir comment un projet devrait fonctionner reste indispensable. Écrire une bonne spec ou un bon PRD demande de comprendre les cas d'usage, les contraintes techniques, les dépendances entre composants. Ça, aucune IA ne peut le faire à votre place, elle n'a pas accès à vos clients, à votre contexte métier, à vos contraintes d'infrastructure.",[32,1842,1843],{},"La dette technique existe toujours. Elle se génère même plus vite avec l'IA qu'à la main, précisément parce que la vitesse de production augmente. Si la direction est mauvaise, on va plus vite dans le mauvais sens.",[32,1845,1846],{},"Et savoir relire du code reste la compétence numéro un qui sépare un bon développeur d'un utilisateur d'IA. Les frameworks aident, mais ils ne remplacent pas le jugement.",[640,1848],{},[27,1850,1852],{"id":1851},"conclusion-lia-a-transformé-le-développement-pas-simplifié","Conclusion: l'IA a transformé le développement, pas simplifié",[32,1854,1855],{},"Ce n'est pas une tendance, c'est un mouvement de fond. L'industrie a collectivement reconnu que laisser l'IA \"vibe\" sans contraintes ne fonctionnait pas à l'échelle.",[32,1857,1858],{},"Mais voilà ce qu'il faut retenir: la complexité des frameworks n'est pas un échec de l'IA. C'est la preuve que le développement logiciel est intrinsèquement complexe, et que cette complexité ne disparaît pas, elle se déplace vers la conception, la spécification, la review.",[32,1860,1861],{},"Les développeurs qui prospèrent dans cet environnement ne sont pas ceux qui ont abandonné la lecture du code à l'IA. Ce sont ceux qui savent architecturer des systèmes, rédiger des specs précises, et valider ce que l'IA produit.",[32,1863,1864],{},"Le développeur du futur n'est pas remplacé. Il est repositionné. Chef d'orchestre d'une équipe d'agents, architecte des contraintes, relecteur critique de la production IA. C'est un rôle différent, plus stratégique, et qui demande encore plus de compétence réelle.",[32,1866,1867],{},"Choisissez votre framework selon la complexité de votre projet, pas selon l'effet de mode. Et si vous ne savez pas lire le code que l'IA génère pour vous, commencez par apprendre ça.",[640,1869],{},[32,1871,1872],{},[1873,1874,1875,1876,1273,1881,1273,1885,1273,1889,1273,1892,1273,1895,1273,1898,1273,1903,1273,1908],"em",{},"Sources: ",[36,1877,1880],{"href":1878,"rel":1879},"https:\u002F\u002Fdocs.bmad-method.org\u002F",[40],"BMAD Method",[36,1882,1884],{"href":1543,"rel":1883},[40],"GitHub Spec Kit",[36,1886,1888],{"href":1664,"rel":1887},[40],"AWS Kiro",[36,1890,1554],{"href":1566,"rel":1891},[40],[36,1893,1577],{"href":1597,"rel":1894},[40],[36,1896,1608],{"href":1620,"rel":1897},[40],[36,1899,1902],{"href":1900,"rel":1901},"https:\u002F\u002Fwww.thoughtworks.com\u002Fradar\u002Ftechniques\u002Fspec-driven-development",[40],"Thoughtworks Tech Radar",[36,1904,1907],{"href":1905,"rel":1906},"https:\u002F\u002Fdevelopers.redhat.com\u002Farticles\u002F2026\u002F02\u002F17\u002Funcomfortable-truth-about-vibe-coding",[40],"Red Hat Developer",[36,1909,1912],{"href":1910,"rel":1911},"https:\u002F\u002Fthenewstack.io\u002Fvibe-coding-spec-driven\u002F",[40],"The New Stack",{"title":395,"searchDepth":1141,"depth":1141,"links":1914},[1915,1921,1932,1937],{"id":1374,"depth":1141,"text":1375,"children":1916},[1917,1918,1919,1920],{"id":1378,"depth":1151,"text":1379},{"id":1391,"depth":1151,"text":1392},{"id":1404,"depth":1151,"text":1405},{"id":1438,"depth":1151,"text":1439},{"id":1447,"depth":1141,"text":1448,"children":1922},[1923,1924,1925,1926,1927,1928,1929,1930,1931],{"id":1454,"depth":1151,"text":1455},{"id":1485,"depth":1151,"text":1486},{"id":1523,"depth":1151,"text":1524},{"id":1548,"depth":1151,"text":1549},{"id":1571,"depth":1151,"text":1572},{"id":1602,"depth":1151,"text":1603},{"id":1625,"depth":1151,"text":1626},{"id":1669,"depth":1151,"text":1670},{"id":1691,"depth":1151,"text":1692},{"id":1786,"depth":1141,"text":1787,"children":1933},[1934,1935,1936],{"id":1796,"depth":1151,"text":1797},{"id":1809,"depth":1151,"text":1810},{"id":1836,"depth":1151,"text":1837},{"id":1851,"depth":1141,"text":1852},"Vibe coding, BMAD, Spec-Driven, AWS Kiro, GSD: tour d'horizon des méthodes de développement IA en 2026 et pourquoi les développeurs restent indispensables.",{},"\u002Farticles\u002Fvibe-coding-bmad-spec-driven-methode-developpement-ia","2026-04-28",{"title":1333,"description":1938},"articles\u002Fvibe-coding-bmad-spec-driven-methode-developpement-ia","GFveb6sYMeLvYadSZ25Oal_qemQuj2goEMvS73K0Yzw",{"id":1946,"title":1947,"author":1948,"body":1949,"description":2544,"extension":1324,"meta":2545,"navigation":1154,"path":2546,"publicationDate":2547,"seo":2548,"stem":2549,"__hash__":2550},"articles\u002Farticles\u002Fclaudecode-vs-opencode.md","Claude Code vs OpenCode: Quel différence entre les deux agents de coding IA en 2026 ?",{"name":21,"url":22},{"type":24,"value":1950,"toc":2524},[1951,1954,1967,1970,1973,1996,1998,2002,2005,2011,2014,2026,2029,2031,2035,2038,2042,2045,2048,2051,2055,2058,2061,2064,2067,2071,2074,2077,2080,2083,2087,2090,2092,2096,2099,2103,2106,2109,2137,2140,2143,2147,2150,2153,2157,2160,2162,2166,2169,2288,2291,2294,2296,2300,2305,2344,2349,2360,2365,2373,2378,2389,2392,2394,2398,2401,2404,2407,2409,2413,2416,2419,2422,2430,2432,2434,2437,2440,2443,2446,2448,2452],[32,1952,1953],{},"Le meilleur agent de coding IA n'est pas celui qui a le plus de fonctionnalités. C'est celui qui s'adapte à votre workflow, votre budget et vos contraintes. Claude Code et OpenCode sont les deux agents de coding en terminal qui dominent le marché en 2026, et ils incarnent des philosophies radicalement différentes. L'un vous donne de la profondeur, l'autre vous donne de la liberté.",[32,1955,1956,1957,1960,1963,1964,715],{},"La réponse courte:",[1958,1959],"br",{},[201,1961,1962],{},"Choisissez Claude Code si vous êtes déjà abonné à Claude, que vous n'avez pas de contraintes budgétaires et que l'idée de vous enfermer dans un seul écosystème ne vous dérange pas",". ",[201,1965,1966],{},"Choisissez OpenCode si vous souhaitez travailler avec plusieurs providers IA, si vous avez des contraintes de privacy ou de conformité, si vous voulez minimiser vos coûts et que vous favorisez les projet open sources",[32,1968,1969],{},"Mais la vraie décision est plus nuancée. Les deux outils ont beaucoup évolué en 2026, et le bon choix dépend de votre situation concrète.",[32,1971,1972],{},"Ce guide l'analyse cas d'usage par cas d'usage.",[85,1974,1975,1979],{},[32,1976,1977],{},[201,1978,1355],{},[110,1980,1981,1984,1987,1990,1993],{},[113,1982,1983],{},"Claude Code vous lie aux modèles Anthropic mais embarque les fonctionnalités agentiques les plus avancées de 2026 (Ultraplan, Monitor tool, Computer Use, tâches planifiées)",[113,1985,1986],{},"OpenCode supporte 75+ providers IA dont les modèles locaux via Ollama, ce qui en fait la seule option viable pour les environnements isolés ou soumis à des contraintes réglementaires",[113,1988,1989],{},"L'extension VS Code de Claude Code est vraiment native (panneau graphique, diff viewer, checkpoints, intégration Chrome); le support VS Code d'OpenCode est fonctionnel mais plus léger",[113,1991,1992],{},"Les deux supportent Amazon Bedrock et Google Vertex AI, donc les équipes enterprise ne sont pas forcées de choisir sur ce critère",[113,1994,1995],{},"Les deux outils ne sont pas mutuellement exclusifs: beaucoup de développeurs utilisent Claude Code au quotidien et OpenCode pour l'expérimentation ou les projets réglementés",[640,1997],{},[27,1999,2001],{"id":2000},"ce-que-sont-vraiment-claude-code-et-opencode","Ce que sont vraiment Claude Code et OpenCode",[32,2003,2004],{},"Avant de les comparer, il faut comprendre ce que chaque outil cherche à être.",[32,2006,2007,2010],{},[201,2008,2009],{},"Claude Code"," est le CLI agentique officiel d'Anthropic. Il est étroitement couplé à la famille de modèles Claude, profondément intégré à l'écosystème VS Code, et conçu autour d'un workflow cloud-first. Anthropic livre des mises à jour chaque semaine, parfois plus.",[32,2012,2013],{},"L'outil a évolué d'un simple CLI vers une plateforme complète avec des sessions web, une exécution distante, des tâches planifiées et de la collaboration en temps réel.",[32,2015,2016,2019,2020,2025],{},[201,2017,2018],{},"OpenCode"," est un agent de coding IA open-source écrit en Go. Il a été conçu pour le terminal avec une TUI (interface textuelle) soignée et il adopte une posture délibérément différente: apportez votre propre modèle, possédez vos données, exécutez-le n'importe où. Avec ",[36,2021,2024],{"href":2022,"rel":2023},"https:\u002F\u002Fgithub.com\u002Fanomalyco\u002Fopencode",[40],"plus de 147 000 étoiles GitHub"," en mars 2026, c'est loin d'être un projet de niche.",[32,2027,2028],{},"Le fossé philosophique est réel. Claude Code parie que les modèles Anthropic sont les meilleurs modèles de coding disponibles et construit toute son expérience autour de cette hypothèse. OpenCode parie que le meilleur modèle est celui que vous choisissez, et construit son expérience autour de la flexibilité des modèles.",[640,2030],{},[27,2032,2034],{"id":2033},"quand-choisir-opencode","Quand choisir OpenCode",[32,2036,2037],{},"OpenCode s'impose dans quatre scénarios précis. Si l'un d'eux s'applique à vous, c'est probablement le meilleur choix.",[77,2039,2041],{"id":2040},"_1-vous-avez-des-contraintes-de-privacy-ou-de-conformité","1. Vous avez des contraintes de privacy ou de conformité",[32,2043,2044],{},"C'est le cas le plus évident pour OpenCode. Dans les secteurs réglementés comme la défense, la santé ou la fintech, envoyer du code à un provider cloud externe peut violer les politiques de gouvernance des données.",[32,2046,2047],{},"Le mode isolé d'OpenCode vous permet de tout exécuter en local via Ollama avec des modèles open-source comme Llama 3, Mistral ou DeepSeek Coder. Rien ne quitte votre machine. Pas d'appels API, pas de dépendances externes, pas de risque de conformité.",[32,2049,2050],{},"Claude Code n'a pas d'équivalent. Même en utilisant Amazon Bedrock ou Google Vertex AI, vos prompts et le contexte de votre code transitent quand même par le réseau vers un endpoint cloud. Pour les équipes soumises à des exigences strictes de résidence des données, c'est éliminatoire.",[77,2052,2054],{"id":2053},"_2-vous-voulez-utiliser-plusieurs-providers-ia-ou-passer-de-lun-à-lautre","2. Vous voulez utiliser plusieurs providers IA (ou passer de l'un à l'autre)",[32,2056,2057],{},"OpenCode se connecte à plus de 75 providers IA. En pratique, cela signifie que vous pouvez faire tourner Claude Sonnet (via Vertex) pour les discussions d'architecture, GPT-4o pour la génération de boilerplate, Gemini Flash pour les modifications rapides, et un modèle Llama local pour les refactorings sensibles, le tout depuis la même interface.",[32,2059,2060],{},"C'est plus important qu'il n'y paraît. Les performances des modèles ne sont pas uniformes selon les types de tâches. Le meilleur modèle pour écrire des génériques TypeScript complexes n'est pas forcément le meilleur pour écrire des modules Terraform ou déboguer une race condition. OpenCode vous permet de router les tâches vers le modèle le plus adapté.",[32,2062,2063],{},"Claude Code ne supporte pas cela. Vous êtes sur Claude, point. Claude Opus, Sonnet ou Haiku selon votre abonnement, mais toujours Anthropic. Si les modèles Anthropic ne sont pas la meilleure option pour une tâche précise, vous n'avez pas d'alternative.",[32,2065,2066],{},"Pour les développeurs individuels qui expérimentent dans un paysage de modèles en évolution rapide, la flexibilité d'OpenCode est un avantage réel.",[77,2068,2070],{"id":2069},"_3-vous-êtes-sensible-au-coût-ou-voulez-minimiser-vos-dépenses","3. Vous êtes sensible au coût ou voulez minimiser vos dépenses",[32,2072,2073],{},"OpenCode lui-même est gratuit. Le seul coût est celui des tokens API du provider que vous utilisez. Si vous hébergez des modèles via Ollama, votre coût récurrent est nul au-delà du matériel.",[32,2075,2076],{},"Vous pouvez même utiliser des modèles gratuit comme MiniMax M2.5 via OpenCode Zen.",[32,2078,2079],{},"Claude Code nécessite un abonnement Claude actif. Le point d'entrée est Claude Pro à 20 $\u002Fmois, et une utilisation agentique sérieuse (avec accès au mode Auto et à Opus 4.7) requiert le plan Max à des tarifs nettement plus élevés. Les équipes sur les plans Team ou Enterprise paient par siège.",[32,2081,2082],{},"Pour les développeurs individuels, la différence est significative. Pour les équipes plus larges, le calcul change selon les gains de productivité et la qualité des modèles. Mais si le budget est une contrainte, OpenCode est le point de départ évident.",[77,2084,2086],{"id":2085},"_4-pour-vous-favoriser-les-outils-open-source-est-une-priorité","4. Pour vous, favoriser les outils open source est une priorité.",[32,2088,2089],{},"Votre philosophie a toujours été de favoriser les outils open source et, parfois même, d’y contribuer. Pour vous, l’open source est l’un des socles du Web et du métier de développeur. Open Code est fait pour vous.",[640,2091],{},[27,2093,2095],{"id":2094},"quand-choisir-claude-code","Quand choisir Claude Code",[32,2097,2098],{},"Claude Code s'impose dans quatre scénarios qui lui sont propres et qui privilégient les équipes qui réalisent un travail de codage sérieux, sans aucune contrainte budgétaire, et qui n'éprouvent aucune méfiance envers les services américains, même lorsqu'ils sont totalement fermés.",[77,2100,2102],{"id":2101},"_1-vous-voulez-la-meilleure-intégration-vs-code-disponible","1. Vous voulez la meilleure intégration VS Code disponible",[32,2104,2105],{},"L'extension VS Code de Claude Code est dans une catégorie à part de toutes les autres intégrations IDE d'outils de coding IA. Ce n'est pas un terminal embarqué ni une fine surcouche. C'est un panneau graphique natif construit dans VS Code avec sa propre interface.",[32,2107,2108],{},"Ce que vous obtenez concrètement:",[110,2110,2111,2114,2117,2124,2131,2134],{},[113,2112,2113],{},"Un diff viewer côte à côte où vous pouvez accepter, rejeter ou modifier les changements proposés par Claude au niveau de la ligne avant qu'ils s'appliquent à votre fichier",[113,2115,2116],{},"Des checkpoints qui vous permettent de rembobiner l'historique du code et de la conversation indépendamment, ou de forker la conversation depuis n'importe quel point",[113,2118,2119,2120,2123],{},"Des @-mentions avec correspondance floue de fichiers et précision au numéro de ligne (",[117,2121,2122],{},"@auth.ts#45-62",")",[113,2125,2126,2127,2130],{},"L'intégration Chrome via ",[117,2128,2129],{},"@browser",", permettant à Claude de tester votre app web, lire les logs console et vérifier le comportement UI sans que vous changiez de fenêtre",[113,2132,2133],{},"Plusieurs conversations simultanées dans des onglets séparés, chacune avec son propre contexte",[113,2135,2136],{},"L'historique de sessions avec recherche, y compris les sessions distantes démarrées sur claude.ai",[32,2138,2139],{},"Le plugin JetBrains est encore en beta et adopte une approche différente: il fait tourner le CLI Claude Code dans le terminal intégré de l'IDE et utilise le diff viewer natif de JetBrains. Ça fonctionne, mais l'expérience est davantage \"CLI à l'intérieur de l'IDE\" que \"intégration IDE native.\"",[32,2141,2142],{},"Si vous passez la plupart de votre journée dans VS Code ou Cursor, l'extension de Claude Code est concrètement meilleure que ce qu'OpenCode propose actuellement.",[77,2144,2146],{"id":2145},"_2-vous-êtes-déjà-abonné-claude-ou-vous-navez-pas-de-limite-budgétaire","2. Vous êtes déjà abonné Claude ou vous n'avez pas de limite budgétaire",[32,2148,2149],{},"Si vous pouvez payer Claude Pro ou Max pour utiliser Claude.ai dans votre navigateur, Claude Code est inclus dans votre abonnement sans coût supplémentaire. Il n'y a aucune raison de ne pas l'utiliser.",[32,2151,2152],{},"L'équation économique bascule en faveur de Claude Code dès que vous avez un abonnement existant. Vous payez déjà pour les modèles. L'outil lui-même est gratuit. Le coût marginal d'utiliser Claude Code plutôt qu'OpenCode est nul.",[77,2154,2156],{"id":2155},"_3-pour-vous-les-modèles-anthropics-sont-les-meilleurs","3. Pour vous, les modèles Anthropics sont les meilleurs.",[32,2158,2159],{},"Si vous estimez que les modèles d’Anthropic sont de loin les meilleurs et que vous souhaitez n’utiliser que ces modèles, alors Claude Code est fait pour vous.\nPourquoi utiliser autre chose si vous souhaitez vous concentrer sur l’écosystème d’Anthropic ?",[640,2161],{},[27,2163,2165],{"id":2164},"les-providers-comparaison-détaillée","Les providers: comparaison détaillée",[32,2167,2168],{},"Le paysage des providers est là où les outils divergent le plus nettement.",[216,2170,2171,2182],{},[219,2172,2173],{},[222,2174,2175,2178,2180],{},[225,2176,2177],{},"Provider",[225,2179,2009],{},[225,2181,2018],{},[238,2183,2184,2195,2205,2214,2224,2234,2243,2252,2261,2270,2279],{},[222,2185,2186,2189,2192],{},[243,2187,2188],{},"API Anthropic",[243,2190,2191],{},"Oui (défaut)",[243,2193,2194],{},"Oui",[222,2196,2197,2200,2203],{},[243,2198,2199],{},"Amazon Bedrock",[243,2201,2202],{},"Oui (wizard guidé)",[243,2204,2194],{},[222,2206,2207,2210,2212],{},[243,2208,2209],{},"Google Vertex AI",[243,2211,2202],{},[243,2213,2194],{},[222,2215,2216,2219,2221],{},[243,2217,2218],{},"Microsoft Foundry",[243,2220,2194],{},[243,2222,2223],{},"Non documenté",[222,2225,2226,2229,2232],{},[243,2227,2228],{},"OpenAI (GPT-4o, o3)",[243,2230,2231],{},"Non",[243,2233,2194],{},[222,2235,2236,2239,2241],{},[243,2237,2238],{},"Google Gemini",[243,2240,2231],{},[243,2242,2194],{},[222,2244,2245,2248,2250],{},[243,2246,2247],{},"Groq",[243,2249,2231],{},[243,2251,2194],{},[222,2253,2254,2257,2259],{},[243,2255,2256],{},"Azure OpenAI",[243,2258,2231],{},[243,2260,2194],{},[222,2262,2263,2266,2268],{},[243,2264,2265],{},"OpenRouter",[243,2267,2231],{},[243,2269,2194],{},[222,2271,2272,2275,2277],{},[243,2273,2274],{},"Ollama (modèles locaux)",[243,2276,2231],{},[243,2278,2194],{},[222,2280,2281,2284,2286],{},[243,2282,2283],{},"Models.dev (75+ providers)",[243,2285,2231],{},[243,2287,2194],{},[32,2289,2290],{},"Le support de providers de Claude Code est intentionnellement limité. L'objectif est de donner aux équipes enterprise un chemin conforme vers Claude via leur infrastructure cloud existante, pas de maximiser la variété des modèles.",[32,2292,2293],{},"La largeur de providers d'OpenCode est sa caractéristique technique définissante. L'intégration avec Models.dev signifie qu'il se connecte à pratiquement n'importe quel modèle disponible via une API, y compris des modèles spécialisés plus petits qui surpassent les modèles frontier sur des tâches spécifiques.",[640,2295],{},[27,2297,2299],{"id":2298},"intégrations-ide-face-à-face","Intégrations IDE: face à face",[32,2301,2302],{},[201,2303,2304],{},"Claude Code dans VS Code:",[110,2306,2307,2310,2313,2316,2319,2324,2327,2330,2333],{},[113,2308,2309],{},"Extension graphique native (pas un terminal embarqué)",[113,2311,2312],{},"Diff viewer avec acceptation\u002Frejet au niveau de la ligne",[113,2314,2315],{},"Checkpoints (rembobinage du code et de la conversation indépendamment)",[113,2317,2318],{},"@-mentions de fichiers, dossiers et sélections avec numéros de ligne",[113,2320,2321,2322],{},"Intégration Chrome via ",[117,2323,2129],{},[113,2325,2326],{},"Historique de sessions avec recherche par mot-clé et reprise de sessions distantes",[113,2328,2329],{},"Gestion des plugins avec interface de marketplace graphique",[113,2331,2332],{},"Plusieurs conversations simultanées dans des onglets",[113,2334,2335,2336,2339,2340,2343],{},"Raccourcis clavier: ",[117,2337,2338],{},"Cmd\u002FCtrl+Esc"," pour basculer le focus, ",[117,2341,2342],{},"Option\u002FAlt+K"," pour les @-mentions",[32,2345,2346],{},[201,2347,2348],{},"Claude Code dans JetBrains:",[110,2350,2351,2354,2357],{},[113,2352,2353],{},"CLI dans le terminal intégré",[113,2355,2356],{},"Diff viewer natif JetBrains pour les flux de révision et d'acceptation",[113,2358,2359],{},"Encore en beta",[32,2361,2362],{},[201,2363,2364],{},"OpenCode dans VS Code:",[110,2366,2367,2370],{},[113,2368,2369],{},"Extension disponible, intégration plus légère que Claude Code",[113,2371,2372],{},"Interaction de style TUI",[32,2374,2375],{},[201,2376,2377],{},"Application desktop OpenCode:",[110,2379,2380,2383,2386],{},[113,2381,2382],{},"Disponible pour Mac, Windows et Linux",[113,2384,2385],{},"TUI complète avec mode Plan (analyse en lecture seule) et mode Build (édition complète)",[113,2387,2388],{},"Undo\u002Fredo, partage de conversations, persistance des sessions via SQLite",[32,2390,2391],{},"Pour les utilisateurs VS Code, l'intégration de Claude Code est nettement supérieure. Pour les utilisateurs desktop Linux, OpenCode est le seul outil avec une expérience de premier ordre.",[640,2393],{},[27,2395,2397],{"id":2396},"les-plugins","Les plugins",[32,2399,2400],{},"Claude Code propose une marketplace officielle et communautaire avec des plugins validés par Anthropic et des contributions validées par la communauté. Vous pouvez évidemment créer vos propres plugins. Anthropic met l’accent sur la sécurité, la mémoire persistante et l’intégration avec des outils d’entreprise comme Google Workspace ou Asana.",[32,2402,2403],{},"OpenCode bénéficie d’un écosystème plus large et mature, avec des milliers de plugins et d’extensions disponibles via des dépôts communautaires tels que awesome-opencode et opencode.cafe. Les plugins couvrent un large éventail de cas d’usage, de l’automatisation DevOps à l’analyse de données. L’écosystème est conçu pour être très flexible, avec des plugins open source et une communauté active. Il est possible de créer des plugins personnalisés pour presque tous les besoins.",[32,2405,2406],{},"Dans les deux cas, vous avez accès à bon nombre de plugins avec un côté \"sécurité\" pour Claude Code et un côté plus communautaire pour OpenCode.",[640,2408],{},[27,2410,2412],{"id":2411},"utiliser-les-deux-outils-ensemble","Utiliser les deux outils ensemble",[32,2414,2415],{},"La réponse la plus pragmatique pour beaucoup de développeurs est: utilisez les deux.",[32,2417,2418],{},"Les outils ne sont pas mutuellement exclusifs. Vous pouvez avoir Claude Code comme outil principal au quotidien pour le développement dans VS Code, et garder OpenCode configuré pour des scénarios spécifiques: projets réglementés, expérimentation de modèles, ou tâches où un modèle Llama local suffit et où vous voulez garder du code sensible hors du réseau.",[32,2420,2421],{},"Ce type de routage délibéré des modèles, utiliser les forces de chaque provider pour la tâche à laquelle il est le plus adapté, est quelque chose qu'OpenCode active nativement et que Claude Code ne permet pas.",[85,2423,2424],{},[32,2425,2426,2429],{},[201,2427,2428],{},"Si vous partez de zéro"," et n'avez pas d'abonnements existants ni de contraintes de conformité, le chemin le plus simple est: installez OpenCode en premier (gratuit, sans engagement), configurez-le avec une clé API Anthropic ou OpenAI à l'usage, et utilisez-le une semaine. Si vous vous retrouvez à vouloir une meilleure intégration VS Code, des capacités agentiques plus profondes, ou si vous êtes suffisamment productif pour justifier un abonnement, passez à Claude Code ou ajoutez-le en parallèle.",[640,2431],{},[27,2433,1246],{"id":1245},[32,2435,2436],{},"Claude Code et OpenCode représentent deux réponses valides à la même question: à quoi devrait ressembler le coding assisté par IA en 2026?",[32,2438,2439],{},"La réponse de Claude Code: une plateforme agentique profondément intégrée, constamment mise à jour, construite autour des meilleurs modèles de coding disponibles. Ultraplan, les tâches planifiées, Computer Use et l'extension VS Code native sont tous des paris que la profondeur d'intégration bat la largeur du choix.",[32,2441,2442],{},"La réponse d'OpenCode: une interface universelle qui vous donne le contrôle de vos modèles, vos données et vos coûts. Les 75+ providers, l'exécution locale et le mode isolé sont des paris que la liberté du développeur et la privacy comptent plus que l'avantage qualitatif d'un seul modèle.",[32,2444,2445],{},"Les deux solutions sont valables. Tout dépend de si vous préférez être enfermé dans un écosystème ou si vous préférez la liberté et l'open source.",[640,2447],{},[27,2449,2451],{"id":2450},"sources","Sources",[110,2453,2454,2461,2468,2475,2482,2489,2496,2503,2510,2517],{},[113,2455,2456],{},[36,2457,2460],{"href":2458,"rel":2459},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fwhats-new",[40],"Claude Code nouveautés, docs officielles",[113,2462,2463],{},[36,2464,2467],{"href":2465,"rel":2466},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fwhats-new\u002F2026-w15",[40],"Claude Code digest semaine 15 (avril 2026)",[113,2469,2470],{},[36,2471,2474],{"href":2472,"rel":2473},"https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fvs-code",[40],"Intégration VS Code Claude Code, docs officielles",[113,2476,2477],{},[36,2478,2481],{"href":2479,"rel":2480},"https:\u002F\u002Fopencode.ai\u002Fdocs\u002F",[40],"Documentation officielle OpenCode",[113,2483,2484],{},[36,2485,2488],{"href":2486,"rel":2487},"https:\u002F\u002Fgithub.com\u002Fopencode-ai\u002Fopencode",[40],"Dépôt GitHub OpenCode",[113,2490,2491],{},[36,2492,2495],{"href":2493,"rel":2494},"https:\u002F\u002Fwww.builder.io\u002Fblog\u002Fopencode-vs-claude-code",[40],"OpenCode vs Claude Code, Builder.io",[113,2497,2498],{},[36,2499,2502],{"href":2500,"rel":2501},"https:\u002F\u002Fwww.infoq.com\u002Fnews\u002F2026\u002F02\u002Fopencode-coding-agent\u002F",[40],"OpenCode sur InfoQ",[113,2504,2505],{},[36,2506,2509],{"href":2507,"rel":2508},"https:\u002F\u002Fwww.mindstudio.ai\u002Fblog\u002Fclaude-code-q1-2026-update-roundup",[40],"Récapitulatif Q1 2026 Claude Code, MindStudio",[113,2511,2512],{},[36,2513,2516],{"href":2514,"rel":2515},"https:\u002F\u002Fportkey.ai\u002Fblog\u002Fhow-to-use-claude-code-with-bedrock-vertex-ai-and-anthropic\u002F",[40],"Claude Code sur Amazon Bedrock, Portkey",[113,2518,2519],{},[36,2520,2523],{"href":2521,"rel":2522},"https:\u002F\u002Fwww.datacamp.com\u002Fblog\u002Fopencode-vs-claude-code",[40],"OpenCode vs Claude Code, DataCamp",{"title":395,"searchDepth":1141,"depth":1141,"links":2525},[2526,2527,2533,2538,2539,2540,2541,2542,2543],{"id":2000,"depth":1141,"text":2001},{"id":2033,"depth":1141,"text":2034,"children":2528},[2529,2530,2531,2532],{"id":2040,"depth":1151,"text":2041},{"id":2053,"depth":1151,"text":2054},{"id":2069,"depth":1151,"text":2070},{"id":2085,"depth":1151,"text":2086},{"id":2094,"depth":1141,"text":2095,"children":2534},[2535,2536,2537],{"id":2101,"depth":1151,"text":2102},{"id":2145,"depth":1151,"text":2146},{"id":2155,"depth":1151,"text":2156},{"id":2164,"depth":1141,"text":2165},{"id":2298,"depth":1141,"text":2299},{"id":2396,"depth":1141,"text":2397},{"id":2411,"depth":1141,"text":2412},{"id":1245,"depth":1141,"text":1246},{"id":2450,"depth":1141,"text":2451},"Claude Code ou OpenCode? On compare providers, intégrations IDE, privacy, prix et fonctionnalités 2026 pour vous aider à choisir le bon agent de coding.",{},"\u002Farticles\u002Fclaudecode-vs-opencode","2026-04-21",{"title":1947,"description":2544},"articles\u002Fclaudecode-vs-opencode","sBONDqvGrvsYkziO_DkoRo_Xs6g-VxUVI2rE3pi1A7U",{"id":2552,"title":2553,"author":2554,"body":2555,"description":4034,"extension":1324,"meta":4035,"navigation":1154,"path":4036,"publicationDate":4037,"seo":4038,"stem":4039,"__hash__":4040},"articles\u002Farticles\u002Fopenclaw-vs-hermes.md","OpenClaw vs Hermes Agent : Comparatif 2026",{"name":21,"url":22},{"type":24,"value":2556,"toc":3998},[2557,2564,2567,2569,2573,2580,2594,2602,2612,2616,2619,2633,2635,2639,2643,2653,2656,2660,2666,2683,2689,2700,2703,2709,2742,2748,2754,2764,2769,2798,2804,2810,2814,2820,2826,2832,2838,2842,2884,2888,2920,2922,2926,2930,2937,2940,2944,2949,2956,2961,2964,2970,2987,2993,3001,3007,3012,3019,3024,3027,3033,3038,3041,3046,3049,3053,3059,3065,3071,3077,3083,3087,3135,3139,3165,3167,3171,3175,3281,3285,3469,3478,3482,3584,3587,3589,3593,3597,3632,3636,3691,3695,3701,3711,3718,3720,3724,3731,3745,3755,3761,3767,3769,3773,3877,3883,3889,3895,3897,3901,3905,3929,3933,3962,3964,3966,3978,3988,3995],[32,2558,2559,2560,2563],{},"En 2026, deux ",[201,2561,2562],{},"agents IA autonomes open source"," sont apparus avec des philosophies radicalement différentes. OpenClaw promet de contrôler votre machine comme un assistant personnel omniprésent avec mémoire persistante 24\u002F7. Hermes Agent mise sur l'apprentissage automatique, créant ses propres skills à partir de l'expérience. Mais lequel choisir pour vos besoins ?",[32,2565,2566],{},"Passons en revue chaque aspect de ces deux solutions.",[640,2568],{},[27,2570,2572],{"id":2571},"openclaw-vs-hermes-agent-deux-philosophies-deux-approches","OpenClaw vs Hermes Agent : deux philosophies, deux approches",[32,2574,2575,2576,2579],{},"Le paysage des ",[201,2577,2578],{},"agents IA autonomes"," a profondément changé en 2026. Là où les assistants traditionnels se contentaient de répondre à des questions, ces nouveaux agents prennent des décisions, exécutent des tâches, et interagissent avec votre environnement digital.",[32,2581,2582,2585,2586,2589,2590,2593],{},[201,2583,2584],{},"OpenClaw",", créé par Peter Steinberger (@steipete), est un ",[201,2587,2588],{},"agent IA personnel"," qui vit sur votre machine et contrôle votre ordinateur comme un assistant omniprésent. Avec \"eyes and hands at a desk with keyboard and mouse\", il gère vos emails, calendrier, fichiers, et exécute des tâches sur votre système. Il intègre aussi un ",[201,2591,2592],{},"gateway"," pour communiquer via les messageries. Son architecture repose sur un processus Gateway unique en Node.js, local-first.",[85,2595,2596],{},[32,2597,2598,2601],{},[201,2599,2600],{},"Analogie simple"," : Pensez à OpenClaw comme un assistant personnel très compétent qui suit un manuel d'instructions. Hermes est un assistant qui écrit son propre manuel après chaque tâche pour mieux faire la prochaine fois.",[32,2603,2604,2607,2608,2611],{},[201,2605,2606],{},"Hermes Agent",", développé par Nous Research, est un ",[201,2609,2610],{},"agent qui apprend",". Il ne se contente pas d'exécuter des tâches : il crée ses propres skills à partir de l'expérience, les améliore en les utilisant, et construit une mémoire persistante de l'utilisateur. Son architecture Python (93% du code) mise sur l'isolation via des sous-agents et 5 backends de sandboxing.",[77,2613,2615],{"id":2614},"pourquoi-2026-est-lannée-des-agents-ia-autonomes","Pourquoi 2026 est l'année des agents IA autonomes",[32,2617,2618],{},"Plusieurs facteurs ont démocratisé ces technologies :",[110,2620,2621,2624,2627,2630],{},[113,2622,2623],{},"Les modèles de langage sont devenus suffisamment capables pour raisonner sur des tâches complexes",[113,2625,2626],{},"Les intégrations messaging (Telegram, Discord, WhatsApp) permettent une interaction naturelle",[113,2628,2629],{},"La disponibilité de modèles locaux offre une alternative aux API cloud",[113,2631,2632],{},"L'open source a permis une innovation rapide portée par la communauté",[640,2634],{},[27,2636,2638],{"id":2637},"openclaw-lagent-personnel-qui-contrôle-votre-machine","OpenClaw : l'agent personnel qui contrôle votre machine",[77,2640,2642],{"id":2641},"quest-ce-quopenclaw","Qu'est-ce qu'OpenClaw ?",[32,2644,2645,2646,2649,2650,2652],{},"OpenClaw est un ",[201,2647,2648],{},"agent IA personnel open source"," qui s'installe sur votre ordinateur et contrôle votre machine : emails, calendrier, fichiers, applications, terminal. Il agit comme un assistant avec \"eyes and hands\" qui peut faire tout ce qu'une personne ferait sur votre Mac ou PC. Il inclut aussi un ",[201,2651,2592],{}," intégré pour communiquer via vos messageries préférées.",[32,2654,2655],{},"Le projet, lancé fin 2025 par Peter Steinberger (créateur de Things et PSPDFKit), a explosé sur Twitter\u002FX. Avec environ 250 000 étoiles GitHub au début de 2026, il reflète la demande massive pour un assistant IA personnel auto-hébergé.",[77,2657,2659],{"id":2658},"fonctionnalités-clés-dopenclaw","Fonctionnalités clés d'OpenClaw",[32,2661,2662,2665],{},[201,2663,2664],{},"Contrôle machine complet","\nOpenClaw peut piloter votre ordinateur comme vous le feriez manuellement :",[110,2667,2668,2671,2674,2677,2680],{},[113,2669,2670],{},"Navigation web et remplissage de formulaires",[113,2672,2673],{},"Gestion de emails, calendrier, fichiers",[113,2675,2676],{},"Contrôle d'applications Mac\u002FPC",[113,2678,2679],{},"Exécution de commandes terminal",[113,2681,2682],{},"Gestion de vos comptes (check-in vols, remboursements santé)",[32,2684,2685,2688],{},[201,2686,2687],{},"Gateway multi-canal intégré","\nOpenClaw supporte plus de 20 plateformes de messagerie, incluant :",[110,2690,2691,2694,2697],{},[113,2692,2693],{},"Telegram, WhatsApp, Slack, Discord",[113,2695,2696],{},"Signal, iMessage, Email",[113,2698,2699],{},"IRC, LINE, et autres canaux de niche",[32,2701,2702],{},"Tous les clients se connectent en WebSocket et déclarent leurs rôles et scopes au handshake.",[32,2704,2705,2708],{},[201,2706,2707],{},"Architecture gateway-centric","\nL'architecture repose sur un processus Gateway unique avec :",[110,2710,2711,2724,2730,2736],{},[113,2712,2713,2716,2717,54,2720,2723],{},[201,2714,2715],{},"Rôles"," : ",[117,2718,2719],{},"operator",[117,2721,2722],{},"node",", avec des scopes explicites",[113,2725,2726,2729],{},[201,2727,2728],{},"Tokens de device"," pour l'authentification persistante",[113,2731,2732,2735],{},[201,2733,2734],{},"Approbations d'exécution"," pour les actions risquées",[113,2737,2738,2741],{},[201,2739,2740],{},"Protocole versionné"," pour la compatibilité ascendante",[32,2743,2744,2747],{},[201,2745,2746],{},"Mémoire persistante 24\u002F7","\nContrairement aux assistants qui oublient entre les conversations, OpenClaw maintient une mémoire continue. Il se souvient de vos préférences, projets en cours, et contextes passés même après des jours sans interaction. Cette mémoire persiste localement sur votre machine.",[32,2749,2750,2753],{},[201,2751,2752],{},"Skills extensibles","\nLe système de skills permet d'étendre les capacités d'OpenClaw. La communauté développe activement des skills pour Gmail, Google Calendar, recherche web, surveillance de sites, et automatisation de workflows. Les skills peuvent même être créés automatiquement par l'agent lui-même.",[32,2755,2756,2759,2760,2763],{},[201,2757,2758],{},"Multi-agents via le gateway","\nOpenClaw orchestre plusieurs agents derrière un même gateway. Chaque agent a son workspace, ses permissions et ses canaux. Le gateway gère le routage entre les agents et les utilisateurs — c'est une isolation des ",[201,2761,2762],{},"agents"," eux-mêmes, pas des sous-tâches.",[32,2765,2766],{},[201,2767,2768],{},"Sandboxing et sécurité",[110,2770,2771,2783,2786,2789,2795],{},[113,2772,2773,2774,1273,2777,1273,2780,2123],{},"Politiques DM (",[117,2775,2776],{},"pairing",[117,2778,2779],{},"allowlist",[117,2781,2782],{},"open",[113,2784,2785],{},"Sandboxing Docker pour réduire le blast radius",[113,2787,2788],{},"Scopes explicites au handshake",[113,2790,2791,2792,2123],{},"Audit CLI (",[117,2793,2794],{},"openclaw security audit --deep",[113,2796,2797],{},"Approbations manuelles pour les actions risquées",[32,2799,2800,2803],{},[201,2801,2802],{},"Nature proactive","\nLes heartbeats permettent des vérifications automatiques, rappels programmés, et tâches en arrière-plan. Configurez un cron job et l'agent s'exécutera automatiquement.",[32,2805,2806,2809],{},[201,2807,2808],{},"Options d'hébergement géré","\nSi vous ne voulez pas gérer votre propre serveur, des services d'hébergement géré sont disponibles pour OpenClaw.",[77,2811,2813],{"id":2812},"cas-dusage-openclaw","Cas d'usage OpenClaw",[32,2815,2816,2819],{},[201,2817,2818],{},"Gestion personnelle quotidienne","\nOpenClaw excelle comme assistant personnel qui gère votre vie digitale : emails, calendrier, rappels, tâches administratives, veille informationnelle. Un utilisateur témoigne : \"It's running my company.\"",[32,2821,2822,2825],{},[201,2823,2824],{},"Automatisation de workflows","\nConfigurez OpenClaw pour surveiller des sources spécifiques, gérer vos remboursements santé, trouver des rendez-vous médicaux, ou contrôler vos appareils domotiques.",[32,2827,2828,2831],{},[201,2829,2830],{},"Développement et productivité","\nAvec l'intégration Claude Code et Codex, OpenClaw devient un partenaire de développement puissant. Il peut coder, débugger, et gérer des sessions d'agents depuis votre téléphone.",[32,2833,2834,2837],{},[201,2835,2836],{},"Distribution multi-canal","\nCommuniquez avec votre agent via WhatsApp, Telegram, Discord, iMessage, Slack, Signal — le même agent accessible partout.",[77,2839,2841],{"id":2840},"points-forts-dopenclaw","Points forts d'OpenClaw",[110,2843,2844,2850,2855,2860,2866,2872,2878],{},[113,2845,2846,2849],{},[201,2847,2848],{},"Traction massive"," : ~250 000 étoiles GitHub, communauté très active",[113,2851,2852,2854],{},[201,2853,2664],{}," : \"eyes and hands\" sur votre ordinateur",[113,2856,2857,2859],{},[201,2858,2746],{}," : contexte qui persiste entre les sessions",[113,2861,2862,2865],{},[201,2863,2864],{},"Gateway multi-canal"," : un point d'entrée pour 20+ plateformes de messagerie",[113,2867,2868,2871],{},[201,2869,2870],{},"Self-hackable"," : vous pouvez modifier et hacker votre propre assistant",[113,2873,2874,2877],{},[201,2875,2876],{},"Setup rapide"," : 5-30 minutes",[113,2879,2880,2883],{},[201,2881,2882],{},"Fun factor élevé"," : \"First time I felt like living in the future since ChatGPT\"",[77,2885,2887],{"id":2886},"limites-dopenclaw","Limites d'OpenClaw",[110,2889,2890,2896,2902,2908,2914],{},[113,2891,2892,2895],{},[201,2893,2894],{},"Pas de learning loop auto"," : contrairement à Hermes, il ne crée pas automatiquement de nouvelles skills à partir de l'expérience",[113,2897,2898,2901],{},[201,2899,2900],{},"Pas de routage intelligent de modèles"," : un modèle par configuration, pas d'adaptation automatique cher\u002Frapide",[113,2903,2904,2907],{},[201,2905,2906],{},"Pas de subagents isolés"," : isolation au niveau des agents, pas des sous-tâches",[113,2909,2910,2913],{},[201,2911,2912],{},"Sécurité \"open\""," : accès complet à votre machine nécessite de lui faire confiance",[113,2915,2916,2919],{},[201,2917,2918],{},"Demande des connaissances techniques"," pour bien configurer les rôles et permissions",[640,2921],{},[27,2923,2925],{"id":2924},"hermes-agent-la-sécurité-enterprise-grade","Hermes Agent : la sécurité enterprise-grade",[77,2927,2929],{"id":2928},"quest-ce-quhermes-agent","Qu'est-ce qu'Hermes Agent ?",[32,2931,2932,2933,2936],{},"Hermes Agent est un ",[201,2934,2935],{},"agent IA autonome open source"," développé par Nous Research, l'organisation derrière des modèles comme Hermes et Seth. Là où OpenClaw vise le grand public, Hermes est conçu dès le départ pour un déploiement server-side avec un accent mis sur la sécurité et l'isolation.",[32,2938,2939],{},"Le projet prend une approche plus technique mais offre des garanties de sécurité qu'OpenClaw ne peut pas égaler. Avec une licence MIT et dirigée par une organisation reconnue dans l'écosystème IA open source, Hermes attire les développeurs et équipes ops.",[77,2941,2943],{"id":2942},"fonctionnalités-clés-dhermes-agent","Fonctionnalités clés d'Hermes Agent",[32,2945,2946],{},[201,2947,2948],{},"Architecture Python serveur",[32,2950,2951,2952,2955],{},"Hermes Agent est écrit en Python (92% du code) et tourne comme un service systemd sur un VPS ou en local. Le stockage vit dans ",[117,2953,2954],{},"~\u002F.hermes\u002F"," : configuration YAML, mémoire en Markdown, sessions en SQLite avec recherche full-text FTS5.",[32,2957,2958],{},[201,2959,2960],{},"Mémoire persistante à deux couches",[32,2962,2963],{},"C'est le vrai différenciateur. Hermes implémente un système de mémoire en deux couches :",[32,2965,2966,2969],{},[201,2967,2968],{},"Couche 1 — toujours en contexte"," (~1 300 tokens) :",[110,2971,2972,2978,2984],{},[113,2973,2974,2977],{},[117,2975,2976],{},"MEMORY.md"," (~800 tokens) : notes de l'agent, conventions apprises, skills créés",[113,2979,2980,2983],{},[117,2981,2982],{},"USER.md"," (~500 tokens) : profil de l'utilisateur, préférences, projets en cours",[113,2985,2986],{},"Injection automatique dans le system prompt. Consolidation à 80% de capacité",[32,2988,2989,2992],{},[201,2990,2991],{},"Couche 2 — recherche à la demande"," :",[110,2994,2995,2998],{},[113,2996,2997],{},"Toutes les sessions stockées en SQLite avec recherche full-text FTS5",[113,2999,3000],{},"Résumé LLM à la demande pour retrouver du contexte ancien",[32,3002,3003,3006],{},[201,3004,3005],{},"Deep user modeling","\nHermes construit un profil utilisateur approfondi sur le long terme. Il apprend comment vous préférez vos outputs formatés, les types de décisions que vous prenez habituellement, et les tâches que vous exécutez le plus souvent. Si vous demandez toujours des bullet points courts au lieu de longs paragraphes, l'agent finira par vous les donner automatiquement sans demander.",[32,3008,3009],{},[201,3010,3011],{},"Subagents avec isolation parent-enfant",[32,3013,3014,3015,3018],{},"Hermes supporte des subagents avec isolation de contexte. Le parent ne voit que le résumé, jamais le contexte complet des enfants. Cela évite le \"context poisoning\". Le mode worktree (",[117,3016,3017],{},"hermes -w",") permet de lancer un agent dans un git worktree isolé.",[32,3020,3021],{},[201,3022,3023],{},"Routage intelligent des modèles",[32,3025,3026],{},"Hermes bascule automatiquement entre un modèle puissant (Claude Opus, GPT-4o) pour les requêtes complexes et un modèle rapide (Mistral Small, GPT-4o-mini) pour les tâches simples. Pour les cas d'usage à volume élevé, la différence de coût est significative.",[32,3028,3029,3032],{},[201,3030,3031],{},"Déploiement serverless et coûts optimisés","\nHermes supporte des déploiements serverless qui ne consomment des ressources que lorsque l'agent traite une requête. Quand il est inactif, il hiberne complètement — vos coûts chutent alors presque à zéro. Idéal pour un usage sporadique avec un budget serré.",[32,3034,3035],{},[201,3036,3037],{},"Sandboxing multi-backend",[32,3039,3040],{},"5 backends de sandboxing différents : Local, Docker, SSH, Singularity, Modal. Cette flexibilité permet d'adapter l'environnement d'exécution au niveau de sécurité requis.",[32,3042,3043],{},[201,3044,3045],{},"40+ outils intégrés et MCP natif",[32,3047,3048],{},"Terminal, navigateur, vision, TTS, recherche web, exécution de code, subagents. Support multi-provider : Nous Portal, OpenRouter, OpenAI, Anthropic, ou tout endpoint compatible.",[77,3050,3052],{"id":3051},"cas-dusage-hermes-agent","Cas d'usage Hermes Agent",[32,3054,3055,3058],{},[201,3056,3057],{},"Assistant personnel apprenant","\nAprès quelques semaines d'usage, Hermes connaît vos conventions, votre style, vos projets. Il ne repart pas de zéro à chaque conversation. Parfait pour les développeurs, chercheurs, et utilisateurs individuels.",[32,3060,3061,3064],{},[201,3062,3063],{},"Développement avec mémoire contextuelle","\nLe mode worktree permet de travailler sur plusieurs branches\u002Ffeatures en parallèle avec des agents isolés. L'agent se souvient de vos conventions de code et préférences.",[32,3066,3067,3070],{},[201,3068,3069],{},"Conversations longues et complexes","\nGrâce à la compression de contexte dual-layer, Hermes gère des conversations quasi-infinies sans crash de contexte.",[32,3072,3073,3076],{},[201,3074,3075],{},"Optimisation des coûts LLM","\nLe routage intelligent entre modèles cher et pas cher réduit significativement les coûts. Associé au déploiement serverless qui n'active les ressources que pendant le traitement, vous ne payez que pour le temps réel d'utilisation — presque rien en période d'inactivité.",[32,3078,3079,3082],{},[201,3080,3081],{},"Recherche et veille automatisée","\nLes capacités de recherche web, vision et mémoire persistante permettent de créer des agents de recherche qui accumulent et organisent les connaissances.",[77,3084,3086],{"id":3085},"points-forts-dhermes-agent","Points forts d'Hermes Agent",[110,3088,3089,3094,3100,3106,3112,3118,3123,3129],{},[113,3090,3091,3093],{},[201,3092,2960],{}," — le vrai différenciateur, il apprend et s'améliore",[113,3095,3096,3099],{},[201,3097,3098],{},"Routage intelligent de modèles"," — optimise automatiquement coût\u002Fperformance",[113,3101,3102,3105],{},[201,3103,3104],{},"Compression de contexte dual-layer"," — conversations quasi-infinies",[113,3107,3108,3111],{},[201,3109,3110],{},"Sécurité enterprise-grade"," avec sandboxing réel et 5 backends",[113,3113,3114,3117],{},[201,3115,3116],{},"Subagents avec isolation"," — évite le \"context poisoning\"",[113,3119,3120,3122],{},[201,3121,3045],{}," — extensible via serveurs MCP externes",[113,3124,3125,3128],{},[201,3126,3127],{},"Licence MIT"," — vraiment open source",[113,3130,3131,3134],{},[201,3132,3133],{},"Backé par Nous Research"," — crédibilité technique, 92.1k+ étoiles, vélocité de release élevée (5 versions majeures en 3 semaines en mars 2026)",[77,3136,3138],{"id":3137},"limites-dhermes-agent","Limites d'Hermes Agent",[110,3140,3141,3147,3153,3159],{},[113,3142,3143,3146],{},[201,3144,3145],{},"Moins de visibilité"," que OpenClaw (92.1k vs ~250 000 étoiles GitHub)",[113,3148,3149,3152],{},[201,3150,3151],{},"Approche single-user"," : optimisé pour un utilisateur, pas pour le multi-utilisateur natif",[113,3154,3155,3158],{},[201,3156,3157],{},"Pas de gateway natif"," : pas de distribution multi-canal intégrée",[113,3160,3161,3164],{},[201,3162,3163],{},"Setup technique"," : nécessite un VPS ou serveur, configuration YAML",[640,3166],{},[27,3168,3170],{"id":3169},"openclaw-vs-hermes-agent-comparaison-détaillée","OpenClaw vs Hermes Agent : comparaison détaillée",[77,3172,3174],{"id":3173},"philosophie-et-approche","Philosophie et approche",[216,3176,3177,3188],{},[219,3178,3179],{},[222,3180,3181,3184,3186],{},[225,3182,3183],{},"Aspect",[225,3185,2584],{},[225,3187,2606],{},[238,3189,3190,3203,3216,3229,3242,3255,3268],{},[222,3191,3192,3197,3200],{},[243,3193,3194],{},[201,3195,3196],{},"Métaphore",[243,3198,3199],{},"L'assistant personnel avec \"eyes and hands\"",[243,3201,3202],{},"L'employé senior qui apprend et écrit son manuel",[222,3204,3205,3210,3213],{},[243,3206,3207],{},[201,3208,3209],{},"Focus",[243,3211,3212],{},"Contrôle machine + messagerie multi-canal",[243,3214,3215],{},"Apprentissage automatique + skills auto-générés",[222,3217,3218,3223,3226],{},[243,3219,3220],{},[201,3221,3222],{},"Target",[243,3224,3225],{},"Individus, entrepreneurs, power users",[243,3227,3228],{},"Développeurs, chercheurs, ops",[222,3230,3231,3236,3239],{},[243,3232,3233],{},[201,3234,3235],{},"Philosophie",[243,3237,3238],{},"\"The AI that actually does things\" — Action",[243,3240,3241],{},"\"Grows with you\" — Learning loop",[222,3243,3244,3249,3252],{},[243,3245,3246],{},[201,3247,3248],{},"Architecture",[243,3250,3251],{},"Node.js, local-first, agent + gateway",[243,3253,3254],{},"Python (93%), serveur\u002FVPS, mémoire persistante",[222,3256,3257,3262,3265],{},[243,3258,3259],{},[201,3260,3261],{},"GitHub Stars",[243,3263,3264],{},"~250 000",[243,3266,3267],{},"92.1k",[222,3269,3270,3275,3278],{},[243,3271,3272],{},[201,3273,3274],{},"Communauté",[243,3276,3277],{},"Très active, viral sur Twitter\u002FX",[243,3279,3280],{},"Nous Research, croissance rapide",[77,3282,3284],{"id":3283},"capacités-techniques","Capacités techniques",[216,3286,3287,3298],{},[219,3288,3289],{},[222,3290,3291,3294,3296],{},[225,3292,3293],{},"Capacité",[225,3295,2584],{},[225,3297,2606],{},[238,3299,3300,3313,3326,3339,3352,3365,3378,3391,3404,3417,3430,3443,3456],{},[222,3301,3302,3307,3310],{},[243,3303,3304],{},[201,3305,3306],{},"Type",[243,3308,3309],{},"Agent personnel avec gateway",[243,3311,3312],{},"Agent autonome",[222,3314,3315,3320,3323],{},[243,3316,3317],{},[201,3318,3319],{},"Contrôle machine",[243,3321,3322],{},"Oui, contrôle total (keyboard, mouse, terminal)",[243,3324,3325],{},"Oui, via 40+ outils intégrés",[222,3327,3328,3333,3336],{},[243,3329,3330],{},[201,3331,3332],{},"Sandboxing",[243,3334,3335],{},"Docker optionnel",[243,3337,3338],{},"5 backends (Local, Docker, SSH, Singularity, Modal)",[222,3340,3341,3346,3349],{},[243,3342,3343],{},[201,3344,3345],{},"Mémoire",[243,3347,3348],{},"Persistante 24\u002F7 locale",[243,3350,3351],{},"Dual-layer persistante + compression",[222,3353,3354,3359,3362],{},[243,3355,3356],{},[201,3357,3358],{},"User modeling",[243,3360,3361],{},"Préférences basiques",[243,3363,3364],{},"Deep profiling sur le long terme",[222,3366,3367,3372,3375],{},[243,3368,3369],{},[201,3370,3371],{},"Apprentissage",[243,3373,3374],{},"Skills créés manuellement ou par l'agent",[243,3376,3377],{},"Boucle fermée, skills auto-générés et auto-améliorés",[222,3379,3380,3385,3388],{},[243,3381,3382],{},[201,3383,3384],{},"Sous-agents",[243,3386,3387],{},"Multi-agents via gateway",[243,3389,3390],{},"Parent-enfant avec isolation de contexte",[222,3392,3393,3398,3401],{},[243,3394,3395],{},[201,3396,3397],{},"Routage modèles",[243,3399,3400],{},"Modèle unique par config",[243,3402,3403],{},"Routage intelligent automatique (cher\u002Frapide)",[222,3405,3406,3411,3414],{},[243,3407,3408],{},[201,3409,3410],{},"Messagerie",[243,3412,3413],{},"20+ plateformes (iMessage, Signal, IRC, LINE, etc.)",[243,3415,3416],{},"Telegram, Discord, Slack, WhatsApp, Signal, Email, CLI",[222,3418,3419,3424,3427],{},[243,3420,3421],{},[201,3422,3423],{},"Parallélisation",[243,3425,3426],{},"Via agents multiples",[243,3428,3429],{},"Natif (zero-context-cost)",[222,3431,3432,3437,3440],{},[243,3433,3434],{},[201,3435,3436],{},"Déploiement",[243,3438,3439],{},"Local, VPS, hébergement géré",[243,3441,3442],{},"VPS, local, cloud, serverless",[222,3444,3445,3450,3453],{},[243,3446,3447],{},[201,3448,3449],{},"Coûts",[243,3451,3452],{},"Serveur continu requis",[243,3454,3455],{},"Serverless possible (coûts quasi-nuls à l'inactivité)",[222,3457,3458,3463,3466],{},[243,3459,3460],{},[201,3461,3462],{},"Sécurité",[243,3464,3465],{},"Contrôle d'accès, scopes, approbations manuelles",[243,3467,3468],{},"Enterprise-grade, hardening, audit",[32,3470,3471,3474,3475,3477],{},[201,3472,3473],{},"Hermes"," l'emporte sur l'apprentissage automatique, le routage intelligent de modèles et la sécurité enterprise. ",[201,3476,2584],{}," l'emporte sur le contrôle machine natif.",[77,3479,3481],{"id":3480},"facilité-dinstallation","Facilité d'installation",[216,3483,3484,3494],{},[219,3485,3486],{},[222,3487,3488,3490,3492],{},[225,3489,3183],{},[225,3491,2584],{},[225,3493,2606],{},[238,3495,3496,3511,3527,3545,3558,3571],{},[222,3497,3498,3503,3506],{},[243,3499,3500],{},[201,3501,3502],{},"Installation",[243,3504,3505],{},"CLI (agent + gateway)",[243,3507,3508],{},[117,3509,3510],{},"curl | bash",[222,3512,3513,3518,3521],{},[243,3514,3515],{},[201,3516,3517],{},"Configuration",[243,3519,3520],{},"Interactive (rôles, scopes, intégrations)",[243,3522,3523,3526],{},[117,3524,3525],{},"hermes setup"," + YAML",[222,3528,3529,3534,3540],{},[243,3530,3531],{},[201,3532,3533],{},"Stockage",[243,3535,3536,3539],{},[117,3537,3538],{},"~\u002F.openclaw\u002F"," (config + mémoire persistante)",[243,3541,3542,3544],{},[117,3543,2954],{}," (config YAML, mémoire Markdown, SQLite)",[222,3546,3547,3552,3555],{},[243,3548,3549],{},[201,3550,3551],{},"Documentation",[243,3553,3554],{},"GitHub + communauté",[243,3556,3557],{},"Docs officielles complètes",[222,3559,3560,3565,3568],{},[243,3561,3562],{},[201,3563,3564],{},"Onboarding",[243,3566,3567],{},"Guidé avec wizard",[243,3569,3570],{},"Technique (mémoire, skills)",[222,3572,3573,3578,3581],{},[243,3574,3575],{},[201,3576,3577],{},"Non-technical friendly",[243,3579,3580],{},"⚠️ CLI requis mais accessible",[243,3582,3583],{},"⚠️ Approche technique",[32,3585,3586],{},"Les deux outils nécessitent des compétences techniques, mais pour des raisons différentes : OpenClaw demande de configurer les intégrations et permissions, Hermes demande de configurer la mémoire et les backends.",[640,3588],{},[27,3590,3592],{"id":3591},"lequel-choisir","Lequel choisir ?",[77,3594,3596],{"id":3595},"choisissez-openclaw-si-vous-êtes","Choisissez OpenClaw si vous êtes...",[110,3598,3599,3608,3614,3620,3626],{},[113,3600,3601,707,3604,3607],{},[201,3602,3603],{},"Entrepreneur solo",[201,3605,3606],{},"freelance"," cherchant un assistant personnel qui contrôle votre machine",[113,3609,3610,3613],{},[201,3611,3612],{},"Power user"," voulant automatiser votre vie digitale (emails, calendrier, tâches)",[113,3615,3616,3619],{},[201,3617,3618],{},"Développeur"," ayant besoin d'un copilote intégré à votre workflow avec accès machine",[113,3621,3622,3625],{},[201,3623,3624],{},"Early adopter"," qui veut un agent \"self-hackable\" et personnalisable",[113,3627,3628,3631],{},[201,3629,3630],{},"Multi-canal"," : besoin d'accéder à votre agent via WhatsApp, Telegram, Discord, iMessage simultanément",[77,3633,3635],{"id":3634},"choisissez-hermes-agent-si-vous-êtes","Choisissez Hermes Agent si vous êtes...",[110,3637,3638,3647,3657,3667,3673,3679,3685],{},[113,3639,3640,3642,3643,3646],{},[201,3641,3618],{}," voulant un agent qui ",[201,3644,3645],{},"apprend vos conventions"," et s'améliore avec le temps",[113,3648,3649,3652,3653,3656],{},[201,3650,3651],{},"Utilisateur solo"," ayant besoin de ",[201,3654,3655],{},"mémoire persistante"," sur des conversations longues",[113,3658,3659,3662,3663,3666],{},[201,3660,3661],{},"Optimiseur de coûts"," : le ",[201,3664,3665],{},"routage intelligent"," entre modèles cher\u002Frapide réduit les dépenses",[113,3668,3669,3672],{},[201,3670,3671],{},"Chercheur ou analyste"," : la compression de contexte permet des sessions quasi-infinies",[113,3674,3675,3678],{},[201,3676,3677],{},"Utilisateur soucieux de sécurité"," : sandboxing enterprise-grade avec 5 backends",[113,3680,3681,3684],{},[201,3682,3683],{},"Fan de workflows complexes"," : subagents isolés pour déléguer des sous-tâches",[113,3686,3687,3690],{},[201,3688,3689],{},"Budget serré avec usage sporadique"," : le déploiement serverless permet des coûts quasi-nuls",[77,3692,3694],{"id":3693},"les-deux-ensemble","Les deux ensemble ?",[32,3696,3697,3700],{},[201,3698,3699],{},"Ce n'est pas nécessaire"," car ce sont deux agents complets et indépendants. Chacun peut fonctionner seul avec :",[110,3702,3703,3705,3708],{},[113,3704,2664],{},[113,3706,3707],{},"Mémoire persistante",[113,3709,3710],{},"Support multi-canal",[32,3712,3713,3714,3717],{},"Cependant, si vous voulez combiner les forces des deux, vous pouvez faire tourner ",[201,3715,3716],{},"Hermes Agent derrière OpenClaw"," (OpenClaw sert alors de gateway pour Hermes sur iMessage, par exemple). Mais pour la plupart des utilisateurs, choisir l'un ou l'autre suffit.",[640,3719],{},[27,3721,3723],{"id":3722},"lévolution-des-agents-ia-en-2026","L'évolution des agents IA en 2026",[32,3725,3726,3727,3730],{},"Ces deux outils s'inscrivent dans une tendance plus large. Les ",[201,3728,3729],{},"agents IA"," passent d'assistants réactifs à véritables exécutants autonomes. En 2026, nous observons :",[32,3732,3733,3736,3737,3740,3741,3744],{},[201,3734,3735],{},"La différenciation par l'approche","\nOpenClaw et Hermes représentent deux visions différentes de l'agent personnel : l'un se concentre sur le ",[201,3738,3739],{},"contrôle machine natif et l'expérience utilisateur fluide"," (OpenClaw), l'autre sur ",[201,3742,3743],{},"l'apprentissage automatique et la création de skills"," (Hermes). Les deux offrent une mémoire persistante, mais la façon dont ils apprennent et s'améliorent diffère radicalement.",[32,3746,3747,3750,3751,3754],{},[201,3748,3749],{},"La mémoire comme fondamental","\nLes deux agents offrent une mémoire persistante 24\u002F7 — c'est désormais une fonctionnalité de base, pas un luxe. La différence réside dans la ",[201,3752,3753],{},"profondeur de l'apprentissage"," : Hermes crée activement de nouvelles skills à partir de l'expérience, tandis qu'OpenClaw se concentre sur l'exécution fluide et le contrôle machine.",[32,3756,3757,3760],{},[201,3758,3759],{},"L'ère de la sécurité agentique","\nHermes répond à une préoccupation légitime : comment utiliser des agents puissants sans compromettre son infrastructure ? Le sandboxing robuste avec 5 backends devient un standard.",[32,3762,3763,3766],{},[201,3764,3765],{},"La convergence inévitable","\nÀ moyen terme, les deux approches devraient converger. Les utilisateurs voudront le contrôle machine d'OpenClaw avec le learning loop d'Hermes. Chaque projet emprunte déjà des fonctionnalités à l'autre : Hermes ajoute des intégrations messagerie, OpenClaw améliore sa mémoire et ses skills.",[640,3768],{},[27,3770,3772],{"id":3771},"verdict-final","Verdict final",[216,3774,3775,3786],{},[219,3776,3777],{},[222,3778,3779,3782,3784],{},[225,3780,3781],{},"Critère",[225,3783,2584],{},[225,3785,2606],{},[238,3787,3788,3799,3807,3817,3825,3834,3843,3852,3861,3869],{},[222,3789,3790,3793,3796],{},[243,3791,3792],{},"Contrôle machine natif",[243,3794,3795],{},"⭐⭐⭐⭐⭐",[243,3797,3798],{},"⭐⭐⭐⭐",[222,3800,3801,3803,3805],{},[243,3802,3707],{},[243,3804,3795],{},[243,3806,3795],{},[222,3808,3809,3812,3815],{},[243,3810,3811],{},"Apprentissage auto (skills)",[243,3813,3814],{},"⭐⭐⭐",[243,3816,3795],{},[222,3818,3819,3821,3823],{},[243,3820,2864],{},[243,3822,3795],{},[243,3824,3798],{},[222,3826,3827,3830,3832],{},[243,3828,3829],{},"Sécurité enterprise",[243,3831,3814],{},[243,3833,3795],{},[222,3835,3836,3839,3841],{},[243,3837,3838],{},"Routage intelligent modèles",[243,3840,3814],{},[243,3842,3795],{},[222,3844,3845,3848,3850],{},[243,3846,3847],{},"Subagents isolés",[243,3849,3814],{},[243,3851,3795],{},[222,3853,3854,3857,3859],{},[243,3855,3856],{},"Facilité d'usage",[243,3858,3795],{},[243,3860,3798],{},[222,3862,3863,3865,3867],{},[243,3864,3274],{},[243,3866,3795],{},[243,3868,3798],{},[222,3870,3871,3873,3875],{},[243,3872,3551],{},[243,3874,3798],{},[243,3876,3795],{},[32,3878,3879,3882],{},[201,3880,3881],{},"Pour un assistant personnel ultra-fluide"," : OpenClaw avec son contrôle machine natif, mémoire 24\u002F7.",[32,3884,3885,3888],{},[201,3886,3887],{},"Pour un agent qui apprend vraiment"," : Hermes Agent avec sa boucle d'apprentissage, création auto de skills et deep user modeling.",[32,3890,3891,3894],{},[201,3892,3893],{},"Le choix idéal"," : OpenClaw si vous voulez un \"Jarvis\" qui contrôle votre machine. Hermes si vous voulez un partenaire qui devient plus intelligent avec le temps.",[640,3896],{},[27,3898,3900],{"id":3899},"comment-commencer","Comment commencer",[77,3902,3904],{"id":3903},"pour-openclaw-agent-personnel","Pour OpenClaw (Agent personnel)",[3906,3907,3908,3917,3920,3923,3926],"ol",{},[113,3909,3910,3911,3916],{},"Visitez ",[36,3912,3915],{"href":3913,"rel":3914},"https:\u002F\u002Fopenclaw.ai",[40],"openclaw.ai"," et GitHub (~250 000 ⭐)",[113,3918,3919],{},"Installez OpenClaw sur votre machine (Node.js, local-first)",[113,3921,3922],{},"Configurez vos intégrations (emails, calendrier, messageries)",[113,3924,3925],{},"Connectez vos canaux de messagerie préférés (20+ plateformes supportées)",[113,3927,3928],{},"Commencez à interagir avec votre agent — il apprendra vos habitudes et workflows",[77,3930,3932],{"id":3931},"pour-hermes-agent","Pour Hermes Agent",[3906,3934,3935,3944,3950,3956,3959],{},[113,3936,3937,3938,3943],{},"Consultez ",[36,3939,3942],{"href":3940,"rel":3941},"https:\u002F\u002Fgithub.com\u002FNousResearch\u002Fhermes-agent",[40],"github.com\u002FNousResearch\u002Fhermes-agent"," (92.1k+ ⭐)",[113,3945,3946,3947,3949],{},"Lancez ",[117,3948,3510],{}," pour l'installation rapide",[113,3951,3952,3953,3955],{},"Exécutez ",[117,3954,3525],{}," pour la configuration interactive",[113,3957,3958],{},"Choisissez votre backend (Local, Docker, SSH, Singularity, Modal)",[113,3960,3961],{},"Laissez l'agent apprendre — il générera ses propres skills et construira sa mémoire avec le temps",[640,3963],{},[27,3965,1246],{"id":1245},[32,3967,3968,3971,3972,3974,3975,3977],{},[201,3969,3970],{},"OpenClaw vs Hermes Agent"," n'est pas une question de quel outil est \"meilleur\", mais plutôt quelle approche correspond à vos besoins. ",[201,3973,2584],{}," est un agent personnel avec contrôle total de votre machine et mémoire persistante. ",[201,3976,2606],{}," est un agent qui apprend et crée ses propres skills à partir de l'expérience.",[32,3979,3980,3981,3983,3984,3987],{},"En 2026, le paysage des ",[201,3982,2562],{}," s'enrichit de ces deux approches complémentaires. Les deux offrent une mémoire persistante, mais la métaphore la plus juste : ",[201,3985,3986],{},"OpenClaw est l'assistant personnel très compétent qui suit vos instructions à la lettre. Hermes Agent est l'employé senior qui écrit son propre manuel"," pour s'améliorer après chaque tâche.",[32,3989,3990,3991,3994],{},"Pour les cas d'usage les plus puissants, l'",[201,3992,3993],{},"architecture hybride"," (Hermes derrière OpenClaw) combine le meilleur des deux mondes : contrôle machine complet + apprentissage automatique + mémoire persistante.",[32,3996,3997],{},"Le futur appartient à ceux qui sauront assembler ces briques efficacement. Commencez par celui qui correspond à votre besoin immédiat, et évoluez vers une architecture combinée pour déployer des agents IA vraiment intelligents en production.",{"title":395,"searchDepth":1141,"depth":1141,"links":3999},[4000,4003,4010,4017,4022,4027,4028,4029,4033],{"id":2571,"depth":1141,"text":2572,"children":4001},[4002],{"id":2614,"depth":1151,"text":2615},{"id":2637,"depth":1141,"text":2638,"children":4004},[4005,4006,4007,4008,4009],{"id":2641,"depth":1151,"text":2642},{"id":2658,"depth":1151,"text":2659},{"id":2812,"depth":1151,"text":2813},{"id":2840,"depth":1151,"text":2841},{"id":2886,"depth":1151,"text":2887},{"id":2924,"depth":1141,"text":2925,"children":4011},[4012,4013,4014,4015,4016],{"id":2928,"depth":1151,"text":2929},{"id":2942,"depth":1151,"text":2943},{"id":3051,"depth":1151,"text":3052},{"id":3085,"depth":1151,"text":3086},{"id":3137,"depth":1151,"text":3138},{"id":3169,"depth":1141,"text":3170,"children":4018},[4019,4020,4021],{"id":3173,"depth":1151,"text":3174},{"id":3283,"depth":1151,"text":3284},{"id":3480,"depth":1151,"text":3481},{"id":3591,"depth":1141,"text":3592,"children":4023},[4024,4025,4026],{"id":3595,"depth":1151,"text":3596},{"id":3634,"depth":1151,"text":3635},{"id":3693,"depth":1151,"text":3694},{"id":3722,"depth":1141,"text":3723},{"id":3771,"depth":1141,"text":3772},{"id":3899,"depth":1141,"text":3900,"children":4030},[4031,4032],{"id":3903,"depth":1151,"text":3904},{"id":3931,"depth":1151,"text":3932},{"id":1245,"depth":1141,"text":1246},"OpenClaw vs Hermes Agent : quel agent IA autonome open source choisir en 2026 ? Comparatif complet avec analyse détaillée, forces, faiblesses et recommandations.",{},"\u002Farticles\u002Fopenclaw-vs-hermes","2026-04-16",{"title":2553,"description":4034},"articles\u002Fopenclaw-vs-hermes","cIbl4eBHyf_R56AZlVBt9dMHiGR0uzhceX4b1DS4pDU",{"id":4042,"title":4043,"author":4044,"body":4045,"description":5096,"extension":1324,"meta":5097,"navigation":1154,"path":5098,"publicationDate":5099,"seo":5100,"stem":5101,"__hash__":5102},"articles\u002Farticles\u002Fexpress-js-alternative.md","6 alternatives à ExpressJS, la 4ème va vous surprendre !",{"name":21,"url":22},{"type":24,"value":4046,"toc":5083},[4047,4050,4053,4056,4059,4240,4243,4254,4257,4268,4271,4275,4279,4282,4285,4288,4421,4428,4432,4435,4438,4441,4444,4655,4662,4666,4669,4672,4675,4678,4771,4778,4782,4786,4789,4792,4795,4798,4805,4808,4853,4860,4864,4867,4870,4873,4876,4958,4965,4969,4972,4975,4978,4981,4984,5036,5043,5047,5077,5080],[32,4048,4049],{},"ExpressJS a été créé en 2010 par TJ Holowaychuk. Un peu plus d'un an après la création de NodeJS. Il a été conçu pour être un \"framework\" minimaliste et flexible pour les applications web et mobiles.",[32,4051,4052],{},"NodeJS étant un peu rude à utiliser aux premiers abords avec les streams, pipes et autres callbacks.",[32,4054,4055],{},"ExpressJS a été créé pour faciliter la vie des développeurs avec des fonctions simples pour créer un serveur web.",[32,4057,4058],{},"Exemple de code ExpressJS :",[390,4060,4064],{"className":4061,"code":4062,"language":4063,"meta":395,"style":395},"language-javascript shiki shiki-themes synthwave-84","const express = require('express')\nconst app = express()\nconst port = 3000\n\napp.get('\u002F', (req, res) => {\n  res.send('Hello World!')\n})\n\napp.listen(port, () => {\n  console.log(`Example app listening on port ${port}`)\n})\n","javascript",[117,4065,4066,4093,4107,4120,4124,4160,4177,4182,4186,4207,4236],{"__ignoreMap":395},[399,4067,4068,4071,4075,4079,4083,4086,4090],{"class":401,"line":402},[399,4069,4070],{"class":1117},"const",[399,4072,4074],{"class":4073},"sqjNi"," express",[399,4076,4078],{"class":4077},"sW278"," =",[399,4080,4082],{"class":4081},"sgRlq"," require",[399,4084,4085],{"class":409},"(",[399,4087,4089],{"class":4088},"sFl1-","'express'",[399,4091,4092],{"class":409},")\n",[399,4094,4095,4097,4100,4102,4104],{"class":401,"line":1141},[399,4096,4070],{"class":1117},[399,4098,4099],{"class":4073}," app",[399,4101,4078],{"class":4077},[399,4103,4074],{"class":4081},[399,4105,4106],{"class":409},"()\n",[399,4108,4109,4111,4114,4116],{"class":401,"line":1151},[399,4110,4070],{"class":1117},[399,4112,4113],{"class":4073}," port",[399,4115,4078],{"class":4077},[399,4117,4119],{"class":4118},"sz5MA"," 3000\n",[399,4121,4122],{"class":401,"line":1158},[399,4123,1155],{"emptyLinePlaceholder":1154},[399,4125,4126,4129,4131,4134,4136,4139,4142,4146,4148,4151,4154,4157],{"class":401,"line":1164},[399,4127,4128],{"class":4073},"app",[399,4130,715],{"class":409},[399,4132,4133],{"class":4081},"get",[399,4135,4085],{"class":409},[399,4137,4138],{"class":4088},"'\u002F'",[399,4140,4141],{"class":409},", (",[399,4143,4145],{"class":4144},"sH7Js","req",[399,4147,1273],{"class":409},[399,4149,4150],{"class":4144},"res",[399,4152,4153],{"class":409},") ",[399,4155,4156],{"class":1117},"=>",[399,4158,4159],{"class":409}," {\n",[399,4161,4162,4165,4167,4170,4172,4175],{"class":401,"line":1174},[399,4163,4164],{"class":4073},"  res",[399,4166,715],{"class":409},[399,4168,4169],{"class":4081},"send",[399,4171,4085],{"class":409},[399,4173,4174],{"class":4088},"'Hello World!'",[399,4176,4092],{"class":409},[399,4178,4179],{"class":401,"line":1179},[399,4180,4181],{"class":409},"})\n",[399,4183,4184],{"class":401,"line":1185},[399,4185,1155],{"emptyLinePlaceholder":1154},[399,4187,4188,4190,4192,4195,4197,4200,4203,4205],{"class":401,"line":1195},[399,4189,4128],{"class":4073},[399,4191,715],{"class":409},[399,4193,4194],{"class":4081},"listen",[399,4196,4085],{"class":409},[399,4198,4199],{"class":4073},"port",[399,4201,4202],{"class":409},", () ",[399,4204,4156],{"class":1117},[399,4206,4159],{"class":409},[399,4208,4209,4212,4214,4217,4219,4222,4226,4228,4231,4234],{"class":401,"line":1200},[399,4210,4211],{"class":4073},"  console",[399,4213,715],{"class":409},[399,4215,4216],{"class":4081},"log",[399,4218,4085],{"class":409},[399,4220,4221],{"class":4088},"`Example app listening on port ",[399,4223,4225],{"class":4224},"sfE7D","${",[399,4227,4199],{"class":4073},[399,4229,4230],{"class":4224},"}",[399,4232,4233],{"class":4088},"`",[399,4235,4092],{"class":409},[399,4237,4238],{"class":401,"line":1206},[399,4239,4181],{"class":409},[32,4241,4242],{},"Aujourd'hui encore, 13 ans après sa première version, il est encore le framework Node.js le plus populaire malgré les reproches qu'on lui fait :",[110,4244,4245,4248,4251],{},[113,4246,4247],{},"lenteur",[113,4249,4250],{},"plus maintenu",[113,4252,4253],{},"pas de support natif de TypeScript",[32,4255,4256],{},"Qu'est ce qui fait que la plupart des développeurs Node.js utilisent encore ExpressJS en 2023 ?",[110,4258,4259,4262,4265],{},[113,4260,4261],{},"la facilité ? il est simple et rapide à prendre en main",[113,4263,4264],{},"les formations ? il est enseigné dans la plupart des formations javascript",[113,4266,4267],{},"les ressources ? il y a beaucoup de tuto disponible sur internet",[32,4269,4270],{},"On ne sait pas vraiment. Malgré cela, il existe aujourd'hui des vraies alternatives à ExpressJS.\nNous allons vous présenter 6 alternatives à ExpressJS.",[27,4272,4274],{"id":4273},"les-frameworks-minimalistes","Les frameworks minimalistes",[77,4276,4278],{"id":4277},"_1-h3","1. H3",[32,4280,4281],{},"Crée par l'équipe UnJS (derrière NuxtJS), H3 est un framework minimaliste qui se veut simple et rapide à prendre en main. Un peu comme ExpressJS.",[32,4283,4284],{},"Il est parfaitement portable en étant compatible en environnement serverless, workers et NodeJS.",[32,4286,4287],{},"Exemple de code H3 :",[390,4289,4291],{"className":4061,"code":4290,"language":4063,"meta":395,"style":395},"import { createApp, eventHandler, toNodeListener } from \"h3\";\nimport { listen } from \"listhen\";\n\nconst app = createApp();\napp.use(\n  \"\u002F\",\n  eventHandler(() => \"Hello world!\"),\n);\n\nlisten(toNodeListener(app));\n",[117,4292,4293,4326,4343,4347,4361,4373,4381,4397,4402,4406],{"__ignoreMap":395},[399,4294,4295,4298,4301,4304,4306,4309,4311,4314,4317,4320,4323],{"class":401,"line":402},[399,4296,4297],{"class":4224},"import",[399,4299,4300],{"class":409}," { ",[399,4302,4303],{"class":4073},"createApp",[399,4305,1273],{"class":409},[399,4307,4308],{"class":4073},"eventHandler",[399,4310,1273],{"class":409},[399,4312,4313],{"class":4073},"toNodeListener",[399,4315,4316],{"class":409}," } ",[399,4318,4319],{"class":1117},"from",[399,4321,4322],{"class":4088}," \"h3\"",[399,4324,4325],{"class":409},";\n",[399,4327,4328,4330,4332,4334,4336,4338,4341],{"class":401,"line":1141},[399,4329,4297],{"class":4224},[399,4331,4300],{"class":409},[399,4333,4194],{"class":4073},[399,4335,4316],{"class":409},[399,4337,4319],{"class":1117},[399,4339,4340],{"class":4088}," \"listhen\"",[399,4342,4325],{"class":409},[399,4344,4345],{"class":401,"line":1151},[399,4346,1155],{"emptyLinePlaceholder":1154},[399,4348,4349,4351,4353,4355,4358],{"class":401,"line":1158},[399,4350,4070],{"class":1117},[399,4352,4099],{"class":4073},[399,4354,4078],{"class":4077},[399,4356,4357],{"class":4081}," createApp",[399,4359,4360],{"class":409},"();\n",[399,4362,4363,4365,4367,4370],{"class":401,"line":1164},[399,4364,4128],{"class":4073},[399,4366,715],{"class":409},[399,4368,4369],{"class":4081},"use",[399,4371,4372],{"class":409},"(\n",[399,4374,4375,4378],{"class":401,"line":1174},[399,4376,4377],{"class":4088},"  \"\u002F\"",[399,4379,4380],{"class":409},",\n",[399,4382,4383,4386,4389,4391,4394],{"class":401,"line":1179},[399,4384,4385],{"class":4081},"  eventHandler",[399,4387,4388],{"class":409},"(() ",[399,4390,4156],{"class":1117},[399,4392,4393],{"class":4088}," \"Hello world!\"",[399,4395,4396],{"class":409},"),\n",[399,4398,4399],{"class":401,"line":1185},[399,4400,4401],{"class":409},");\n",[399,4403,4404],{"class":401,"line":1195},[399,4405,1155],{"emptyLinePlaceholder":1154},[399,4407,4408,4410,4412,4414,4416,4418],{"class":401,"line":1200},[399,4409,4194],{"class":4081},[399,4411,4085],{"class":409},[399,4413,4313],{"class":4081},[399,4415,4085],{"class":409},[399,4417,4128],{"class":4073},[399,4419,4420],{"class":409},"));\n",[32,4422,4423,4424],{},"Plus d'infos sur H3 : ",[36,4425,4426],{"href":4426,"rel":4427},"https:\u002F\u002Funjs.io\u002Fpackages\u002Fh3",[40],[77,4429,4431],{"id":4430},"_2-fastify","2. Fastify",[32,4433,4434],{},"Fastify est un framework Node.js qui se veut rapide et léger. De base il est ultraléger et ne contient que le strict minimum.",[32,4436,4437],{},"La vitesse est son point fort et sa plus grande force.",[32,4439,4440],{},"Il est très facilement extensible avec des plugins, des hooks et des décorateurs. Il offre une très bonne expérience de développement.",[32,4442,4443],{},"Exemple de code Fastify :",[390,4445,4447],{"className":4061,"code":4446,"language":4063,"meta":395,"style":395},"\u002F\u002F Require the framework and instantiate it\nconst fastify = require('fastify')({ logger: true })\n\n\u002F\u002F Declare a route\nfastify.get('\u002F', function handler (request, reply) {\n  reply.send({ hello: 'world' })\n})\n\n\u002F\u002F Run the server!\nfastify.listen({ port: 3000 }, (err) => {\n  if (err) {\n    fastify.log.error(err)\n    process.exit(1)\n  }\n})\n",[117,4448,4449,4454,4486,4490,4495,4530,4552,4556,4560,4565,4594,4605,4626,4644,4650],{"__ignoreMap":395},[399,4450,4451],{"class":401,"line":402},[399,4452,4453],{"class":1137},"\u002F\u002F Require the framework and instantiate it\n",[399,4455,4456,4458,4461,4463,4465,4467,4470,4473,4476,4480,4483],{"class":401,"line":1141},[399,4457,4070],{"class":1117},[399,4459,4460],{"class":4073}," fastify",[399,4462,4078],{"class":4077},[399,4464,4082],{"class":4081},[399,4466,4085],{"class":409},[399,4468,4469],{"class":4088},"'fastify'",[399,4471,4472],{"class":409},")({ ",[399,4474,4475],{"class":4073},"logger",[399,4477,4479],{"class":4478},"s2hdG",":",[399,4481,4482],{"class":1110}," true",[399,4484,4485],{"class":409}," })\n",[399,4487,4488],{"class":401,"line":1151},[399,4489,1155],{"emptyLinePlaceholder":1154},[399,4491,4492],{"class":401,"line":1158},[399,4493,4494],{"class":1137},"\u002F\u002F Declare a route\n",[399,4496,4497,4500,4502,4504,4506,4508,4510,4513,4516,4519,4522,4524,4527],{"class":401,"line":1164},[399,4498,4499],{"class":4073},"fastify",[399,4501,715],{"class":409},[399,4503,4133],{"class":4081},[399,4505,4085],{"class":409},[399,4507,4138],{"class":4088},[399,4509,1273],{"class":409},[399,4511,4512],{"class":1117},"function",[399,4514,4515],{"class":4081}," handler",[399,4517,4518],{"class":409}," (",[399,4520,4521],{"class":4144},"request",[399,4523,1273],{"class":409},[399,4525,4526],{"class":4144},"reply",[399,4528,4529],{"class":409},") {\n",[399,4531,4532,4535,4537,4539,4542,4545,4547,4550],{"class":401,"line":1174},[399,4533,4534],{"class":4073},"  reply",[399,4536,715],{"class":409},[399,4538,4169],{"class":4081},[399,4540,4541],{"class":409},"({ ",[399,4543,4544],{"class":4073},"hello",[399,4546,4479],{"class":4478},[399,4548,4549],{"class":4088}," 'world'",[399,4551,4485],{"class":409},[399,4553,4554],{"class":401,"line":1179},[399,4555,4181],{"class":409},[399,4557,4558],{"class":401,"line":1185},[399,4559,1155],{"emptyLinePlaceholder":1154},[399,4561,4562],{"class":401,"line":1195},[399,4563,4564],{"class":1137},"\u002F\u002F Run the server!\n",[399,4566,4567,4569,4571,4573,4575,4577,4579,4582,4585,4588,4590,4592],{"class":401,"line":1200},[399,4568,4499],{"class":4073},[399,4570,715],{"class":409},[399,4572,4194],{"class":4081},[399,4574,4541],{"class":409},[399,4576,4199],{"class":4073},[399,4578,4479],{"class":4478},[399,4580,4581],{"class":4118}," 3000",[399,4583,4584],{"class":409}," }, (",[399,4586,4587],{"class":4144},"err",[399,4589,4153],{"class":409},[399,4591,4156],{"class":1117},[399,4593,4159],{"class":409},[399,4595,4596,4599,4601,4603],{"class":401,"line":1206},[399,4597,4598],{"class":1117},"  if",[399,4600,4518],{"class":409},[399,4602,4587],{"class":4073},[399,4604,4529],{"class":409},[399,4606,4608,4611,4613,4615,4617,4620,4622,4624],{"class":401,"line":4607},12,[399,4609,4610],{"class":4073},"    fastify",[399,4612,715],{"class":409},[399,4614,4216],{"class":4073},[399,4616,715],{"class":409},[399,4618,4619],{"class":4081},"error",[399,4621,4085],{"class":409},[399,4623,4587],{"class":4073},[399,4625,4092],{"class":409},[399,4627,4629,4632,4634,4637,4639,4642],{"class":401,"line":4628},13,[399,4630,4631],{"class":4073},"    process",[399,4633,715],{"class":409},[399,4635,4636],{"class":4081},"exit",[399,4638,4085],{"class":409},[399,4640,4641],{"class":4118},"1",[399,4643,4092],{"class":409},[399,4645,4647],{"class":401,"line":4646},14,[399,4648,4649],{"class":409},"  }\n",[399,4651,4653],{"class":401,"line":4652},15,[399,4654,4181],{"class":409},[32,4656,4657,4658],{},"Plus d'infos sur Fastify : ",[36,4659,4660],{"href":4660,"rel":4661},"https:\u002F\u002Ffastify.dev\u002F",[40],[77,4663,4665],{"id":4664},"_3-hono","3. Hono",[32,4667,4668],{},"Hono est un framework minimaliste qui se veut rapide et léger.",[32,4670,4671],{},"Il a l'avantage d'être compatible avec une multitude d'environnements : Cloudflare, Fastly, Deno, Bun, AWS, Lagon, etc.",[32,4673,4674],{},"Il dispose de toutes les fonctionnalités de base : routing, middleware, etc. et il supporte nativement TypeScript.",[32,4676,4677],{},"Exemple de code Hono :",[390,4679,4681],{"className":4061,"code":4680,"language":4063,"meta":395,"style":395},"import { Hono } from 'hono'\nconst app = new Hono()\n\napp.get('\u002F', (c) => c.text('Hono!'))\n\nexport default app\n",[117,4682,4683,4699,4715,4719,4756,4760],{"__ignoreMap":395},[399,4684,4685,4687,4689,4692,4694,4696],{"class":401,"line":402},[399,4686,4297],{"class":4224},[399,4688,4300],{"class":409},[399,4690,4691],{"class":4073},"Hono",[399,4693,4316],{"class":409},[399,4695,4319],{"class":1117},[399,4697,4698],{"class":4088}," 'hono'\n",[399,4700,4701,4703,4705,4707,4710,4713],{"class":401,"line":1141},[399,4702,4070],{"class":1117},[399,4704,4099],{"class":4073},[399,4706,4078],{"class":4077},[399,4708,4709],{"class":1117}," new",[399,4711,4712],{"class":4081}," Hono",[399,4714,4106],{"class":409},[399,4716,4717],{"class":401,"line":1151},[399,4718,1155],{"emptyLinePlaceholder":1154},[399,4720,4721,4723,4725,4727,4729,4731,4733,4736,4738,4740,4743,4745,4748,4750,4753],{"class":401,"line":1158},[399,4722,4128],{"class":4073},[399,4724,715],{"class":409},[399,4726,4133],{"class":4081},[399,4728,4085],{"class":409},[399,4730,4138],{"class":4088},[399,4732,4141],{"class":409},[399,4734,4735],{"class":4144},"c",[399,4737,4153],{"class":409},[399,4739,4156],{"class":1117},[399,4741,4742],{"class":4073}," c",[399,4744,715],{"class":409},[399,4746,4747],{"class":4081},"text",[399,4749,4085],{"class":409},[399,4751,4752],{"class":4088},"'Hono!'",[399,4754,4755],{"class":409},"))\n",[399,4757,4758],{"class":401,"line":1164},[399,4759,1155],{"emptyLinePlaceholder":1154},[399,4761,4762,4765,4768],{"class":401,"line":1174},[399,4763,4764],{"class":4224},"export",[399,4766,4767],{"class":1117}," default",[399,4769,4770],{"class":4073}," app\n",[32,4772,4773,4774],{},"Plus d'infos sur Hono : ",[36,4775,4776],{"href":4776,"rel":4777},"https:\u002F\u002Fhono.dev\u002F",[40],[27,4779,4781],{"id":4780},"les-frameworks-plus-complets","Les frameworks plus complets",[77,4783,4785],{"id":4784},"_4-nitro","4. Nitro",[32,4787,4788],{},"Nitro est un framework 100% Typescript. Tout comme H3, il nous vient de l'écosystème UnJS.",[32,4790,4791],{},"Il embarque un tas de fonctionnalité pour vous simplifier la vie : routing basé sur les fichiers, auto-import, système de cache, middleware, plugins, etc.",[32,4793,4794],{},"Tout comme H3, il est compatible avec les environnements serverless, workers et NodeJS.",[32,4796,4797],{},"C'est notre framework préféré dans cette liste !",[32,4799,4800,4801],{},"Vidéo de Daniel Roe sur Nitro. Construire un framework React avec Nitro durant une présentation : ",[36,4802,4803],{"href":4803,"rel":4804},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=hdHLU0qHKhA",[40],[32,4806,4807],{},"Exemple de code Nitro :",[390,4809,4811],{"className":4061,"code":4810,"language":4063,"meta":395,"style":395},"\u002F\u002F api\u002Fhello.ts\nexport default defineEventHandler(() => {\n  return { hello: 'world' }\n})\n",[117,4812,4813,4818,4833,4849],{"__ignoreMap":395},[399,4814,4815],{"class":401,"line":402},[399,4816,4817],{"class":1137},"\u002F\u002F api\u002Fhello.ts\n",[399,4819,4820,4822,4824,4827,4829,4831],{"class":401,"line":1141},[399,4821,4764],{"class":4224},[399,4823,4767],{"class":1117},[399,4825,4826],{"class":4081}," defineEventHandler",[399,4828,4388],{"class":409},[399,4830,4156],{"class":1117},[399,4832,4159],{"class":409},[399,4834,4835,4838,4840,4842,4844,4846],{"class":401,"line":1151},[399,4836,4837],{"class":1117},"  return",[399,4839,4300],{"class":409},[399,4841,4544],{"class":4073},[399,4843,4479],{"class":4478},[399,4845,4549],{"class":4088},[399,4847,4848],{"class":409}," }\n",[399,4850,4851],{"class":401,"line":1158},[399,4852,4181],{"class":409},[32,4854,4855,4856],{},"Plus d'infos sur Nitro : ",[36,4857,4858],{"href":4858,"rel":4859},"https:\u002F\u002Funjs.io\u002Fpackages\u002Fnitro",[40],[77,4861,4863],{"id":4862},"_5-nest-js","5. Nest JS",[32,4865,4866],{},"NestJS est un framework Node.js qui se veut robuste et performant. Il supporte nativement TypeScript. Avec lui vous pouvez faire de l'orienté objet, du fonctionnal et de la programmation réactive.",[32,4868,4869],{},"Par défaut, il utilise ExpressJS sous le capot mais il est possible de le faire fonctionner avec Fastify.",[32,4871,4872],{},"Pour être honnête, Nest JS est plus compliqué à prendre en main mais il est beaucoup plus puissant.",[32,4874,4875],{},"Exemple de code NestJS :",[390,4877,4879],{"className":4061,"code":4878,"language":4063,"meta":395,"style":395},"import { Injectable } from '@nestjs\u002Fcommon';\n\n@Injectable()\nexport class AppService {\n  getHello(): string {\n    return 'Hello, world!';\n  }\n}\n",[117,4880,4881,4899,4903,4912,4924,4939,4949,4953],{"__ignoreMap":395},[399,4882,4883,4885,4887,4890,4892,4894,4897],{"class":401,"line":402},[399,4884,4297],{"class":4224},[399,4886,4300],{"class":409},[399,4888,4889],{"class":4073},"Injectable",[399,4891,4316],{"class":409},[399,4893,4319],{"class":1117},[399,4895,4896],{"class":4088}," '@nestjs\u002Fcommon'",[399,4898,4325],{"class":409},[399,4900,4901],{"class":401,"line":1141},[399,4902,1155],{"emptyLinePlaceholder":1154},[399,4904,4905,4908,4910],{"class":401,"line":1151},[399,4906,4907],{"class":409},"@",[399,4909,4889],{"class":4081},[399,4911,4106],{"class":409},[399,4913,4914,4916,4919,4922],{"class":401,"line":1158},[399,4915,4764],{"class":4224},[399,4917,4918],{"class":1117}," class",[399,4920,4921],{"class":405}," AppService",[399,4923,4159],{"class":409},[399,4925,4926,4929,4932,4934,4937],{"class":401,"line":1164},[399,4927,4928],{"class":4081},"  getHello",[399,4930,4931],{"class":409},"()",[399,4933,4479],{"class":1117},[399,4935,4936],{"class":405}," string",[399,4938,4159],{"class":409},[399,4940,4941,4944,4947],{"class":401,"line":1174},[399,4942,4943],{"class":1117},"    return",[399,4945,4946],{"class":4088}," 'Hello, world!'",[399,4948,4325],{"class":409},[399,4950,4951],{"class":401,"line":1179},[399,4952,4649],{"class":409},[399,4954,4955],{"class":401,"line":1185},[399,4956,4957],{"class":409},"}\n",[32,4959,4960,4961],{},"Plus d'infos sur NestJS : ",[36,4962,4963],{"href":4963,"rel":4964},"https:\u002F\u002Fnestjs.com\u002F",[40],[77,4966,4968],{"id":4967},"_6-adonisjs","6. AdonisJS",[32,4970,4971],{},"AdonisJS est un framework très complet qui vous permet de créer toutes sortes de projets, de l'application web complète à l'API.",[32,4973,4974],{},"Il est basé lui aussi sur TypeScript. Il offre tout un tas de fonctionnalités de base comme les controllers, les middlewares, les gestions des fichiers en uploads, les cookies, etc.",[32,4976,4977],{},"Il embarque aussi un ORM pour gérer vos bases de données.",[32,4979,4980],{},"C'est un framework très complet équivalent à Laravel pour PHP.",[32,4982,4983],{},"Exemple de code AdonisJS :",[390,4985,4987],{"className":4061,"code":4986,"language":4063,"meta":395,"style":395},"import Route from '@ioc:Adonis\u002FCore\u002FRoute'\n\nRoute.get('\u002F', () => {\n  return 'Hello world'\n})\n",[117,4988,4989,5002,5006,5025,5032],{"__ignoreMap":395},[399,4990,4991,4993,4996,4999],{"class":401,"line":402},[399,4992,4297],{"class":4224},[399,4994,4995],{"class":4073}," Route",[399,4997,4998],{"class":1117}," from",[399,5000,5001],{"class":4088}," '@ioc:Adonis\u002FCore\u002FRoute'\n",[399,5003,5004],{"class":401,"line":1141},[399,5005,1155],{"emptyLinePlaceholder":1154},[399,5007,5008,5011,5013,5015,5017,5019,5021,5023],{"class":401,"line":1151},[399,5009,5010],{"class":4073},"Route",[399,5012,715],{"class":409},[399,5014,4133],{"class":4081},[399,5016,4085],{"class":409},[399,5018,4138],{"class":4088},[399,5020,4202],{"class":409},[399,5022,4156],{"class":1117},[399,5024,4159],{"class":409},[399,5026,5027,5029],{"class":401,"line":1158},[399,5028,4837],{"class":1117},[399,5030,5031],{"class":4088}," 'Hello world'\n",[399,5033,5034],{"class":401,"line":1164},[399,5035,4181],{"class":409},[32,5037,5038,5039],{},"Plus d'infos sur AdonisJS : ",[36,5040,5041],{"href":5041,"rel":5042},"https:\u002F\u002Fadonisjs.com\u002F",[40],[27,5044,5046],{"id":5045},"a-voir-aussi","A voir aussi",[110,5048,5049,5056,5063,5070],{},[113,5050,5051,5052],{},"Koa : ",[36,5053,5054],{"href":5054,"rel":5055},"https:\u002F\u002Fkoajs.com\u002F",[40],[113,5057,5058,5059],{},"Sails : ",[36,5060,5061],{"href":5061,"rel":5062},"https:\u002F\u002Fsailsjs.com\u002F",[40],[113,5064,5065,5066],{},"Hapi : ",[36,5067,5068],{"href":5068,"rel":5069},"https:\u002F\u002Fhapi.dev\u002F",[40],[113,5071,5072,5073],{},"Derby : ",[36,5074,5075],{"href":5075,"rel":5076},"https:\u002F\u002Fderbyjs.com\u002F",[40],[32,5078,5079],{},"Pour conclure, même si ExpressJS est encore une solution viable pour développer une petite API, il existe aujourd'hui des alternatives plus modernes et tout aussi simples à prendre en main.",[1284,5081,5082],{},"html pre.shiki code .scrqX, html code.shiki .scrqX{--shiki-default:#FEDE5D}html pre.shiki code .sqjNi, html code.shiki .sqjNi{--shiki-default:#FF7EDB}html pre.shiki code .sW278, html code.shiki .sW278{--shiki-default:#FFFFFFEE}html pre.shiki code .sgRlq, html code.shiki .sgRlq{--shiki-default:#36F9F6}html pre.shiki code .soy-K, html code.shiki .soy-K{--shiki-default:#BBBBBB}html pre.shiki code .sFl1-, html code.shiki .sFl1-{--shiki-default:#FF8B39}html pre.shiki code .sz5MA, html code.shiki .sz5MA{--shiki-default:#2EE2FA}html pre.shiki code .sH7Js, html code.shiki .sH7Js{--shiki-default:#FF7EDB;--shiki-default-font-style:italic}html pre.shiki code .sfE7D, html code.shiki .sfE7D{--shiki-default:#72F1B8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sjThu, html code.shiki .sjThu{--shiki-default:#848BBD;--shiki-default-font-style:italic}html pre.shiki code .s2hdG, html code.shiki .s2hdG{--shiki-default:#B6B1B1}html pre.shiki code .sSmKr, html code.shiki .sSmKr{--shiki-default:#F97E72}html pre.shiki code .sRQ1T, html code.shiki .sRQ1T{--shiki-default:#FE4450}",{"title":395,"searchDepth":1141,"depth":1141,"links":5084},[5085,5090,5095],{"id":4273,"depth":1141,"text":4274,"children":5086},[5087,5088,5089],{"id":4277,"depth":1151,"text":4278},{"id":4430,"depth":1151,"text":4431},{"id":4664,"depth":1151,"text":4665},{"id":4780,"depth":1141,"text":4781,"children":5091},[5092,5093,5094],{"id":4784,"depth":1151,"text":4785},{"id":4862,"depth":1151,"text":4863},{"id":4967,"depth":1151,"text":4968},{"id":5045,"depth":1141,"text":5046},"ExpressJS a été créé en 2010 par TJ Holowaychuk. Il a été conçu pour être un \"framework\" minimaliste et flexible pour les applications web et mobiles.ExpressJS a été créé pour faciliter la vie des développeurs avec des fonctions simples pour créer un serveur web.",{},"\u002Farticles\u002Fexpress-js-alternative","2024-01-08",{"title":4043,"description":5096},"articles\u002Fexpress-js-alternative","9h2UJPLeAHvjECkDV5rZ_R1q42IyaYDoIoGgh5-OUYo",{"id":5104,"title":5105,"author":5106,"body":5107,"description":5284,"extension":1324,"meta":5285,"navigation":1154,"path":5286,"publicationDate":5287,"seo":5288,"stem":5289,"__hash__":5290},"articles\u002Farticles\u002Fvacances-noel-23.md","Réécoutez nos épisodes de podcast pendant les vacances de Noël",{"name":21,"url":22},{"type":24,"value":5108,"toc":5276},[5109,5112,5116,5168,5172,5188,5192,5208,5212,5221,5225,5234,5238,5266,5273],[32,5110,5111],{},"Réécoutez nos épisodes de podcast pendant les vacances de Noël. Nous vous proposons une sélection de quelques podcasts pour vous accompagner pendant les vacances de Noël.",[27,5113,5115],{"id":5114},"les-épisodes-inspirants","Les épisodes inspirants",[110,5117,5118,5125,5132,5139,5146,5153,5160],{},[113,5119,5120,5121],{},"Avec François Lanthier Nadeau qui était CEO de Snipcart à l'époque. ",[36,5122,5123],{"href":5123,"rel":5124},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002Fe-commerce-snipcart\u002F",[40],[113,5126,5127,5128],{},"Avec Jim Laurie, cofondateur de Strapi. ",[36,5129,5130],{"href":5130,"rel":5131},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002Fstrapi\u002F",[40],[113,5133,5134,5135],{},"Avec Thomas et Marin de MeiliSearch. ",[36,5136,5137],{"href":5137,"rel":5138},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002Fmeilisearch\u002F",[40],[113,5140,5141,5142],{},"Avec Sébastien Chopin, cofondateur de Nuxt.js. ",[36,5143,5144],{"href":5144,"rel":5145},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002Fnuxt-sebastien-chopin\u002F",[40],[113,5147,5148,5149],{},"Avec Sébastien Lorber, pour parler de docusaurus et de react ",[36,5150,5151],{"href":5151,"rel":5152},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002Fdocusaurus\u002F",[40],[113,5154,5155,5156],{},"Avec Guillaume Briday, pour parler de Ruby on Rail et de la philosophie du Framework. ",[36,5157,5158],{"href":5158,"rel":5159},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002Fruby-on-rails\u002F",[40],[113,5161,5162,5163,5167],{},"Avec Arnaud Ligny, pour parler de son projet open source, Cecil. ",[36,5164,5165],{"href":5165,"rel":5166},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002Fcecil-static-php\u002F",[40],"\net bien d'autres encore dans la liste des podcasts.",[27,5169,5171],{"id":5170},"les-épisodes-sur-la-performance","Les épisodes sur la performance",[110,5173,5174,5181],{},[113,5175,5176,5177],{},"Avec Eroan Boyer qui est spécialisé en Web Performance. ",[36,5178,5179],{"href":5179,"rel":5180},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002Fwebperf\u002F",[40],[113,5182,5183,5184],{},"Animation CSS avec une partie performance ",[36,5185,5186],{"href":5186,"rel":5187},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002Fanimecss\u002F",[40],[27,5189,5191],{"id":5190},"laravel-wordpress","Laravel, WordPress",[110,5193,5194,5201],{},[113,5195,5196,5197],{},"Avec Ludo de LaravelJutsu ",[36,5198,5199],{"href":5199,"rel":5200},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002Flaravel\u002F",[40],[113,5202,5203,5204],{},"WordPress encore valable en 2023 ? ",[36,5205,5206],{"href":5206,"rel":5207},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002Fwordpress\u002F",[40],[27,5209,5211],{"id":5210},"les-épisodes-sur-le-e-commerce","Les épisodes sur le e-commerce",[110,5213,5214],{},[113,5215,5216,5217],{},"Adrien de Peretti pour Medusa JS ",[36,5218,5219],{"href":5219,"rel":5220},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002Fmedusa\u002F",[40],[27,5222,5224],{"id":5223},"les-épisodes-sur-le-seo","Les épisodes sur le SEO",[110,5226,5227],{},[113,5228,5229,5230],{},"Avec Dan Bernier pour parler de SEO + IA ",[36,5231,5232],{"href":5232,"rel":5233},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002Fseoia\u002F",[40],[27,5235,5237],{"id":5236},"pour-finir-les-animations","Pour finir les animations",[110,5239,5240,5247,5254,5261],{},[113,5241,5242,5243],{},"Bruno Simon pour parler de Three.js ",[36,5244,5245],{"href":5245,"rel":5246},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002Fthree-js\u002F",[40],[113,5248,5249,5250],{},"Charly Martin pour parler de Lottie ",[36,5251,5252],{"href":5252,"rel":5253},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002Flottie-svg-animation\u002F",[40],[113,5255,5256,5257],{},"Les animations avec JS ",[36,5258,5259],{"href":5259,"rel":5260},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002Fanimejs\u002F",[40],[113,5262,5183,5263],{},[36,5264,5186],{"href":5186,"rel":5265},[40],[32,5267,5268,5269,715],{},"Évidemment, ceci est une liste non exhaustive de quelques épisodes. Tous les épisodes valent le coup d’être écouté. Encore merci à tous nos invités d’avoir participés. Retrouvez tous les podcasts à écouter sur la page ",[36,5270,5271],{"href":5271,"rel":5272},"https:\u002F\u002Fdouble-slash.dev\u002Fpodcasts\u002F",[40],[32,5274,5275],{},"Merci à tous nos auditeurs et auditrices. Nous vous souhaitons de bonnes fêtes de fin d’année et à l’année prochaine pour de nouveaux épisodes.",{"title":395,"searchDepth":1141,"depth":1141,"links":5277},[5278,5279,5280,5281,5282,5283],{"id":5114,"depth":1141,"text":5115},{"id":5170,"depth":1141,"text":5171},{"id":5190,"depth":1141,"text":5191},{"id":5210,"depth":1141,"text":5211},{"id":5223,"depth":1141,"text":5224},{"id":5236,"depth":1141,"text":5237},"Réécoutez nos épisodes de podcast pendant les vacances de Noël. Nous vous proposons une sélection de nos meilleurs podcasts pour vous accompagner pendant les vacances de Noël.",{},"\u002Farticles\u002Fvacances-noel-23","2023-12-21",{"title":5105,"description":5284},"articles\u002Fvacances-noel-23","Alxb0BxU0CPmJcrHyIXlA_ZJsbPpzhYFNgHpYdAtuGg",{"id":5292,"title":5293,"author":5294,"body":5295,"description":6160,"extension":1324,"meta":6161,"navigation":1154,"path":6162,"publicationDate":6163,"seo":6164,"stem":6165,"__hash__":6166},"articles\u002Farticles\u002Fwordpress-2023.md","Faut-il utiliser WordPress en 2023 ?",{"name":21,"url":22},{"type":24,"value":5296,"toc":6136},[5297,5306,5308,5313,5319,5322,5327,5330,5336,5340,5344,5381,5386,5390,5397,5402,5405,5412,5416,5420,5425,5428,5442,5445,5450,5454,5457,5460,5463,5466,5469,5473,5476,5479,5482,5485,5489,5492,5495,5498,5502,5505,5508,5512,5515,5536,5539,5543,5575,5578,5582,5585,5593,5596,5600,5603,5606,5609,5615,5623,5627,5630,5633,5636,5639,5642,5645,5648,5652,5656,5665,5668,5784,5787,5792,5796,5818,5822,5825,5829,5832,5835,5838,5841,5844,5847,5851,5854,5857,5860,5863,5866,5869,5872,5875,5878,5881,5921,5925,5928,5978,5982,5991,5994,5998,6001,6004,6024,6027,6043,6047,6050,6059,6062,6078,6082,6099,6106,6108,6111,6116,6119,6133],[511,5298,5300],{"type":5299},"warning",[32,5301,5302,5303],{},"Retrouvez et écoutez l'épisode lié à l'article : ",[36,5304,5206],{"href":5206,"rel":5305},[40],[1958,5307],{},[5309,5310,5312],"h1",{"id":5311},"wordpress-en-2023","WordPress en 2023",[32,5314,5315,5318],{},[201,5316,5317],{},"WordPress"," fêtera ses 20 ans le 27 mai de cette année ! Oui, 20 ans déjà !",[32,5320,5321],{},"Bon nombre de CMS aussi anciens que lui ont rejoint le cimetière des CMS depuis bien longtemps. Certains, je pense à Joomla par exemple, ont déjà  un pied dans la tombe (j'entends déjà grincer les fans).",[32,5323,5324,5326],{},[201,5325,5317],{},", quand a lui, est toujours présent. Et bien présent ! Il évolue toujours et sa part de marché ne fait qu'augmenter.",[32,5328,5329],{},"Alors une question se pose en ce début d'année quand on est développeur :",[32,5331,5332],{},[201,5333,5293],{"className":5334},[5335],"text-2xl",[27,5337,5339],{"id":5338},"wordpress-en-bref","WordPress en bref",[77,5341,5343],{"id":5342},"quelques-chiffres","Quelques chiffres",[110,5345,5346,5353,5363,5369,5375],{},[113,5347,5348,5349,5352],{},"Plus de ",[201,5350,5351],{},"40%"," des sites dans le monde utilisent WordPress",[113,5354,5348,5355,5358,5359,5362],{},[201,5356,5357],{},"60 000"," plugins. Certains dépassent les ",[201,5360,5361],{},"5 millions"," d'installations.",[113,5364,5365,5368],{},[201,5366,5367],{},"20%"," des WordPress utilisent WooCommerce",[113,5370,5348,5371,5374],{},[201,5372,5373],{},"60%"," des sites qui utilisent un CMS sont sur WordPress",[113,5376,5377,5380],{},[201,5378,5379],{},"90%"," des sites avec CMS piratés en 2018 étaient sur WordPress.",[511,5382,5383],{},[32,5384,5385],{},"La fuite des Panama Papers a été causée par une extension WordPress pas à jour.",[77,5387,5389],{"id":5388},"une-communauté-active","Une communauté active",[32,5391,5392,5393,5396],{},"WordPress reste ",[201,5394,5395],{},"open-source"," et les contributeurs sont tous bénévoles. Certains sont mis à disposition de sociétés qui vendent des produits liés à WordPress, d'autres viennent d'agence web et certains sont de simples contributeurs.",[511,5398,5399],{},[32,5400,5401],{},"Attention, ne pas confondre wordpress.org et wordpress.com.",[32,5403,5404],{},"Beaucoup d'articles et de forums pour trouver des solutions. Évidemment, il faut faire le tri et beaucoup sont obsolètes.",[32,5406,5407,5408,5411],{},"Organisation d'évènements, notamment les ",[201,5409,5410],{},"WordCamps",", où se regroupent les utilisateurs du CMS pour échanger.",[27,5413,5415],{"id":5414},"pourquoi-les-développeurs-détestent-wordpress","Pourquoi les développeurs détestent WordPress",[77,5417,5419],{"id":5418},"les-casseroles-de-wordpress","Les casseroles de WordPress",[5421,5422,5424],"h4",{"id":5423},"php-cest-mort","PHP c'est mort",[32,5426,5427],{},"Ce n'est pas un vrai langage, c'est lent, etc.. On peut tout entendre depuis des années sur ce langage. Alors, oui, à la base ce n'était pas vraiment un langage de programmation. Si vous regardez les premières versions de PHP, c'était assez basique.",[32,5429,5430,5431,5434,5435,5438,5439,5441],{},"Cependant, aujourd'hui ",[201,5432,5433],{},"PHP"," vient de sortir sa version ",[201,5436,5437],{},"8.2"," et il n'a plus à rougir face à d'autres langages de programmation.  Il y a également de nombreux frameworks ",[201,5440,5433],{}," populaires tels que Laravel, Symfony et CodeIgniter qui offrent des fonctionnalités avancées pour les développeurs et qui sont utilisés sur des gros projets professionnels.",[32,5443,5444],{},"En résumé, PHP est toujours une technologie de programmation pertinente et qui est utilisé par de nombreuses entreprises et développeurs pour construire des applications web.",[32,5446,5447],{},[201,5448,5449],{},"PHP est loin d'être mort.",[5421,5451,5453],{"id":5452},"ah-bon-tes-développeur-wordpress","Ah bon, t'es développeur WordPress ?",[32,5455,5456],{},"Comment savoir si un développeur qui développe des sites avec WordPress code vraiment ou installe juste un tas de plugins ?",[32,5458,5459],{},"WordPress est accessible et permet à tout à chacun de concevoir un site web. Et ça même sans connaissance technique. C'est la force du CMS mais c'est aussi sa plus grande faiblesse.",[32,5461,5462],{},"En France, il existe des agences spécialisées WordPress qui fournissent du travail de qualité. Il y a également des développeurs freelances qui codent propre.",[32,5464,5465],{},"Cependant, une grosse majorité des sites conçus par des \"Webmasters\", les spécialistes en Webmarketing ou même agences de communication sont très mal conçues et concentrent toutes les mauvaises pratiques de la plateforme.",[32,5467,5468],{},"Pour les clients, il est difficile de faire le tri et il y a une grosse disparité aux niveaux des prix.",[5421,5470,5472],{"id":5471},"wordpress-cest-pas-sécurisé","WordPress, c'est pas sécurisé",[32,5474,5475],{},"Effectivement, un WordPress peut être un danger pour les data si on ne suit pas les bonnes pratiques de base. Les mises à jour sont la première chose à effectuer régulièrement.",[32,5477,5478],{},"Installer un plugin de sécurité est aussi une bonne pratique.",[32,5480,5481],{},"Avec une grosse part de marché, WordPress est forcément la cible favorite des hackers. Il est donc nécessaire d'avoir des sauvegardes pour pouvoir réinstaller rapidement une version non hackée de son site.",[32,5483,5484],{},"Oui, le risque d'infection existe et il faut en avoir conscience.",[5421,5486,5488],{"id":5487},"wordpress-cest-lent","WordPress, c'est lent",[32,5490,5491],{},"Tout comme la sécurité, si le site WordPress n'a pas été correctement codé et si l'équipe n'a pas respecté les bonnes pratiques, un site WordPress peut être très lent.",[32,5493,5494],{},"Il n'est pas rare, de voir des sites avec 200 requêtes sur une page et un score en dessous des 20 sur le Page Speed Insight.\nDes sites qui traînent plus d'une cinquantaine de plugin, construit avec un page builder tel qu'Elementor et un thème acheté 50$ sur thèmes Forest.",[32,5496,5497],{},"Mais en suivant les bonnes pratiques, il est possible d'avoir un très bon score avec un site WordPress. Personnellement, j'ai des sites à plus de 95 au test Page Speed Insight.",[5421,5499,5501],{"id":5500},"wordpress-cest-pour-faire-des-blogs","WordPress, c'est pour faire des blogs",[32,5503,5504],{},"Si WordPress était une plateforme de blog à la base, ce n'est plus le cas aujourd'hui.",[32,5506,5507],{},"En plus des posts, toujours disponibles, il y a de base la possibilité de faire des pages. Et ensuite vous pouvez ajouter d'autres types via les \"custom post type\". Il n'y a pas de limite.",[5421,5509,5511],{"id":5510},"on-peut-pas-faire-des-gros-sites-avec-wordpress","On peut pas faire des gros sites avec WordPress",[32,5513,5514],{},"Apparemment ce n'est pas ce que se sont dit les créateurs des sites suivants :",[110,5516,5517,5524,5530],{},[113,5518,5519],{},[36,5520,5523],{"href":5521,"rel":5522},"https:\u002F\u002Fwww.whitehouse.gov\u002F",[40],"https:\u002F\u002Fwww.whitehouse.gov",[113,5525,5526],{},[36,5527,5528],{"href":5528,"rel":5529},"https:\u002F\u002Fwww.nationalarchives.gov.uk\u002F",[40],[113,5531,5532],{},[36,5533,5534],{"href":5534,"rel":5535},"https:\u002F\u002Ftechcrunch.com\u002F",[40],[32,5537,5538],{},"et la liste est longue...",[27,5540,5542],{"id":5541},"la-vérité-sur-wordpress","La vérité sur WordPress",[110,5544,5545,5548,5551,5554,5557,5560,5563,5566,5569,5572],{},[113,5546,5547],{},"Beaucoup de sites mal conçus. Et beaucoup viennent malheureusement d'agences web.",[113,5549,5550],{},"Mélange PHP\u002FHTML toujours aussi horrible (cela change avec le FSE)",[113,5552,5553],{},"Beaucoup de code legacy dû à une rétrocompatibilité et une dette technique (et oui, 20 ans).",[113,5555,5556],{},"Uniquement MySQL en base de données. SQLite arrive.",[113,5558,5559],{},"Structure de dossier (de base) qui donne accès à tout via le navigateur.",[113,5561,5562],{},"Pas d'outils modernes de base comme composer, etc..",[113,5564,5565],{},"Pas de structure MVC.",[113,5567,5568],{},"CMS plus attaqué que les autres. Logique, il est le plus installé.",[113,5570,5571],{},"Non un site WordPress professionnel n'est pas gratuit. Si l'on a besoin de fonctionnalités (cache, sécurité, multilingue). Il faut rapidement payer des plugins.",[113,5573,5574],{},"Non, on ne peut pas tout faire avec WordPress. Comme avec les autres solutions d'ailleurs !",[27,5576,5312],{"id":5577},"wordpress-en-2023-1",[77,5579,5581],{"id":5580},"les-sites-builder","Les sites builder",[32,5583,5584],{},"Un seul conseil : évitez d'utiliser un site builder (autre que Gutenberg). Malgré tout voici quelques chiffres sur Elementor:",[110,5586,5587,5590],{},[113,5588,5589],{},"plus de 5 millions d'installations actives",[113,5591,5592],{},"12% des sites avec CMS, utilisent Elementor",[32,5594,5595],{},"On le voit, il est énormément utilisé, il fait partie du paysage et ils ont une grosse force marketing.\nC'est un outil no-code qui a son utilité pour certaines personnes. Malheureusement, la qualité des sites qui en sortent, quoi qu'en disent les personnes qui l'utilisent, est très moyenne.",[77,5597,5599],{"id":5598},"acf-advanced-custom-field","ACF (Advanced Custom Field)",[32,5601,5602],{},"C'est l'extension indispensable pour tout site WordPress professionnel.",[32,5604,5605],{},"Pour rappel, cela permet de créer des champs custom (pour insérer des valeurs) un peu partout. Dès que vous avez besoin des valeurs personnalisées sur des éléments, ACF vous permet de faire ça.",[32,5607,5608],{},"Évidemment, c'est aussi faisable en programmant. Mais c'est tellement plus simple avec ACF.",[32,5610,5611,5612],{},"Certains développeurs utilisent la partie \"flexible content\" pour créer l'édition des pages. Cela devient de moins en moins pertinent avec Gutenberg. Cela peut être utile pour des utilisations ",[201,5613,5614],{},"headless",[110,5616,5617],{},[113,5618,5619],{},[36,5620,5621],{"href":5621,"rel":5622},"https:\u002F\u002Fwww.advancedcustomfields.com\u002F",[40],[77,5624,5626],{"id":5625},"gutenberg","Gutenberg",[32,5628,5629],{},"Gutenberg est un éditeur de contenu intégré dans WordPress, qui a été introduit dans la version 5.0 de WordPress en décembre 2018.",[32,5631,5632],{},"Avant l'arrivée de Gutenberg, l'éditeur de WordPress était un éditeur de texte simple appelé TinyMCE. Bien que TinyMCE ait été efficace pour créer des articles de blog basiques, il présentait des limitations pour les utilisateurs qui souhaitaient créer des mises en page plus élaborées avec des éléments tels que des colonnes, des images en pleine largeur et des styles personnalisés.",[32,5634,5635],{},"Gutenberg a été développé pour résoudre ce problème en permettant aux utilisateurs de créer des mises en page plus avancées à l'aide de blocs. Les blocs sont des éléments de contenu individuels qui peuvent être déplacés et manipulés pour créer des mises en page uniques. Les utilisateurs peuvent également ajouter des blocs de code personnalisé pour ajouter des fonctionnalités avancées.",[32,5637,5638],{},"Le développement de Gutenberg a commencé en 2017, lorsque l'équipe de WordPress a commencé à travailler sur l'idée d'un nouvel éditeur de contenu pour WordPress. Le développement initial de Gutenberg a été axé sur la création de blocs de base, tels que des blocs de texte, des blocs d'image et des blocs de citation.",[32,5640,5641],{},"Depuis sa sortie en 2018, Gutenberg a été continuellement mis à jour pour ajouter de nouvelles fonctionnalités et améliorer l'expérience utilisateur.",[32,5643,5644],{},"En 2023, il est indispensable de connaître et de savoir coder pour Gutenberg pour tout bon développeur qui travail sur WordPress.",[32,5646,5647],{},"L'éditeur est vraiment agréable à utiliser. Il faut savoir que dans la vision, à terme, il sera (est) utilisable en dehors de WordPress.",[100,5649],{"align":102,"alt":5650,"src":5651},"WordPress Gutenberg","https:\u002F\u002Fdouble-slash.dev\u002Fassets\u002Farticles\u002Fgutenberg.gif",[5421,5653,5655],{"id":5654},"fonctionnement-de-gutenberg","Fonctionnement de Gutenberg",[32,5657,5658,5659,54,5662,715],{},"Gutenberg est basé sur ",[201,5660,5661],{},"React.js",[201,5663,5664],{},"JavaScript",[32,5666,5667],{},"L’éditeur sauve le contenu sous forme de html. Dans ce HTML, il y a des commentaires spéciaux (html) pour identifier les blocs. Coté front, les commentaires ne sont pas rendus. Côté éditeur, Gutenberg parse le html et reconstruit les différents blocs via les commentaires.",[390,5669,5673],{"className":5670,"code":5671,"language":5672,"meta":395,"style":395},"language-html shiki shiki-themes synthwave-84","\u003C!-- wp:heading -->\n\u003Ch2 class=\"wp-block-heading\">Convertir une font ttf en woff2\u003C\u002Fh2>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Nous allons utiliser un outil de compression dont le code source se trouve ici : \u003Ca rel=\"noreferrer noopener\" href=\"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fwoff2\" target=\"_blank\">https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fwoff2\u003C\u002Fa>\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n","html",[117,5674,5675,5680,5710,5715,5719,5724,5779],{"__ignoreMap":395},[399,5676,5677],{"class":401,"line":402},[399,5678,5679],{"class":1137},"\u003C!-- wp:heading -->\n",[399,5681,5682,5685,5687,5690,5693,5696,5699,5702,5705,5707],{"class":401,"line":1141},[399,5683,5684],{"class":4081},"\u003C",[399,5686,27],{"class":4224},[399,5688,4918],{"class":5689},"s8kbb",[399,5691,5692],{"class":4478},"=",[399,5694,5695],{"class":4088},"\"wp-block-heading\"",[399,5697,5698],{"class":4081},">",[399,5700,5701],{"class":4077},"Convertir une font ttf en woff2",[399,5703,5704],{"class":4081},"\u003C\u002F",[399,5706,27],{"class":4224},[399,5708,5709],{"class":4081},">\n",[399,5711,5712],{"class":401,"line":1151},[399,5713,5714],{"class":1137},"\u003C!-- \u002Fwp:heading -->\n",[399,5716,5717],{"class":401,"line":1158},[399,5718,1155],{"emptyLinePlaceholder":1154},[399,5720,5721],{"class":401,"line":1164},[399,5722,5723],{"class":1137},"\u003C!-- wp:paragraph -->\n",[399,5725,5726,5728,5730,5732,5735,5737,5739,5742,5744,5747,5750,5752,5755,5758,5760,5763,5765,5768,5770,5772,5775,5777],{"class":401,"line":1174},[399,5727,5684],{"class":4081},[399,5729,32],{"class":4224},[399,5731,5698],{"class":4081},[399,5733,5734],{"class":4077},"Nous allons utiliser un outil de compression dont le code source se trouve ici : ",[399,5736,5684],{"class":4081},[399,5738,36],{"class":4224},[399,5740,5741],{"class":5689}," rel",[399,5743,5692],{"class":4478},[399,5745,5746],{"class":4088},"\"noreferrer noopener\"",[399,5748,5749],{"class":5689}," href",[399,5751,5692],{"class":4478},[399,5753,5754],{"class":4088},"\"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fwoff2\"",[399,5756,5757],{"class":5689}," target",[399,5759,5692],{"class":4478},[399,5761,5762],{"class":4088},"\"_blank\"",[399,5764,5698],{"class":4081},[399,5766,5767],{"class":4077},"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fwoff2",[399,5769,5704],{"class":4081},[399,5771,36],{"class":4224},[399,5773,5774],{"class":4081},">\u003C\u002F",[399,5776,32],{"class":4224},[399,5778,5709],{"class":4081},[399,5780,5781],{"class":401,"line":1179},[399,5782,5783],{"class":1137},"\u003C!-- \u002Fwp:paragraph -->\n",[32,5785,5786],{},"Les blocs que l'on peut créer soi-même, sont basés sur du JS, React et PHP.",[511,5788,5789],{},[32,5790,5791],{},"À noter, ACF permet de faire des blocs Gutenberg. Pratique pour les allergiques à React :)",[5421,5793,5795],{"id":5794},"les-évolutionsdepuis-le-début","Les évolutions depuis le début",[110,5797,5798,5801,5804],{},[113,5799,5800],{},"Arrivé des patterns (compositions). Des blocs HTML simples. Comme des blocs natifs sans réglages. Plus rapide à créer.",[113,5802,5803],{},"Full Site Editing (comme les pages builder, on peut contrôler les éléments du site avec Gutenberg)",[113,5805,5806,5807],{},"Évolution constante de l'éditeur :",[110,5808,5809,5812,5815],{},[113,5810,5811],{},"interface",[113,5813,5814],{},"vitesse",[113,5816,5817],{},"accessibilité",[5421,5819,5821],{"id":5820},"customisation-des-blocs","Customisation des blocs",[32,5823,5824],{},"Il est possible via des hooks, de customiser des styles de blocs natifs et d'étendre les blocs natifs en ajoutant des propriétés.\nLe bloc query loop peut être aussi modifier. Notamment pour modifier la query spécifiquement au besoin.",[77,5826,5828],{"id":5827},"themejson","Theme.json",[32,5830,5831],{},"Le fichier theme.json a été introduit dans WordPress 5.8, qui est sorti en juillet 2021. Il s'agit donc d'une fonctionnalité relativement nouvelle dans WordPress.",[32,5833,5834],{},"Avant l'introduction de theme.json, ces paramètres étaient souvent dispersés dans le code du thème et pouvaient être difficiles à trouver et à modifier pour les utilisateurs qui n'ont pas de connaissances en développement. Avec theme.json, les paramètres sont centralisés dans un seul fichier, ce qui facilite leur modification.",[32,5836,5837],{},"Le fichier theme.json permet aux développeurs de thèmes de définir des paramètres globaux pour leur thème, tels que les couleurs, les polices et les styles de blocs. Cela peut aider à améliorer la cohérence de la conception et à simplifier la personnalisation du thème pour les utilisateurs.",[32,5839,5840],{},"Le système est très bien conçu car il génère principalement des variables CSS et il permet d'avoir une cohérence entre la partie back (édition) et la partie front du site.",[32,5842,5843],{},"On peut également gérer les polices via le theme.json avec la Font API.",[32,5845,5846],{},"Il est nécessaire en 2023 de l'utiliser et de le maîtriser. Et c'est compatible avec l'ancien système de template. Pas que FSE.",[77,5848,5850],{"id":5849},"fse-ful-site-editing","FSE (Ful site editing)",[32,5852,5853],{},"Le Full Site Editing (FSE) est une nouvelle fonctionnalité de WordPress qui permet aux utilisateurs de créer et de personnaliser des sites Web entiers, y compris les en-têtes, les pieds de page et les modèles de pages, à l'aide de l'éditeur de blocs de WordPress.\nPremière chose, avec le FSE, plus de code HTML et PHP mélangé. Les templates sont faits uniquement avec du HTML.",[32,5855,5856],{},"C'est un changement de modèle mental pour les concepteurs de site. Ce n'est donc pas toujours facile de débuter avec le FSE.",[32,5858,5859],{},"On dispose de blocs spéciaux, comme le bloc query, qui permet d'afficher des listes sans devoir coder le moindre code PHP.",[32,5861,5862],{},"Le côté moins cool, c'est que cela donne le contrôle sur des éléments sur lesquels normalement le client ne peut pas toucher.",[32,5864,5865],{},"Le FSE est toujours affiché en bêta mais il est désormais nécessaire de comprendre le fonctionnement pour tout développeur professionnel.",[77,5867,5868],{"id":5614},"Headless",[32,5870,5871],{},"On peut utiliser WordPress en mode Headless. Soit pour développer une API, soit pour utiliser un système du type Astro, Next.js.\nDéjà l'API Rest de base est utilisable. Ensuite, vous pouvez étendre cette API et ajouter des routes.",[32,5873,5874],{},"Ensuite, il est possible de faire du GraphQL avec l'extension WPGraphQL.",[32,5876,5877],{},"Très clairement, WordPress peut être une option viable pour une API Headless. Et pas que pour un site classique.",[32,5879,5880],{},"Les plugins utiles :",[110,5882,5883,5890,5897,5904,5911,5918],{},[113,5884,5885],{},[36,5886,5889],{"href":5887,"rel":5888},"https:\u002F\u002Fwww.wpgraphql.com\u002F",[40],"WPGraphQL",[113,5891,5892],{},[36,5893,5896],{"href":5894,"rel":5895},"https:\u002F\u002Fgithub.com\u002Fwp-graphql\u002Fwp-graphql-smart-cache",[40],"WPGraphQL Smart cache",[113,5898,5899],{},[36,5900,5903],{"href":5901,"rel":5902},"https:\u002F\u002Fstellate.co\u002Fdocs\u002Fintegrations\u002Fwordpress-plugin",[40],"Stellate",[113,5905,5906],{},[36,5907,5910],{"href":5908,"rel":5909},"https:\u002F\u002Fcloudinary.com\u002Fdocumentation\u002Fwordpress_integration",[40],"Cloudinary",[113,5912,5913],{},[36,5914,5917],{"href":5915,"rel":5916},"https:\u002F\u002Ffaustjs.org\u002F",[40],"FaustJS",[113,5919,5920],{},"...",[77,5922,5924],{"id":5923},"wordpress-en-mode-dev-moderne","WordPress en mode dev moderne",[32,5926,5927],{},"Pour les développeurs habitués a utiliser composer et qui aime déployer automatiquement, il existe des outils pour ça.",[110,5929,5930,5938,5946,5954,5962,5970],{},[113,5931,5932,5933,715],{},"Pour utiliser Twig au niveau des templates, il existe ",[36,5934,5937],{"href":5935,"rel":5936},"https:\u002F\u002Ffr.wordpress.org\u002Fplugins\u002Ftimber-library\u002F",[40],"Timber",[113,5939,5940,5941,715],{},"Pour avoir une structure plus moderne et les dépendances avec composer : ",[36,5942,5945],{"href":5943,"rel":5944},"https:\u002F\u002Froots.io\u002Fbedrock\u002F",[40],"Bedrock",[113,5947,5948,5949],{},"Avoir Timber et Bedrock : ",[36,5950,5953],{"href":5951,"rel":5952},"https:\u002F\u002Flumberjack.rareloop.com\u002F",[40],"Lumberjack",[113,5955,5956,5957],{},"Utiliser la puissance de Laravel dans WordPress : ",[36,5958,5961],{"href":5959,"rel":5960},"https:\u002F\u002Froots.io\u002Facorn\u002F",[40],"Acorn",[113,5963,5964,5965],{},"Utiliser Blade (templating Laravel) : ",[36,5966,5969],{"href":5967,"rel":5968},"https:\u002F\u002Froots.io\u002Fsage\u002F",[40],"Sage",[113,5971,5972,5973,5977],{},"Pour deployer : ",[36,5974,5975],{"href":5975,"rel":5976},"https:\u002F\u002Fbuddy.works\u002F",[40]," Pas forcement WordPress mai tellement simple à utiliser.",[77,5979,5981],{"id":5980},"commander-wordpress-en-ligne-de-commande","Commander WordPress en ligne de commande",[32,5983,5984,5985,5990],{},"Système super pratique pour tout un tas de chose, ",[36,5986,5989],{"href":5987,"rel":5988},"https:\u002F\u002Fwp-cli.org\u002Ffr\u002F",[40],"wp-cli"," est un script qui permet d'effectuer des taches en ligne de commande. Créer des utilisateurs, installer WordPress, installer des plugins, etc..",[32,5992,5993],{},"Évidemment, on peut étendre les commandes pour son propre besoin.",[77,5995,5997],{"id":5996},"développer-en-local","Développer en local",[32,5999,6000],{},"En local, pour développer, certains utilisent Docker avec un système du type Bedrock et construisent eux-mêmes  la config.",[32,6002,6003],{},"Pour éviter les configs, il existe des tools qui facilitent la création d'environnements virtuels :",[110,6005,6006,6017],{},[113,6007,6008,6013,6014],{},[36,6009,6012],{"href":6010,"rel":6011},"https:\u002F\u002Fddev.readthedocs.io\u002Fen\u002Flatest\u002Fusers\u002Fquickstart\u002F",[40],"DDev"," ",[201,6015,6016],{},"mon favori",[113,6018,6019],{},[36,6020,6023],{"href":6021,"rel":6022},"https:\u002F\u002Froots.io\u002Ftrellis",[40],"Trellis",[32,6025,6026],{},"Mais vous avez également des outils super pratiques avec une interface :",[110,6028,6029,6036],{},[113,6030,6031],{},[36,6032,6035],{"href":6033,"rel":6034},"https:\u002F\u002Flocalwp.com\u002F",[40],"Local by Flywheel",[113,6037,6038],{},[36,6039,6042],{"href":6040,"rel":6041},"https:\u002F\u002Fkinsta.com\u002Ffr\u002Fdevkinsta\u002F",[40],"DevKinsta",[77,6044,6046],{"id":6045},"gestion-dun-parc-de-site","Gestion d'un parc de site",[32,6048,6049],{},"Si vous avez plusieurs sites à gérer, il peut devenir fastidieux de passer sur tous les sites pour effectuer les mises à jour, etc..\nÉvidemment, il existe des outils pour ça.",[32,6051,6052,6053,6058],{},"Petit favori parce que récent et français, ",[36,6054,6057],{"href":6055,"rel":6056},"https:\u002F\u002Fwp-umbrella.com\u002Ffr\u002F",[40],"WP Umbrella"," permet de gérer un site WordPress à distance, d'effectuer les updates, des backups, etc..",[32,6060,6061],{},"D'autres outils :",[110,6063,6064,6071],{},[113,6065,6066],{},[36,6067,6070],{"href":6068,"rel":6069},"https:\u002F\u002Fmainwp.com\u002F",[40],"Main WP",[113,6072,6073],{},[36,6074,6077],{"href":6075,"rel":6076},"https:\u002F\u002Fmanagewp.com\u002F",[40],"Manage WP",[27,6079,6081],{"id":6080},"starter-theme","Starter theme",[32,6083,6084,6085,1273,6088,1273,6091,6094,6095],{},"Un starter thème est disponible pour développer vos propres thèmes.\nIl utilise ",[201,6086,6087],{},"vite.js",[201,6089,6090],{},"Post CSS",[201,6092,6093],{},"Tailwind CSS",".\nPlus d'infos sur la doc du projet : ",[36,6096,6097],{"href":6097,"rel":6098},"https:\u002F\u002Fpresswind-doc.wp-performance.com\u002F",[40],[32,6100,6101,6102],{},"Greg Sullivan a également développé un thème qui utilise Tailwind CSS, il est disponible ici : ",[36,6103,6104],{"href":6104,"rel":6105},"https:\u002F\u002Funderscoretw.com\u002F",[40],[27,6107,1246],{"id":1245},[32,6109,6110],{},"En 2023, WordPress reste une solution très utilisée pour concevoir des sites.",[32,6112,6113],{},[201,6114,6115],{},"Que l'on aime ou qu’on aime pas, WordPress fait partie du game.",[32,6117,6118],{},"WordPress est un outil qui peut correspondre à pas mal de projet. De plus, il bénéficie d'une communauté très active, toujours prête à aider.",[32,6120,6121,6122,6127,6128,715],{},"Pour ma part, étant donné que l'on ne peut pas lutter contre l’hégémonie de plate-forme, j'ai décidé de diffuser les bonnes pratiques pour essayer de faire remonter la qualité globale des sites WordPress via des vidéos et des exemples. Tout est dispo sur  le site ",[36,6123,6126],{"href":6124,"rel":6125},"https:\u002F\u002Fwp-performance.com\u002F",[40],"wp-performance"," ou le repo ",[36,6129,6132],{"href":6130,"rel":6131},"https:\u002F\u002Fgithub.com\u002FWP-Performance",[40],"GitHub",[1284,6134,6135],{},"html pre.shiki code .sjThu, html code.shiki .sjThu{--shiki-default:#848BBD;--shiki-default-font-style:italic}html pre.shiki code .sgRlq, html code.shiki .sgRlq{--shiki-default:#36F9F6}html pre.shiki code .sfE7D, html code.shiki .sfE7D{--shiki-default:#72F1B8}html pre.shiki code .s8kbb, html code.shiki .s8kbb{--shiki-default:#FEDE5D;--shiki-default-font-style:italic}html pre.shiki code .s2hdG, html code.shiki .s2hdG{--shiki-default:#B6B1B1}html pre.shiki code .sFl1-, html code.shiki .sFl1-{--shiki-default:#FF8B39}html pre.shiki code .sW278, html code.shiki .sW278{--shiki-default:#FFFFFFEE}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":395,"searchDepth":1141,"depth":1141,"links":6137},[6138,6142,6145,6146,6158,6159],{"id":5338,"depth":1141,"text":5339,"children":6139},[6140,6141],{"id":5342,"depth":1151,"text":5343},{"id":5388,"depth":1151,"text":5389},{"id":5414,"depth":1141,"text":5415,"children":6143},[6144],{"id":5418,"depth":1151,"text":5419},{"id":5541,"depth":1141,"text":5542},{"id":5577,"depth":1141,"text":5312,"children":6147},[6148,6149,6150,6151,6152,6153,6154,6155,6156,6157],{"id":5580,"depth":1151,"text":5581},{"id":5598,"depth":1151,"text":5599},{"id":5625,"depth":1151,"text":5626},{"id":5827,"depth":1151,"text":5828},{"id":5849,"depth":1151,"text":5850},{"id":5614,"depth":1151,"text":5868},{"id":5923,"depth":1151,"text":5924},{"id":5980,"depth":1151,"text":5981},{"id":5996,"depth":1151,"text":5997},{"id":6045,"depth":1151,"text":6046},{"id":6080,"depth":1141,"text":6081},{"id":1245,"depth":1141,"text":1246},"WordPress fêtera ses 20 ans le 27 mai de cette année ! Oui, 20 ans déjà ! Bon nombre de CMS aussi anciens que lui ont rejoint le cimetière des CMS depuis bien longtemps. WordPress, quand a lui, est toujours présent. Et bien présent ! Il évolue toujours et sa part de marché ne fait qu'augmenter.",{},"\u002Farticles\u002Fwordpress-2023","2023-03-08",{"title":5293,"description":6160},"articles\u002Fwordpress-2023","oCvoiOnIN6Rwdv5_Px3XkvPeWGlBqCnk4un80ycDAm4",{"id":6168,"title":6169,"author":6170,"body":6171,"description":7456,"extension":1324,"meta":7457,"navigation":1154,"path":7458,"publicationDate":7459,"seo":7460,"stem":7461,"__hash__":7462},"articles\u002Farticles\u002Fnext-js-13-app.md","Next.js 13, on fait le point de la nouvelle structure \"app\" (3\u002F3)",{"name":21,"url":22},{"type":24,"value":6172,"toc":7437},[6173,6192,6203,6206,6213,6217,6221,6235,6238,6246,6253,6256,6452,6457,6721,6732,6739,6742,6924,6927,6937,6941,6954,6957,6960,6963,6974,7115,7123,7127,7132,7146,7156,7159,7163,7184,7215,7218,7222,7232,7239,7242,7246,7257,7284,7292,7296,7299,7303,7306,7309,7313,7319,7323,7329,7351,7355,7358,7382,7392,7396,7403,7407,7410,7413,7416,7434],[511,6174,6175,6178],{"type":5299},[32,6176,6177],{},"Cet article fait partie d'une série de 3 articles :",[110,6179,6180,6186],{},[113,6181,6182],{},[36,6183,6185],{"href":6184},"\u002Farticles\u002Fnext-js-13-intro\u002F","Next.js 13, introduction (1\u002F3)",[113,6187,6188],{},[36,6189,6191],{"href":6190},"\u002Farticles\u002Fnext-js-13-pages\u002F","Next.js 13, pourquoi il était nécessaire d'évoluer (2\u002F3)",[32,6193,6194,6195,6198,6199,6202],{},"Ce deuxième article se concentre sur la nouvelle structure de ",[201,6196,6197],{},"Next.js"," via de dossier ",[201,6200,6201],{},"\"app\"",". Nous regarderons ensemble ce que cela change et nous allons surtout vérifier si nos applications continueront à fonctionner de la même façon avec cette nouvelle version.",[32,6204,6205],{},"Une vidéo est liée à cet article, disponible ci-dessous.",[27,6207,6209,6210],{"id":6208},"nextjs-13-on-fait-le-point-de-la-nouvelle-structure-app-22","Next.js 13, on fait le point de la nouvelle structure \"app\" ",[399,6211,6212],{},"2\u002F2",[72,6214],{"videoLink":6215,"videoTitle":6216},"Q_mEE0KRvLI","Next.js 13, on fait le point de la nouvelle structure \"app\" [2\u002F2]",[27,6218,6220],{"id":6219},"react-server-component","React Server Component",[32,6222,6223,6224,6227,6228,6231,6232,6234],{},"La nouvelle structure \"app\" de ",[201,6225,6226],{},"Next.js 13"," est entièrement basé sur les ",[201,6229,6230],{},"server components",".\nTous les components sont des ",[201,6233,6230],{}," par défaut.",[32,6236,6237],{},"Mais c'est quoi un server components ?",[32,6239,6240,6241],{},"Pour simplifier, ce sont des components générés par le serveur. Ils ne sont pas inclus dans le bundle de l'application envoyé au navigateur. Ils peuvent s'auto-remplacer dans l'arbre des components sans perdre l'état.\n",[36,6242,6245],{"href":6243,"rel":6244},"https:\u002F\u002Fnews.ycombinator.com\u002Fitem?id=25499171",[40],"Une explication de la part de Dan Abramov",[32,6247,6248,6249,6252],{},"Si on utilise une majorité de ",[201,6250,6251],{},"server component"," dans son app, le poids du bundle se réduit considérablement.",[32,6254,6255],{},"Exemple de format d'un server component :",[390,6257,6261],{"className":6258,"code":6259,"language":6260,"meta":395,"style":395},"language-js shiki shiki-themes synthwave-84","J0:[[[\"\",{\"children\":[\"blog\",{\"children\":[[\"params\",\"948D24C5-725A-2046-19E5-E21F59C6D815\",\"oc\"],\n{\"children\":[\"\",{}]}]}]},null,null,true],\"@1\",[[\"$\",\"title\",null,{\"children\":\"Create Next App\"}],\n[\"$\",\"meta\",null,{\"content\":\"width=device-width, initial-scale=1\",\"name\":\"viewport\"}], ... enim nisl elementum purus, accumsan interdum libero dui nec ipsum.\"}]]\n","js",[117,6262,6263,6314,6375],{"__ignoreMap":395},[399,6264,6265,6268,6271,6274,6277,6280,6282,6285,6288,6290,6292,6294,6297,6300,6303,6306,6308,6311],{"class":401,"line":402},[399,6266,6267],{"class":405},"J0",[399,6269,6270],{"class":409},":[[[",[399,6272,6273],{"class":4088},"\"\"",[399,6275,6276],{"class":409},",{",[399,6278,6279],{"class":4088},"\"children\"",[399,6281,4479],{"class":4478},[399,6283,6284],{"class":409},"[",[399,6286,6287],{"class":4088},"\"blog\"",[399,6289,6276],{"class":409},[399,6291,6279],{"class":4088},[399,6293,4479],{"class":4478},[399,6295,6296],{"class":409},"[[",[399,6298,6299],{"class":4088},"\"params\"",[399,6301,6302],{"class":409},",",[399,6304,6305],{"class":4088},"\"948D24C5-725A-2046-19E5-E21F59C6D815\"",[399,6307,6302],{"class":409},[399,6309,6310],{"class":4088},"\"oc\"",[399,6312,6313],{"class":409},"],\n",[399,6315,6316,6319,6321,6323,6325,6327,6330,6333,6335,6337,6339,6342,6345,6348,6351,6354,6356,6359,6361,6363,6365,6367,6369,6372],{"class":401,"line":1141},[399,6317,6318],{"class":409},"{",[399,6320,6279],{"class":4088},[399,6322,4479],{"class":4478},[399,6324,6284],{"class":409},[399,6326,6273],{"class":4088},[399,6328,6329],{"class":409},",{}]}]}]},",[399,6331,6332],{"class":1110},"null",[399,6334,6302],{"class":409},[399,6336,6332],{"class":1110},[399,6338,6302],{"class":409},[399,6340,6341],{"class":1110},"true",[399,6343,6344],{"class":409},"],",[399,6346,6347],{"class":4088},"\"@1\"",[399,6349,6350],{"class":409},",[[",[399,6352,6353],{"class":4088},"\"$\"",[399,6355,6302],{"class":409},[399,6357,6358],{"class":4088},"\"title\"",[399,6360,6302],{"class":409},[399,6362,6332],{"class":1110},[399,6364,6276],{"class":409},[399,6366,6279],{"class":4088},[399,6368,4479],{"class":4478},[399,6370,6371],{"class":4088},"\"Create Next App\"",[399,6373,6374],{"class":409},"}],\n",[399,6376,6377,6379,6381,6383,6386,6388,6390,6392,6395,6397,6400,6402,6405,6407,6410,6413,6415,6418,6421,6424,6427,6429,6432,6435,6438,6441,6444,6447,6449],{"class":401,"line":1151},[399,6378,6284],{"class":409},[399,6380,6353],{"class":4088},[399,6382,6302],{"class":409},[399,6384,6385],{"class":4088},"\"meta\"",[399,6387,6302],{"class":409},[399,6389,6332],{"class":1110},[399,6391,6276],{"class":409},[399,6393,6394],{"class":4088},"\"content\"",[399,6396,4479],{"class":4478},[399,6398,6399],{"class":4088},"\"width=device-width, initial-scale=1\"",[399,6401,6302],{"class":409},[399,6403,6404],{"class":4088},"\"name\"",[399,6406,4479],{"class":4478},[399,6408,6409],{"class":4088},"\"viewport\"",[399,6411,6412],{"class":409},"}], ",[399,6414,5920],{"class":1117},[399,6416,6417],{"class":4073}," enim",[399,6419,6420],{"class":4073}," nisl",[399,6422,6423],{"class":4073}," elementum",[399,6425,6426],{"class":4073}," purus",[399,6428,1273],{"class":409},[399,6430,6431],{"class":4073},"accumsan",[399,6433,6434],{"class":4073}," interdum",[399,6436,6437],{"class":4073}," libero",[399,6439,6440],{"class":4073}," dui",[399,6442,6443],{"class":4073}," nec",[399,6445,6446],{"class":4073}," ipsum",[399,6448,715],{"class":409},[399,6450,6451],{"class":4088},"\"}]]\n",[32,6453,6454],{},[201,6455,6456],{},"Autre avantage des server components, nous pouvons faire des requêtes à l'intérieur des components. Puisque nous sommes cotés serveur \\o\u002F.",[390,6458,6460],{"className":6258,"code":6459,"language":6260,"meta":395,"style":395},"async function getPost(id) {\n  const res = await fetch(`http:\u002F\u002Flocalhost:3000\u002Fapi\u002FgetPost?id=${id}`)\n  return res.json()\n}\n\nexport default async function Post({ params }) {\n  const [id] = params.params || []\n  const post = await getPost(id)\n  if (!post) {\n    notFound()\n  }\n  return (\n    \u003C>\n      \u003Ch1 className=\"my-8 text-3xl font-bold\">{post?.title}\u003C\u002Fh1>\n      \u003Cp className=\"text-gray-600\">{post?.body}\u003C\u002Fp>\n    \u003C\u002F>\n  )\n}\n",[117,6461,6462,6480,6511,6524,6528,6532,6554,6581,6600,6614,6621,6625,6632,6637,6672,6704,6710,6716],{"__ignoreMap":395},[399,6463,6464,6467,6470,6473,6475,6478],{"class":401,"line":402},[399,6465,6466],{"class":1117},"async",[399,6468,6469],{"class":1117}," function",[399,6471,6472],{"class":4081}," getPost",[399,6474,4085],{"class":409},[399,6476,6477],{"class":4144},"id",[399,6479,4529],{"class":409},[399,6481,6482,6485,6488,6490,6493,6496,6498,6501,6503,6505,6507,6509],{"class":401,"line":1141},[399,6483,6484],{"class":1117},"  const",[399,6486,6487],{"class":4073}," res",[399,6489,4078],{"class":4077},[399,6491,6492],{"class":1117}," await",[399,6494,6495],{"class":4081}," fetch",[399,6497,4085],{"class":409},[399,6499,6500],{"class":4088},"`http:\u002F\u002Flocalhost:3000\u002Fapi\u002FgetPost?id=",[399,6502,4225],{"class":4224},[399,6504,6477],{"class":4073},[399,6506,4230],{"class":4224},[399,6508,4233],{"class":4088},[399,6510,4092],{"class":409},[399,6512,6513,6515,6517,6519,6522],{"class":401,"line":1151},[399,6514,4837],{"class":1117},[399,6516,6487],{"class":4073},[399,6518,715],{"class":409},[399,6520,6521],{"class":4081},"json",[399,6523,4106],{"class":409},[399,6525,6526],{"class":401,"line":1158},[399,6527,4957],{"class":409},[399,6529,6530],{"class":401,"line":1164},[399,6531,1155],{"emptyLinePlaceholder":1154},[399,6533,6534,6536,6538,6541,6543,6546,6548,6551],{"class":401,"line":1174},[399,6535,4764],{"class":4224},[399,6537,4767],{"class":1117},[399,6539,6540],{"class":1117}," async",[399,6542,6469],{"class":1117},[399,6544,6545],{"class":4081}," Post",[399,6547,4541],{"class":409},[399,6549,6550],{"class":4144},"params",[399,6552,6553],{"class":409}," }) {\n",[399,6555,6556,6558,6561,6563,6566,6568,6571,6573,6575,6578],{"class":401,"line":1179},[399,6557,6484],{"class":1117},[399,6559,6560],{"class":409}," [",[399,6562,6477],{"class":4073},[399,6564,6565],{"class":409},"] ",[399,6567,5692],{"class":4077},[399,6569,6570],{"class":4073}," params",[399,6572,715],{"class":409},[399,6574,6550],{"class":4118},[399,6576,6577],{"class":1117}," ||",[399,6579,6580],{"class":409}," []\n",[399,6582,6583,6585,6588,6590,6592,6594,6596,6598],{"class":401,"line":1185},[399,6584,6484],{"class":1117},[399,6586,6587],{"class":4073}," post",[399,6589,4078],{"class":4077},[399,6591,6492],{"class":1117},[399,6593,6472],{"class":4081},[399,6595,4085],{"class":409},[399,6597,6477],{"class":4073},[399,6599,4092],{"class":409},[399,6601,6602,6604,6606,6609,6612],{"class":401,"line":1195},[399,6603,4598],{"class":1117},[399,6605,4518],{"class":409},[399,6607,6608],{"class":1117},"!",[399,6610,6611],{"class":4073},"post",[399,6613,4529],{"class":409},[399,6615,6616,6619],{"class":401,"line":1200},[399,6617,6618],{"class":4081},"    notFound",[399,6620,4106],{"class":409},[399,6622,6623],{"class":401,"line":1206},[399,6624,4649],{"class":409},[399,6626,6627,6629],{"class":401,"line":4607},[399,6628,4837],{"class":1117},[399,6630,6631],{"class":409}," (\n",[399,6633,6634],{"class":401,"line":4628},[399,6635,6636],{"class":4081},"    \u003C>\n",[399,6638,6639,6642,6644,6647,6649,6652,6654,6656,6658,6661,6664,6666,6668,6670],{"class":401,"line":4646},[399,6640,6641],{"class":4081},"      \u003C",[399,6643,5309],{"class":4224},[399,6645,6646],{"class":1117}," className",[399,6648,5692],{"class":4077},[399,6650,6651],{"class":4088},"\"my-8 text-3xl font-bold\"",[399,6653,5698],{"class":4081},[399,6655,6318],{"class":1117},[399,6657,6611],{"class":4073},[399,6659,6660],{"class":409},"?.",[399,6662,6663],{"class":4118},"title",[399,6665,4230],{"class":1117},[399,6667,5704],{"class":4081},[399,6669,5309],{"class":4224},[399,6671,5709],{"class":4081},[399,6673,6674,6676,6678,6680,6682,6685,6687,6689,6691,6693,6696,6698,6700,6702],{"class":401,"line":4652},[399,6675,6641],{"class":4081},[399,6677,32],{"class":4224},[399,6679,6646],{"class":1117},[399,6681,5692],{"class":4077},[399,6683,6684],{"class":4088},"\"text-gray-600\"",[399,6686,5698],{"class":4081},[399,6688,6318],{"class":1117},[399,6690,6611],{"class":4073},[399,6692,6660],{"class":409},[399,6694,6695],{"class":4118},"body",[399,6697,4230],{"class":1117},[399,6699,5704],{"class":4081},[399,6701,32],{"class":4224},[399,6703,5709],{"class":4081},[399,6705,6707],{"class":401,"line":6706},16,[399,6708,6709],{"class":4081},"    \u003C\u002F>\n",[399,6711,6713],{"class":401,"line":6712},17,[399,6714,6715],{"class":409},"  )\n",[399,6717,6719],{"class":401,"line":6718},18,[399,6720,4957],{"class":409},[32,6722,6723,6724,6727,6728,6731],{},"Par contre, les server components ont une petite limitation.\nOn ne peut pas utiliser des ",[201,6725,6726],{},"hooks"," (useState, useEffect...) ou des ",[201,6729,6730],{},"événements"," à l'intérieur.",[390,6733,6737],{"className":6734,"code":6736,"language":4747},[6735],"language-text","Error: Event handlers cannot be passed to Client Component props.\n  \u003Cli onClick={function} children={{...}}>\n              ^^^^^^^^^^\nIf you need interactivity, consider converting part of this to a Client Component.\n",[117,6738,6736],{"__ignoreMap":395},[32,6740,6741],{},"Dans le cas, où l'on a besoin d'interactivité dans un component, nous devons le passer en mode \"client\" avec une déclaration en haut du fichier :",[390,6743,6745],{"className":6258,"code":6744,"language":6260,"meta":395,"style":395},"'use client'\n\nimport { useState } from 'react'\n\nexport default function Counter() {\n  const [count, setCount] = useState(0)\n  return (\n    \u003Cdiv>\n      \u003Cp>You clicked {count} times\u003C\u002Fp>\n      \u003Cbutton onClick={() => setCount(count + 1)}>Click me\u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n  )\n}\n",[117,6746,6747,6752,6756,6772,6776,6790,6818,6824,6834,6860,6907,6916,6920],{"__ignoreMap":395},[399,6748,6749],{"class":401,"line":402},[399,6750,6751],{"class":4088},"'use client'\n",[399,6753,6754],{"class":401,"line":1141},[399,6755,1155],{"emptyLinePlaceholder":1154},[399,6757,6758,6760,6762,6765,6767,6769],{"class":401,"line":1151},[399,6759,4297],{"class":4224},[399,6761,4300],{"class":409},[399,6763,6764],{"class":4073},"useState",[399,6766,4316],{"class":409},[399,6768,4319],{"class":1117},[399,6770,6771],{"class":4088}," 'react'\n",[399,6773,6774],{"class":401,"line":1158},[399,6775,1155],{"emptyLinePlaceholder":1154},[399,6777,6778,6780,6782,6784,6787],{"class":401,"line":1164},[399,6779,4764],{"class":4224},[399,6781,4767],{"class":1117},[399,6783,6469],{"class":1117},[399,6785,6786],{"class":4081}," Counter",[399,6788,6789],{"class":409},"() {\n",[399,6791,6792,6794,6796,6799,6801,6804,6806,6808,6811,6813,6816],{"class":401,"line":1174},[399,6793,6484],{"class":1117},[399,6795,6560],{"class":409},[399,6797,6798],{"class":4073},"count",[399,6800,1273],{"class":409},[399,6802,6803],{"class":4073},"setCount",[399,6805,6565],{"class":409},[399,6807,5692],{"class":4077},[399,6809,6810],{"class":4081}," useState",[399,6812,4085],{"class":409},[399,6814,6815],{"class":4118},"0",[399,6817,4092],{"class":409},[399,6819,6820,6822],{"class":401,"line":1179},[399,6821,4837],{"class":1117},[399,6823,6631],{"class":409},[399,6825,6826,6829,6832],{"class":401,"line":1185},[399,6827,6828],{"class":4081},"    \u003C",[399,6830,6831],{"class":4224},"div",[399,6833,5709],{"class":4081},[399,6835,6836,6838,6840,6842,6845,6847,6849,6851,6854,6856,6858],{"class":401,"line":1195},[399,6837,6641],{"class":4081},[399,6839,32],{"class":4224},[399,6841,5698],{"class":4081},[399,6843,6844],{"class":409},"You clicked ",[399,6846,6318],{"class":1117},[399,6848,6798],{"class":4073},[399,6850,4230],{"class":1117},[399,6852,6853],{"class":409}," times",[399,6855,5704],{"class":4081},[399,6857,32],{"class":4224},[399,6859,5709],{"class":4081},[399,6861,6862,6864,6867,6870,6872,6874,6877,6879,6882,6884,6886,6889,6892,6894,6896,6898,6901,6903,6905],{"class":401,"line":1200},[399,6863,6641],{"class":4081},[399,6865,6866],{"class":4224},"button",[399,6868,6869],{"class":1117}," onClick",[399,6871,5692],{"class":4077},[399,6873,6318],{"class":1117},[399,6875,6876],{"class":409},"() ",[399,6878,4156],{"class":1117},[399,6880,6881],{"class":4081}," setCount",[399,6883,4085],{"class":409},[399,6885,6798],{"class":4073},[399,6887,6888],{"class":1117}," +",[399,6890,6891],{"class":4118}," 1",[399,6893,2123],{"class":409},[399,6895,4230],{"class":1117},[399,6897,5698],{"class":4081},[399,6899,6900],{"class":409},"Click me",[399,6902,5704],{"class":4081},[399,6904,6866],{"class":4224},[399,6906,5709],{"class":4081},[399,6908,6909,6912,6914],{"class":401,"line":1206},[399,6910,6911],{"class":4081},"    \u003C\u002F",[399,6913,6831],{"class":4224},[399,6915,5709],{"class":4081},[399,6917,6918],{"class":401,"line":4607},[399,6919,6715],{"class":409},[399,6921,6922],{"class":401,"line":4628},[399,6923,4957],{"class":409},[32,6925,6926],{},"Vous l'avez compris, le fonctionnement pousse à réduire la taille du JavaScript envoyé dans le navigateur.",[511,6928,6929],{},[32,6930,6931,6932],{},"Cette particularité risque d'être un peu compliquée au début à prendre en main. Notamment sur les dépendances externes : ",[36,6933,6936],{"href":6934,"rel":6935},"https:\u002F\u002Fbeta.nextjs.org\u002Fdocs\u002Frendering\u002Fserver-and-client-components#third-party-packages%3E",[40],"third-party-packages",[27,6938,6940],{"id":6939},"le-streaming-ou-rendu-incrémental","Le streaming ou rendu incrémental",[32,6942,6943,6944,6947,6948,707,6951,715],{},"Nouveauté également qui nous vient directement de l'API ",[201,6945,6946],{},"React 18",". Le rendu ",[201,6949,6950],{},"streaming",[201,6952,6953],{},"rendu incrémental",[32,6955,6956],{},"Votre interface est rendue progressivement. Les components apparaissent au fur et à mesure qu'ils sont disponibles sans attendre. En premier les components sans data (juste HTML) et ensuite les autres qui ont nécessité des requêtes.",[32,6958,6959],{},"Attention, notez bien que c'est un rendu serveur. Toutes les data sont dans le code source de la page.",[32,6961,6962],{},"Pour mettre en place le streaming, il faut :",[110,6964,6965,6971],{},[113,6966,6967,6968],{},"soit créer le fichier ",[117,6969,6970],{},"loading.[js|tsx|jsx]",[113,6972,6973],{},"soit utiliser directement Suspense dans le component.",[390,6975,6977],{"className":6258,"code":6976,"language":6260,"meta":395,"style":395},"import { Suspense } from \"react\";\nimport { PostFeed } from \".\u002FComponents\";\n\nexport default function Posts() {\n  return (\n    \u003Csection>\n      \u003CSuspense fallback={\u003Cp>Loading feed...\u003C\u002Fp>}>\n        \u003CPostFeed \u002F>\n      \u003C\u002FSuspense>\n    \u003C\u002Fsection>\n  );\n}\n",[117,6978,6979,6997,7015,7019,7032,7038,7047,7079,7089,7098,7106,7111],{"__ignoreMap":395},[399,6980,6981,6983,6985,6988,6990,6992,6995],{"class":401,"line":402},[399,6982,4297],{"class":4224},[399,6984,4300],{"class":409},[399,6986,6987],{"class":4073},"Suspense",[399,6989,4316],{"class":409},[399,6991,4319],{"class":1117},[399,6993,6994],{"class":4088}," \"react\"",[399,6996,4325],{"class":409},[399,6998,6999,7001,7003,7006,7008,7010,7013],{"class":401,"line":1141},[399,7000,4297],{"class":4224},[399,7002,4300],{"class":409},[399,7004,7005],{"class":4073},"PostFeed",[399,7007,4316],{"class":409},[399,7009,4319],{"class":1117},[399,7011,7012],{"class":4088}," \".\u002FComponents\"",[399,7014,4325],{"class":409},[399,7016,7017],{"class":401,"line":1151},[399,7018,1155],{"emptyLinePlaceholder":1154},[399,7020,7021,7023,7025,7027,7030],{"class":401,"line":1158},[399,7022,4764],{"class":4224},[399,7024,4767],{"class":1117},[399,7026,6469],{"class":1117},[399,7028,7029],{"class":4081}," Posts",[399,7031,6789],{"class":409},[399,7033,7034,7036],{"class":401,"line":1164},[399,7035,4837],{"class":1117},[399,7037,6631],{"class":409},[399,7039,7040,7042,7045],{"class":401,"line":1174},[399,7041,6828],{"class":4081},[399,7043,7044],{"class":4224},"section",[399,7046,5709],{"class":4081},[399,7048,7049,7051,7053,7056,7058,7060,7062,7064,7066,7069,7071,7073,7075,7077],{"class":401,"line":1179},[399,7050,6641],{"class":4081},[399,7052,6987],{"class":405},[399,7054,7055],{"class":1117}," fallback",[399,7057,5692],{"class":4077},[399,7059,6318],{"class":1117},[399,7061,5684],{"class":4081},[399,7063,32],{"class":4224},[399,7065,5698],{"class":4081},[399,7067,7068],{"class":409},"Loading feed...",[399,7070,5704],{"class":4081},[399,7072,32],{"class":4224},[399,7074,5698],{"class":4081},[399,7076,4230],{"class":1117},[399,7078,5709],{"class":4081},[399,7080,7081,7084,7086],{"class":401,"line":1185},[399,7082,7083],{"class":4081},"        \u003C",[399,7085,7005],{"class":405},[399,7087,7088],{"class":4081}," \u002F>\n",[399,7090,7091,7094,7096],{"class":401,"line":1195},[399,7092,7093],{"class":4081},"      \u003C\u002F",[399,7095,6987],{"class":405},[399,7097,5709],{"class":4081},[399,7099,7100,7102,7104],{"class":401,"line":1200},[399,7101,6911],{"class":4081},[399,7103,7044],{"class":4224},[399,7105,5709],{"class":4081},[399,7107,7108],{"class":401,"line":1206},[399,7109,7110],{"class":409},"  );\n",[399,7112,7113],{"class":401,"line":4607},[399,7114,4957],{"class":409},[32,7116,7117,7118],{},"Plus d'infos : ",[36,7119,7122],{"href":7120,"rel":7121},"https:\u002F\u002Fbeta.nextjs.org\u002Fdocs\u002Fdata-fetching\u002Fstreaming-and-suspense",[40],"data-fetching\u002Fstreaming-and-suspense",[27,7124,7126],{"id":7125},"la-nouvelle-structure","La nouvelle structure",[32,7128,7129,7130,715],{},"Nous disposons d'une nouvelle structure de fichier. La racine se trouve désormais dans le dossier ",[201,7131,6201],{},[32,7133,7134,7135,7138,7139,7142,7143,7145],{},"Première chose, dans le système \"classique\", tous les fichiers devenaient des routes. Désormais, pour rendre une route publique, il faut un fichier ",[117,7136,7137],{},"page.[js|tsx|jsx]"," dans le dossier.\nAutrement dit, même si j'ai un dossier ",[117,7140,7141],{},"\u002Fapp\u002Fblog"," avec des fichiers dedans. Sans fichier ",[117,7144,7137],{}," cette route ne sera pas accessible.",[32,7147,7148,7149,7152,7153,715],{},"Deuxième chose, logiquement, les routes dynamiques ne sont plus faisables avec les fichiers. ",[117,7150,7151],{},"\u002Fpages\u002Fblog\u002F[slug].js"," c'est fini. Il faudra utiliser ",[117,7154,7155],{},"\u002Fapp\u002Fblog\u002F[slug]\u002Fpage.js",[32,7157,7158],{},"Troisième chose, on peut faire cohabiter d'autres fichiers dans un dossier. On peut donc mettre des components, stories, etc..",[77,7160,7162],{"id":7161},"les-fichiers-spéciaux","Les fichiers spéciaux",[32,7164,7165,7166,7168,7169,7174,7175,7177,7178,7183],{},"En plus du fichier ",[117,7167,7137],{},", il existe d'autres ",[36,7170,7173],{"href":7171,"rel":7172},"https:\u002F\u002Fbeta.nextjs.org\u002Fdocs\u002Frouting\u002Ffundamentals#special-files",[40],"fichiers spéciaux",". A noter que la liste ci-dessous est complètement optionnelle. Votre dossier ne peut contenir que ",[117,7176,7137],{},". Sauf le ",[36,7179,7182],{"href":7180,"rel":7181},"https:\u002F\u002Fbeta.nextjs.org\u002Fdocs\u002Frouting\u002Fpages-and-layouts#layouts",[40],"premier layout"," à la racine qui est nécessaire pour en avoir d'autres.",[110,7185,7186,7191,7195,7200,7205,7210],{},[113,7187,7188],{},[117,7189,7190],{},"layout.[js|tsx|jsx]",[113,7192,7193],{},[117,7194,6970],{},[113,7196,7197],{},[117,7198,7199],{},"error.[js|tsx|jsx]",[113,7201,7202],{},[117,7203,7204],{},"template.[js|tsx|jsx]",[113,7206,7207],{},[117,7208,7209],{},"head.[js|tsx|jsx]",[113,7211,7212],{},[117,7213,7214],{},"not-found.[js|tsx|jsx]",[32,7216,7217],{},"En dehors de ces fichiers, vous pouvez mettre ce que vous voulez.",[27,7219,7221],{"id":7220},"layout-nested-sil-vous-plaît","Layout, nested s'il vous plaît !",[32,7223,7224,7225,54,7228,7231],{},"Le layout à la racine remplace les fichiers ",[117,7226,7227],{},"_app.js",[117,7229,7230],{},"_document.js",".\nIl est obligatoire si vous voulez utiliser d'autres layouts dans les dossiers enfants.\nLes layouts, comme le reste, sont par défaut des server components. Nous pouvons donc faire des requêtes dedans.",[32,7233,7234,7235,7238],{},"Un détail à bien assimiler : les layouts dans les répertoires enfants, sont incorporés dans les autres layouts, ils sont ",[201,7236,7237],{},"nested",".\nL'intérêt ? Ajouter des éléments correspondant à la section affichée. Par exemple, une sidebar, un menu de gestion de compte, etc.",[32,7240,7241],{},"C'est désormais facile et natif.",[27,7243,7245],{"id":7244},"statique-par-défaut","Statique par défaut.",[32,7247,7248,7249,7252,7253,7256],{},"Comme avec la version classique, le rendu est ",[201,7250,7251],{},"statique"," par défaut.\nPour avoir un rendu ",[201,7254,7255],{},"\"serveur\"",", sans fichier statique généré donc, il faut :",[110,7258,7259,7268,7277],{},[113,7260,7261,7262,707,7265],{},"avoir une fonction dynamique. Qui utilise ",[117,7263,7264],{},"cookies()",[117,7266,7267],{},"header()",[113,7269,7270,7271,707,7274],{},"ou un fetch dynamique. Avec un ",[117,7272,7273],{},"cache : 'no-store'",[117,7275,7276],{},"revalidate: 0",[113,7278,7279,7280,7283],{},"ou pas de fonction ",[117,7281,7282],{},"generateStaticParams"," dans le fichier pour une route dynamique.",[32,7285,7286,7287],{},"Plus d'infos sur cette page : ",[36,7288,7291],{"href":7289,"rel":7290},"https:\u002F\u002Fbeta.nextjs.org\u002Fdocs\u002Frendering\u002Fstatic-and-dynamic-rendering",[40],"static-and-dynamic-rendering",[27,7293,7295],{"id":7294},"migration-vers-la-nouvelle-structure","Migration vers la nouvelle structure",[32,7297,7298],{},"Je vais vous lister les API de la structure \"pages\" et expliquer comment migrer sur la nouvelle structure \"app\"",[77,7300,7302],{"id":7301},"getstaticprops","getStaticProps",[32,7304,7305],{},"Cette fonction n'existe plus dans le dossier \"app\". On passe directement des requêtes dans les components via la fonction fetch.",[32,7307,7308],{},"Fetch dans Next.js, étend les pouvoirs du fetch natif que l'on connaît dans les navigateurs. On peut gérer le cache et le revalidate directement sur le fetch.",[77,7310,7312],{"id":7311},"getstaticpath","getStaticPath",[32,7314,7315,7316,7318],{},"Cette fonction n'existe plus dans le dossier \"app\". On utilise ",[117,7317,7282],{}," pour les routes dynamiques. À noter que s'il n'est pas présent, nous n'avons plus d'erreur au build. Simplement, la route dynamique devient rendue serveur.",[77,7320,7322],{"id":7321},"fallback-de-getstaticpath","fallback de getStaticPath",[32,7324,7325,7326,715],{},"Comme la fonction, le fallback passe par une variable exportée nommée ",[201,7327,7328],{},"dynamicParams",[390,7330,7332],{"className":6258,"code":7331,"language":6260,"meta":395,"style":395},"export const dynamicParams = true \u002F\u002F true | false,\n",[117,7333,7334],{"__ignoreMap":395},[399,7335,7336,7338,7341,7344,7346,7348],{"class":401,"line":402},[399,7337,4764],{"class":4224},[399,7339,7340],{"class":1117}," const",[399,7342,7343],{"class":4073}," dynamicParams",[399,7345,4078],{"class":4077},[399,7347,4482],{"class":1110},[399,7349,7350],{"class":1137}," \u002F\u002F true | false,\n",[77,7352,7354],{"id":7353},"revalidate","Revalidate",[32,7356,7357],{},"On peut régler cette valeur directement dans les requêtes fetch ou via une valeur exportée.",[390,7359,7361],{"className":6258,"code":7360,"language":6260,"meta":395,"style":395},"export const revalidate = false\n\u002F\u002F false | 'force-cache' | 0 | number\n",[117,7362,7363,7377],{"__ignoreMap":395},[399,7364,7365,7367,7369,7372,7374],{"class":401,"line":402},[399,7366,4764],{"class":4224},[399,7368,7340],{"class":1117},[399,7370,7371],{"class":4073}," revalidate",[399,7373,4078],{"class":4077},[399,7375,7376],{"class":1110}," false\n",[399,7378,7379],{"class":401,"line":1141},[399,7380,7381],{"class":1137},"\u002F\u002F false | 'force-cache' | 0 | number\n",[511,7383,7384],{},[32,7385,7386,7387],{},"À noter que cette valeur n'écrase pas les revalidates ajoutés au fetch individuellement. Plus d'infos : ",[36,7388,7391],{"href":7389,"rel":7390},"https:\u002F\u002Fbeta.nextjs.org\u002Fdocs\u002Fdata-fetching\u002Frevalidating",[40],"data-fetching\u002Frevalidating",[77,7393,7395],{"id":7394},"on-demand-revalidation","On-demand Revalidation",[32,7397,7398,7399],{},"Bonne nouvelle, cette fonctionnalité sera toujours disponible !\n",[36,7400,7394],{"href":7401,"rel":7402},"https:\u002F\u002Fbeta.nextjs.org\u002Fdocs\u002Fdata-fetching\u002Frevalidating#on-demand-revalidation",[40],[27,7404,7406],{"id":7405},"pour-finir","Pour finir",[32,7408,7409],{},"Dans cet article, je me suis concentré sur les gros changements de conceptions.",[32,7411,7412],{},"Je n'ai pas parlé de tous les éléments comme : les images, les fonts, le nouveau système de Head (où l'on peut aussi faire des requêtes) ou même le système de cache pour les fetch qui déduplique et évite d'avoir plusieurs fois la même requête effectuée lors du build.",[32,7414,7415],{},"Pour cela, il y a la documentation qui explique en détail chaque fonctionnalité.\nJe vous encourage grandement à passer du temps dessus pour bien tout comprendre.",[511,7417,7418],{},[110,7419,7420,7427],{},[113,7421,7422],{},[36,7423,7426],{"href":7424,"rel":7425},"https:\u002F\u002Fbeta.nextjs.org\u002Fdocs\u002Fgetting-started",[40],"La documentation (bêta) de Next.js \"app\"",[113,7428,7429],{},[36,7430,7433],{"href":7431,"rel":7432},"https:\u002F\u002Fapp-dir.vercel.app\u002F",[40],"Le site de démo",[1284,7435,7436],{},"html pre.shiki code .sRQ1T, html code.shiki .sRQ1T{--shiki-default:#FE4450}html pre.shiki code .soy-K, html code.shiki .soy-K{--shiki-default:#BBBBBB}html pre.shiki code .sFl1-, html code.shiki .sFl1-{--shiki-default:#FF8B39}html pre.shiki code .s2hdG, html code.shiki .s2hdG{--shiki-default:#B6B1B1}html pre.shiki code .sSmKr, html code.shiki .sSmKr{--shiki-default:#F97E72}html pre.shiki code .scrqX, html code.shiki .scrqX{--shiki-default:#FEDE5D}html pre.shiki code .sqjNi, html code.shiki .sqjNi{--shiki-default:#FF7EDB}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sgRlq, html code.shiki .sgRlq{--shiki-default:#36F9F6}html pre.shiki code .sH7Js, html code.shiki .sH7Js{--shiki-default:#FF7EDB;--shiki-default-font-style:italic}html pre.shiki code .sW278, html code.shiki .sW278{--shiki-default:#FFFFFFEE}html pre.shiki code .sfE7D, html code.shiki .sfE7D{--shiki-default:#72F1B8}html pre.shiki code .sz5MA, html code.shiki .sz5MA{--shiki-default:#2EE2FA}html pre.shiki code .sjThu, html code.shiki .sjThu{--shiki-default:#848BBD;--shiki-default-font-style:italic}",{"title":395,"searchDepth":1141,"depth":1141,"links":7438},[7439,7441,7442,7443,7446,7447,7448,7455],{"id":6208,"depth":1141,"text":7440},"Next.js 13, on fait le point de la nouvelle structure \"app\" 2\u002F2",{"id":6219,"depth":1141,"text":6220},{"id":6939,"depth":1141,"text":6940},{"id":7125,"depth":1141,"text":7126,"children":7444},[7445],{"id":7161,"depth":1151,"text":7162},{"id":7220,"depth":1141,"text":7221},{"id":7244,"depth":1141,"text":7245},{"id":7294,"depth":1141,"text":7295,"children":7449},[7450,7451,7452,7453,7454],{"id":7301,"depth":1151,"text":7302},{"id":7311,"depth":1151,"text":7312},{"id":7321,"depth":1151,"text":7322},{"id":7353,"depth":1151,"text":7354},{"id":7394,"depth":1151,"text":7395},{"id":7405,"depth":1141,"text":7406},"Ce deuxième article se concentre sur la nouvelle structure de Next.js via de dossier \"app\". Nous regarderons ensemble ce que cela change et nous allons surtout vérifier si nos applications continueront à fonctionner de la même façon avec cette nouvelle version.",{},"\u002Farticles\u002Fnext-js-13-app","2022-12-05",{"title":6169,"description":7456},"articles\u002Fnext-js-13-app","SaS23GC3oLQrdDrHESxsI2bdTvTfdmQSsnP9rVvUsfo",{"id":7464,"title":6191,"author":7465,"body":7466,"description":8054,"extension":1324,"meta":8055,"navigation":1154,"path":8056,"publicationDate":8057,"seo":8058,"stem":8059,"__hash__":8060},"articles\u002Farticles\u002Fnext-js-13-pages.md",{"name":21,"url":22},{"type":24,"value":7467,"toc":8043},[7468,7483,7496,7498,7505,7509,7513,7531,7540,7545,7550,7554,7563,7566,7584,7587,7590,7594,7597,7600,7604,7612,7734,7737,7745,7749,7758,7929,7932,7935,7938,7941,7950,7958,7964,7968,7972,7987,7991,8000,8007,8010,8016,8019,8025,8040],[511,7469,7470,7472],{"type":5299},[32,7471,6177],{},[110,7473,7474,7478],{},[113,7475,7476],{},[36,7477,6185],{"href":6184},[113,7479,7480],{},[36,7481,6169],{"href":7482},"\u002Farticles\u002Fnext-js-13-app\u002F",[32,7484,7485,7486,7489,7490,7492,7493,7495],{},"Dans ce premier article, nous allons refaire le point sur la façon que je nommerai ",[201,7487,7488],{},"\"classique\""," de construire des applications depuis quelques versions avec ",[201,7491,6197],{},".\nEnsemble, nous allons revoir le fonctionnement de la structure \"pages\" dans ",[201,7494,6197],{}," et ensuite dévoiler quelques points bloquants sur cette version.",[32,7497,6205],{},[27,7499,7501,7502],{"id":7500},"nextjs-13-pourquoi-il-était-nécessaire-dévoluer-12","Next.js 13, pourquoi il était nécessaire d'évoluer ! ",[399,7503,7504],{},"1\u002F2",[72,7506],{"videoLink":7507,"videoTitle":7508},"btOxeMg9gqY","Next.js 13, pourquoi il était nécessaire d'évoluer ! [1\u002F2]",[27,7510,7512],{"id":7511},"bref-historique","Bref historique",[32,7514,7515,7516,1273,7518,7520,7521,7524,7525,7530],{},"Pour rappel, ",[201,7517,7302],{},[201,7519,7312],{}," et la notion ",[201,7522,7523],{},"d'hybride"," ont été introduits sur la version ",[36,7526,7529],{"href":7527,"rel":7528},"https:\u002F\u002Fnextjs.org\u002Fblog\u002Fnext-9-3",[40],"9.3"," de Next.js le 9 mars 2020.",[32,7532,7533,7534,7539],{},"S'en sont suivies, plusieurs évolutions sur le mode statique hybride dont la dernière grosse feature (sur la ",[36,7535,7538],{"href":7536,"rel":7537},"https:\u002F\u002Fnextjs.org\u002Fblog\u002Fnext-12-2#on-demand-incremental-static-regeneration-stable",[40],"12.2",") :",[110,7541,7542],{},[113,7543,7544],{},"la possibilité d'invalider une url pour forcer la régénération de la page sans redéployer toute l'application. Pour les grosses applications, c'est une révolution.",[32,7546,7547],{},[201,7548,7549],{},"A noter que c'était une demande de la part des gros acteurs.",[27,7551,7553],{"id":7552},"statique-hybride","Statique Hybride",[32,7555,7556,7557,7562],{},"En mars 2021, j'écrivais un article sur ",[36,7558,7561],{"href":7559,"rel":7560},"https:\u002F\u002Fjamstatic.fr\u002F2021\u002F03\u002F09\u002F11000-pages-statiques\u002F",[40],"Jamstatic.fr"," concernant la problématique de faire du statique avec un site qui comporte beaucoup de pages.",[32,7564,7565],{},"Depuis, plusieurs meta-framework, ont implémenté des méthodes pour les sites avec un grand nombre de pages :",[110,7567,7568,7575,7582],{},[113,7569,7570],{},[36,7571,7574],{"href":7572,"rel":7573},"https:\u002F\u002Fwww.gatsbyjs.com\u002Fdocs\u002Freference\u002Frendering-options\u002Fdeferred-static-generation\u002F",[40],"Gatsby DSG",[113,7576,7577],{},[36,7578,7581],{"href":7579,"rel":7580},"https:\u002F\u002Fwww.11ty.dev\u002Fdocs\u002Fplugins\u002Fserverless\u002F",[40],"Eleventy Serverless",[113,7583,5920],{},[32,7585,7586],{},"Mais à ce jour, Next.js reste une seule solution simple qui permet en production de générer à la demande une page statique et donc de déployer une app sans générer toutes les pages. Nous parlons de génération incrémentale.",[32,7588,7589],{},"Et c'est pour cela que l'on parle de statique \"hybride\" car il est nécessaire de faire tourner une runtime pour permettre ce fonctionnement contrairement à du pur statique qui une fois généré se pose sur un CDN et basta.",[27,7591,7593],{"id":7592},"les-points-bloquants-de-la-structure-pages","Les points bloquants de la structure \"pages\"",[32,7595,7596],{},"Nous sommes nombreux à avoir développé des applications plus ou moins complexes. À s'être accoutumé au fonctionnement de Next.js.",[32,7598,7599],{},"Ensemble nous allons faire le tour des points bloquants sur la version que je nommerai \"classique\".",[77,7601,7603],{"id":7602},"le-layout","Le layout",[32,7605,7606,7607,7609,7610,715],{},"Dans ",[201,7608,6197],{}," \"classique\", la notion de layout est déjà existante. En effet, nous avons la possibilité de créer un layout en passant un component dans le fichier ",[117,7611,7227],{},[390,7613,7615],{"className":6258,"code":7614,"language":6260,"meta":395,"style":395},"import Layout from '..\u002Fcomponents\u002FLayout'\nimport '..\u002Fstyles\u002Fglobals.css'\n\nfunction MyApp({ Component, pageProps }) {\n  return (\n    \u003CLayout navigation={pageProps.navigation}>\n      \u003CComponent {...pageProps} \u002F>\n    \u003C\u002FLayout>\n  )\n}\n\nexport default MyApp\n",[117,7616,7617,7629,7636,7640,7659,7665,7690,7705,7713,7717,7721,7725],{"__ignoreMap":395},[399,7618,7619,7621,7624,7626],{"class":401,"line":402},[399,7620,4297],{"class":4224},[399,7622,7623],{"class":4073}," Layout",[399,7625,4998],{"class":1117},[399,7627,7628],{"class":4088}," '..\u002Fcomponents\u002FLayout'\n",[399,7630,7631,7633],{"class":401,"line":1141},[399,7632,4297],{"class":4224},[399,7634,7635],{"class":4088}," '..\u002Fstyles\u002Fglobals.css'\n",[399,7637,7638],{"class":401,"line":1151},[399,7639,1155],{"emptyLinePlaceholder":1154},[399,7641,7642,7644,7647,7649,7652,7654,7657],{"class":401,"line":1158},[399,7643,4512],{"class":1117},[399,7645,7646],{"class":4081}," MyApp",[399,7648,4541],{"class":409},[399,7650,7651],{"class":4144},"Component",[399,7653,1273],{"class":409},[399,7655,7656],{"class":4144},"pageProps",[399,7658,6553],{"class":409},[399,7660,7661,7663],{"class":401,"line":1164},[399,7662,4837],{"class":1117},[399,7664,6631],{"class":409},[399,7666,7667,7669,7672,7675,7677,7679,7681,7683,7686,7688],{"class":401,"line":1174},[399,7668,6828],{"class":4081},[399,7670,7671],{"class":405},"Layout",[399,7673,7674],{"class":1117}," navigation",[399,7676,5692],{"class":4077},[399,7678,6318],{"class":1117},[399,7680,7656],{"class":4073},[399,7682,715],{"class":409},[399,7684,7685],{"class":4118},"navigation",[399,7687,4230],{"class":1117},[399,7689,5709],{"class":4081},[399,7691,7692,7694,7696,7699,7701,7703],{"class":401,"line":1179},[399,7693,6641],{"class":4081},[399,7695,7651],{"class":405},[399,7697,7698],{"class":1117}," {...",[399,7700,7656],{"class":4073},[399,7702,4230],{"class":1117},[399,7704,7088],{"class":4081},[399,7706,7707,7709,7711],{"class":401,"line":1185},[399,7708,6911],{"class":4081},[399,7710,7671],{"class":405},[399,7712,5709],{"class":4081},[399,7714,7715],{"class":401,"line":1195},[399,7716,6715],{"class":409},[399,7718,7719],{"class":401,"line":1200},[399,7720,4957],{"class":409},[399,7722,7723],{"class":401,"line":1206},[399,7724,1155],{"emptyLinePlaceholder":1154},[399,7726,7727,7729,7731],{"class":401,"line":4607},[399,7728,4764],{"class":4224},[399,7730,4767],{"class":1117},[399,7732,7733],{"class":4073}," MyApp\n",[32,7735,7736],{},"Ce layout ne changera pas au fil des navigations dans le browser et seul le contenu sera modifié.",[110,7738,7739,7742],{},[113,7740,7741],{},"Première limitation : on ne peut pas faire de requête dans ce layout. Pas moyen de récupérer les data de navigation ou autre directement dedans. Il est dépendant de la page qui le contient.",[113,7743,7744],{},"Deuxième limitation : si je veux avoir des variantes de mon layouts, ce n'est pas natif, il faudra jouer d'astuce pour parser l'url et déterminer quelle est la page courante.",[77,7746,7748],{"id":7747},"getstaticprops-la-seule-source-de-data-et-la-cascade","\"getStaticProps\", la seule source de data et la cascade",[32,7750,7751,7752,707,7754,7757],{},"Dans la version \"classique\", tout est basé sur les pages. C'est uniquement dans une page via ",[201,7753,7302],{},[201,7755,7756],{},"getServerSideProps",", que l'on peut récupérer des data coté serveur.",[390,7759,7761],{"className":6258,"code":7760,"language":6260,"meta":395,"style":395},"export async function getStaticProps({ params }) {\n  \u002F\u002F slug in first param\n  const [slug] = params.slug || []\n  \u002F\u002F get navigation items\n  const navigation = await getNav()\n  \u002F\u002F not slug === home\n  const page = await getPage(slug || '')\n  if (!page) {\n    return {\n      notFound: true,\n    }\n  }\n  return {\n    props: { navigation, page },\n  }\n}\n",[117,7762,7763,7780,7785,7808,7813,7828,7833,7858,7871,7877,7888,7893,7897,7903,7921,7925],{"__ignoreMap":395},[399,7764,7765,7767,7769,7771,7774,7776,7778],{"class":401,"line":402},[399,7766,4764],{"class":4224},[399,7768,6540],{"class":1117},[399,7770,6469],{"class":1117},[399,7772,7773],{"class":4081}," getStaticProps",[399,7775,4541],{"class":409},[399,7777,6550],{"class":4144},[399,7779,6553],{"class":409},[399,7781,7782],{"class":401,"line":1141},[399,7783,7784],{"class":1137},"  \u002F\u002F slug in first param\n",[399,7786,7787,7789,7791,7794,7796,7798,7800,7802,7804,7806],{"class":401,"line":1151},[399,7788,6484],{"class":1117},[399,7790,6560],{"class":409},[399,7792,7793],{"class":4073},"slug",[399,7795,6565],{"class":409},[399,7797,5692],{"class":4077},[399,7799,6570],{"class":4073},[399,7801,715],{"class":409},[399,7803,7793],{"class":4118},[399,7805,6577],{"class":1117},[399,7807,6580],{"class":409},[399,7809,7810],{"class":401,"line":1158},[399,7811,7812],{"class":1137},"  \u002F\u002F get navigation items\n",[399,7814,7815,7817,7819,7821,7823,7826],{"class":401,"line":1164},[399,7816,6484],{"class":1117},[399,7818,7674],{"class":4073},[399,7820,4078],{"class":4077},[399,7822,6492],{"class":1117},[399,7824,7825],{"class":4081}," getNav",[399,7827,4106],{"class":409},[399,7829,7830],{"class":401,"line":1174},[399,7831,7832],{"class":1137},"  \u002F\u002F not slug === home\n",[399,7834,7835,7837,7840,7842,7844,7847,7849,7851,7853,7856],{"class":401,"line":1179},[399,7836,6484],{"class":1117},[399,7838,7839],{"class":4073}," page",[399,7841,4078],{"class":4077},[399,7843,6492],{"class":1117},[399,7845,7846],{"class":4081}," getPage",[399,7848,4085],{"class":409},[399,7850,7793],{"class":4073},[399,7852,6577],{"class":1117},[399,7854,7855],{"class":4088}," ''",[399,7857,4092],{"class":409},[399,7859,7860,7862,7864,7866,7869],{"class":401,"line":1185},[399,7861,4598],{"class":1117},[399,7863,4518],{"class":409},[399,7865,6608],{"class":1117},[399,7867,7868],{"class":4073},"page",[399,7870,4529],{"class":409},[399,7872,7873,7875],{"class":401,"line":1195},[399,7874,4943],{"class":1117},[399,7876,4159],{"class":409},[399,7878,7879,7882,7884,7886],{"class":401,"line":1200},[399,7880,7881],{"class":4073},"      notFound",[399,7883,4479],{"class":4478},[399,7885,4482],{"class":1110},[399,7887,4380],{"class":409},[399,7889,7890],{"class":401,"line":1206},[399,7891,7892],{"class":409},"    }\n",[399,7894,7895],{"class":401,"line":4607},[399,7896,4649],{"class":409},[399,7898,7899,7901],{"class":401,"line":4628},[399,7900,4837],{"class":1117},[399,7902,4159],{"class":409},[399,7904,7905,7908,7910,7912,7914,7916,7918],{"class":401,"line":4646},[399,7906,7907],{"class":4073},"    props",[399,7909,4479],{"class":4478},[399,7911,4300],{"class":409},[399,7913,7685],{"class":4073},[399,7915,1273],{"class":409},[399,7917,7868],{"class":4073},[399,7919,7920],{"class":409}," },\n",[399,7922,7923],{"class":401,"line":4652},[399,7924,4649],{"class":409},[399,7926,7927],{"class":401,"line":6706},[399,7928,4957],{"class":409},[32,7930,7931],{},"D'un côté, c'est une bonne chose de n'avoir qu'un point d'entrée pour les data, c'est centralisé. De l'autre, ce point d'entrée, se retrouve à gérer toute la data de la page. Layout compris.",[32,7933,7934],{},"L'inconvénient, c'est que l'on obtient une cascade de data entre les components. Les components se passent les data de parent à enfant. La page devient responsable de la data affichée dans la navigation, le footer, la sidebar.",[32,7936,7937],{},"Autre inconvénient, les requêtes sont répétées pour chaque page générée même si elles sont identiques. Pas de système de cache en natif.",[32,7939,7940],{},"Cela peut très vite, mettre à mal votre API via de très nombreuses requêtes lors d'un déploiement.\nMais ce n'est pas tout, même lors du fonctionnement en production, il peut y avoir des frictions.",[32,7942,7943,7946,7947,7949],{},[201,7944,7945],{},"Première friction"," : Le prefetch des liens. Sur une page de liste par exemple, cela peut lancer beaucoup d'appels en même temps, puisque Next.js va générer les pages liées aux liens. Si vous avez des ",[201,7948,7302],{}," assez conséquents cela peut ralentir votre API.",[511,7951,7952],{},[32,7953,7954,7957],{},[201,7955,7956],{},"Link Prefetch"," : Quand Next.js découvre des liens dans un page, il prefetch les pages liées automatiquement. Il est possible de désactiver le prefetch et passer sur le mode hover. Quand le curseur passe sur le link, le prefetch se lance.",[32,7959,7960,7963],{},[201,7961,7962],{},"Deuxième friction"," : sur une page générée à la demande en réglant le callback sur true ou blocking, après avoir cliqué sur un lien interne, on peut parfois observer une transition de page assez lente où il ne se passe rien. Jusqu'à avoir l'impression que le clic n'a pas fonctionné.\nC'est un comportement que l'on retrouve parfois quand on a des fonctions getStaticProps assez conséquentes.",[100,7965],{"align":102,"alt":7966,"src":7967},"nextjs 13 slow","https:\u002F\u002Fdouble-slash.dev\u002Fassets\u002Farticles\u002Fnextjs-lag.gif",[77,7969,7971],{"id":7970},"réhydratation","Réhydratation",[32,7973,7974,7975,7978,7979,7982,7983,7986],{},"L'",[201,7976,7977],{},"hydratation",", c'est l'étape où l'application parse le html pour intégrer le côté interactif de l'application.\nProblème, c'est une étape coûteuse en ressource et plus ou moins longue en fonction de la taille de l'application et du bundle. Cela peut réellement impacter le \"",[201,7980,7981],{},"Time to Interactive","\" et le \"",[201,7984,7985],{},"Total Blocking Time","\" dans les tests de performances.",[100,7988],{"align":102,"alt":7989,"src":7990},"Total blocking time","https:\u002F\u002Fdouble-slash.dev\u002Fassets\u002Farticles\u002Fblocking-time.jpg",[32,7992,7993,7996,7997,7999],{},[201,7994,7995],{},"La conséquence",": Désormais de tous les frameworks n'ont qu'un seul objectif : envoyer le minimum de ",[201,7998,5664],{}," possible dans le navigateur. Le comble pour des web apps JavaScript.",[32,8001,8002,8003,8006],{},"Un des concepts qui semble être majoritairement adopté: l'",[201,8004,8005],{},"island architecture",". La majorité du code repasse sur du HTML classique et seulement les éléments qui doivent être interactifs, embarquent du JavaScript.",[32,8008,8009],{},"Actuellement l'API de rendu React, par sa conception, ne fonctionne pas comme ça. L'application est réhydratée complètement dans le navigateur avant de pouvoir être utilisable.",[32,8011,8012,8013,8015],{},"Aujourd'hui dans les tests de performances, les applications Next.js sont pénalisées par un bundle trop lourd, du javascript trop long à parser et donc un ",[201,8014,7981],{}," catastrophique.",[32,8017,8018],{},"Next.js dans sa version \"classique\", ne peut pas changer ce système !",[32,8020,8021,8022,8024],{},"Bonne nouvelle ! ",[201,8023,6946],{},", introduit de nouveau concept de rendu et nous allons en parler dans le prochain article :",[511,8026,8027,8032],{},[32,8028,8029],{},[201,8030,8031],{},"Lire le dernier article",[110,8033,8034],{},[113,8035,8036],{},[201,8037,8038],{},[36,8039,6169],{"href":7482},[1284,8041,8042],{},"html pre.shiki code .sfE7D, html code.shiki .sfE7D{--shiki-default:#72F1B8}html pre.shiki code .sqjNi, html code.shiki .sqjNi{--shiki-default:#FF7EDB}html pre.shiki code .scrqX, html code.shiki .scrqX{--shiki-default:#FEDE5D}html pre.shiki code .sFl1-, html code.shiki .sFl1-{--shiki-default:#FF8B39}html pre.shiki code .sgRlq, html code.shiki .sgRlq{--shiki-default:#36F9F6}html pre.shiki code .soy-K, html code.shiki .soy-K{--shiki-default:#BBBBBB}html pre.shiki code .sH7Js, html code.shiki .sH7Js{--shiki-default:#FF7EDB;--shiki-default-font-style:italic}html pre.shiki code .sRQ1T, html code.shiki .sRQ1T{--shiki-default:#FE4450}html pre.shiki code .sW278, html code.shiki .sW278{--shiki-default:#FFFFFFEE}html pre.shiki code .sz5MA, html code.shiki .sz5MA{--shiki-default:#2EE2FA}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sjThu, html code.shiki .sjThu{--shiki-default:#848BBD;--shiki-default-font-style:italic}html pre.shiki code .s2hdG, html code.shiki .s2hdG{--shiki-default:#B6B1B1}html pre.shiki code .sSmKr, html code.shiki .sSmKr{--shiki-default:#F97E72}",{"title":395,"searchDepth":1141,"depth":1141,"links":8044},[8045,8047,8048,8049],{"id":7500,"depth":1141,"text":8046},"Next.js 13, pourquoi il était nécessaire d'évoluer ! 1\u002F2",{"id":7511,"depth":1141,"text":7512},{"id":7552,"depth":1141,"text":7553},{"id":7592,"depth":1141,"text":7593,"children":8050},[8051,8052,8053],{"id":7602,"depth":1151,"text":7603},{"id":7747,"depth":1151,"text":7748},{"id":7970,"depth":1151,"text":7971},"Dans ce premier article, nous allons refaire le point sur la façon que je nommerai \"classique\" de construire des applications depuis quelques versions avec Next.js. Ensemble, nous allons revoir le fonctionnement de la structure \"pages\" dans Next.js et ensuite dévoiler quelques points bloquants sur cette version.",{},"\u002Farticles\u002Fnext-js-13-pages","2022-12-04",{"title":6191,"description":8054},"articles\u002Fnext-js-13-pages","jQ1eopiZ9NAvceG6HdrDQv7wrdJeKU6dVYMmg9Uwdy8",{"id":8062,"title":6185,"author":8063,"body":8064,"description":8196,"extension":1324,"meta":8197,"navigation":1154,"path":8198,"publicationDate":8199,"seo":8200,"stem":8201,"__hash__":8202},"articles\u002Farticles\u002Fnext-js-13-intro.md",{"name":21,"url":22},{"type":24,"value":8065,"toc":8194},[8066,8076,8080,8089,8092,8095,8118,8121,8142,8148,8154,8157,8169,8172,8176,8179],[32,8067,8068,8069,8071,8072,8075],{},"Vous le savez certainement, ",[201,8070,6226],{}," a été annoncé lors de la ",[201,8073,8074],{},"Next.js Conf"," le 25 octobre 2022.",[100,8077],{"align":102,"alt":8078,"src":8079},"nextjs 13","https:\u002F\u002Fdouble-slash.dev\u002Fassets\u002Farticles\u002Fnextjs-presentation.jpg",[32,8081,8082,8083,8085,8086,8088],{},"Alors, quand on supprime tous les subterfuges marketings et la présentation  à la Apple, c'est une annonce très importante dans la communauté ",[201,8084,5661],{},". Des grands changements à commencer par le principal : une nouvelle structure pour nos applications ",[201,8087,6197],{}," !",[32,8090,8091],{},"Alors, je vous arrête tout de suite, vos applications développées précédemment sous le format classique (dossier pages) vont continuer à fonctionner sans souci. Pas de panique !",[32,8093,8094],{},"Personnellement, j'ai attendu que l'effervescence retombe un peu et j'ai enfin pris le temps de bien lire la doc (une bonne journée) et de tester un peu en faisant 2 applications de test.",[511,8096,8097,8102],{},[32,8098,8099],{},[201,8100,8101],{},"Les codes source des 2 applications :",[110,8103,8104,8111],{},[113,8105,8106],{},[36,8107,8110],{"href":8108,"rel":8109},"https:\u002F\u002Fgithub.com\u002Fdouble-slash-podcast\u002Fnextjs-example",[40],"Version pages",[113,8112,8113],{},[36,8114,8117],{"href":8115,"rel":8116},"https:\u002F\u002Fgithub.com\u002Fdouble-slash-podcast\u002Fnextjs-13-app-example",[40],"Version app",[32,8119,8120],{},"D'où l'idée de faire un retour par écrit et en vidéo sur cette nouvelle structure et tout ce qui va avec.",[110,8122,8123,8133],{},[113,8124,8125,8126,8129,8130,8132],{},"Dans un ",[36,8127,8128],{"href":6190},"premier article",", nous allons refaire le point sur la façon que je nommerai ",[201,8131,7488],{}," de construire des applications depuis quelques versions avec Next.js.\nCe premier article se concentra sur la méthode \"classique\" qui utilise la structure \"pages\".",[113,8134,8135,8136,8139,8140,6202],{},"S'en suivra, un ",[36,8137,8138],{"href":7482},"deuxième article"," sur cette nouvelle structure via de dossier ",[201,8141,6201],{},[32,8143,8144,8145,715],{},"Avant que vous passiez au premier article, je voulais revenir sur le fait que Next.js était quasiment obligé ",[201,8146,8147],{},"d'évoluer",[32,8149,8150,8151,715],{},"Cette nouvelle structure se présente comme un gros changement de conception et même de ",[201,8152,8153],{},"modèle mental",[32,8155,8156],{},"Pour les gros projets, la transition ne va pas être simple. Il faudra même peut-être réécrire une bonne partie des applications !",[32,8158,8159,8160,8165,8166,715],{},"Ce qu'il faut comprendre, c'est que l'on entre dans une nouvelle ère pour les frameworks JS. ",[36,8161,8164],{"href":8162,"rel":8163},"https:\u002F\u002Ftwitter.com\u002Fmhevery",[40],"Miško Hevery",", le créateur de Qwik, parle de framework ",[201,8167,8168],{},"3ème génération",[32,8170,8171],{},"On pourrait même dire, que l'on entre dans l'âge de raison. Une nouvelle ère, où nous allons envoyer beaucoup moins de JS dans les navigateurs, où uniquement les éléments interactifs embarqueront le code pour l'être.",[100,8173],{"align":102,"alt":8174,"src":8175},"bundle size js","https:\u002F\u002Fdouble-slash.dev\u002Fassets\u002Farticles\u002Fbundle-size.jpg",[32,8177,8178],{},"Bref, un changement obligatoire, peut-être un peu contraignant mais pour le bien de tous !",[511,8180,8181,8186],{},[32,8182,8183],{},[201,8184,8185],{},"Lire la suite",[110,8187,8188],{},[113,8189,8190],{},[201,8191,8192],{},[36,8193,6191],{"href":6190},{"title":395,"searchDepth":1141,"depth":1141,"links":8195},[],"Vous le savez certainement, Next.js 13 a été annoncé lors de la Next.js Conf le 25 octobre 2022. Alors, quand on supprime tous les subterfuges marketings et la présentation à la Apple, c'est une annonce très importante dans la communauté React.js. Des grands changements à commencer par le principal, une nouvelle structure pour nos applications Next.js !",{},"\u002Farticles\u002Fnext-js-13-intro","2022-12-03",{"title":6185,"description":8196},"articles\u002Fnext-js-13-intro","9AJndn5JfHWwEMNlorABtOTzeisISeu2imCgMoZvnJg",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":8204},"\u003Cpath fill=\"currentColor\" d=\"M4 21V9l8-6l8 6v12h-6v-7h-4v7z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":8206},"\u003Cpath fill=\"currentColor\" d=\"M4 11v2h12l-5.5 5.5l1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5L16 11z\"\u002F>",["Island",8208],{"key":8209,"result":8210},"Brand_bAcjTzQpW6OVpFK319jfMki97vH1GrZiqHmeI7Xg4o",{"head":8211},{},["Island",8213],{"key":8214,"result":8215},"ArticleDetails_0P8Z0Mg3LoXLmxP1NNjdPMpSQofkyhLX9WIneLANGo",{"head":8216},{},["Island",8218],{"key":8219,"result":8220},"ArticleDetails_SJqMjkXyWnm739Y8cY2qrNoTMPLRa2bK01tkU3J7dE",{"head":8221},{},["Island",8223],{"key":8224,"result":8225},"ArticleDetails_O7L5xwzFngs2mbFXGSRpMQgtWvaU14E7Lp9WzIRw",{"head":8226},{},["Island",8228],{"key":8229,"result":8230},"ArticleDetails_F2dLmuPM9cWu3A5gAcYc1nWQXMdK9pu1s1OhQ3aSlY",{"head":8231},{},["Island",8233],{"key":8234,"result":8235},"ArticleDetails_N1OWfV5pHg5LHMVNtPGpRYl6L8LJ9Xxr1k3a5xM",{"head":8236},{},["Island",8238],{"key":8239,"result":8240},"ArticleDetails_hXLhGvql7jjYZIlPrZBkvBsaMmdK1rEFs7iIb5c3fE",{"head":8241},{},["Island",8243],{"key":8244,"result":8245},"ArticleDetails_EzO25ILzyATomZEzUT3qTlYvNk7rI9tcKsUNMZnYzzM",{"head":8246},{},["Island",8248],{"key":8249,"result":8250},"ArticleDetails_538h6uC5w6PXO7rbbvdHBFmXY2d7TnKfATK7Td0TxWg",{"head":8251},{},["Island",8253],{"key":8254,"result":8255},"ArticleDetails_47yqC54LPLi0cVpoRRkLz79yp9JGD62QUPxgn14dBI",{"head":8256},{},["Island",8258],{"key":8259,"result":8260},"ArticleDetails_bKa9YAef2qnd6n4RWKNaIeVOB86JLu8hnpsnM2WnA",{"head":8261},{},1785405172304]