[{"data":1,"prerenderedAt":674},["ShallowReactive",2],{"page-\u002Fpratiques":3,"pieces-pratiques":645,"autour-\u002Fpratiques":659,"prerequis-\u002Fpratiques":662,"plan-pratiques":663},{"id":4,"title":5,"body":6,"description":618,"extension":619,"ligne":620,"meta":621,"motsCles":622,"navigation":631,"niveau":632,"path":633,"prerequis":634,"ressources":634,"seo":635,"sources":636,"stem":643,"__hash__":644},"docs\u002Fpratiques\u002Findex.md","Bonnes pratiques",{"type":7,"value":8,"toc":609},"minimark",[9,13,18,107,116,120,164,173,177,230,233,292,299,303,351,356,360,375,441,447,451,515,521,525,591,605],[10,11,12],"p",{},"Ce mémo regroupe les réflexes d'un code propre et d'un projet bien tenu. Chaque section renvoie au cours qui l'explique.",[14,15,17],"h2",{"id":16},"nommer","Nommer",[19,20,21,37],"table",{},[22,23,24],"thead",{},[25,26,27,31,34],"tr",{},[28,29,30],"th",{},"Élément",[28,32,33],{},"Convention",[28,35,36],{},"Exemple",[38,39,40,55,68,81,94],"tbody",{},[25,41,42,46,49],{},[43,44,45],"td",{},"Variable",[43,47,48],{},"nom en camelCase",[43,50,51],{},[52,53,54],"code",{},"recettesRapides",[25,56,57,60,63],{},[43,58,59],{},"Fonction",[43,61,62],{},"verbe en camelCase",[43,64,65],{},[52,66,67],{},"chargerRecettes()",[25,69,70,73,76],{},[43,71,72],{},"Booléen",[43,74,75],{},"question",[43,77,78],{},[52,79,80],{},"estPublie",[25,82,83,86,89],{},[43,84,85],{},"Constante fixe",[43,87,88],{},"MAJUSCULES",[43,90,91],{},[52,92,93],{},"DUREE_MAX_RECETTE_RAPIDE",[25,95,96,99,102],{},[43,97,98],{},"Composant",[43,100,101],{},"majuscule initiale",[43,103,104],{},[52,105,106],{},"CarteRecette",[10,108,109,110,115],{},"Une fonction fait une seule chose. Un commentaire explique le pourquoi. Détails : ",[111,112,114],"a",{"href":113},"\u002Fpratiques\u002Fnommer-et-organiser","Nommer et organiser son code",".",[14,117,119],{"id":118},"lire-une-erreur","Lire une erreur",[19,121,122,132],{},[22,123,124],{},[25,125,126,129],{},[28,127,128],{},"Type",[28,130,131],{},"Sens",[38,133,134,144,154],{},[25,135,136,141],{},[43,137,138],{},[52,139,140],{},"SyntaxError",[43,142,143],{},"Le code est mal écrit.",[25,145,146,151],{},[43,147,148],{},[52,149,150],{},"ReferenceError",[43,152,153],{},"Le nom n'existe pas.",[25,155,156,161],{},[43,157,158],{},[52,159,160],{},"TypeError",[43,162,163],{},"La valeur ne peut pas être utilisée ainsi.",[10,165,166,169,170,115],{},[52,167,168],{},"F12"," ouvre les outils du navigateur, onglet Console. Corrige la première erreur de la liste. Détails : ",[111,171,119],{"href":172},"\u002Fpratiques\u002Flire-une-erreur",[14,174,176],{"id":175},"déboguer","Déboguer",[178,179,184],"pre",{"className":180,"code":181,"language":182,"meta":183,"style":183},"language-js shiki shiki-themes github-light-default github-dark-default github-dark-default","console.log('total :', total)\nconsole.table(recettes)\ndebugger \u002F\u002F pause si les outils sont ouverts\n","js","",[52,185,186,209,219],{"__ignoreMap":183},[187,188,191,195,199,202,206],"span",{"class":189,"line":190},"line",1,[187,192,194],{"class":193},"scfrF","console.",[187,196,198],{"class":197},"syCW7","log",[187,200,201],{"class":193},"(",[187,203,205],{"class":204},"shWOn","'total :'",[187,207,208],{"class":193},", total)\n",[187,210,212,214,216],{"class":189,"line":211},2,[187,213,194],{"class":193},[187,215,19],{"class":197},[187,217,218],{"class":193},"(recettes)\n",[187,220,222,226],{"class":189,"line":221},3,[187,223,225],{"class":224},"sOnC1","debugger",[187,227,229],{"class":228},"sd6ml"," \u002F\u002F pause si les outils sont ouverts\n",[10,231,232],{},"Méthode : reproduire, isoler, comprendre, corriger. Pour un bug récent :",[178,234,238],{"className":235,"code":236,"language":237,"meta":183,"style":183},"language-bash shiki shiki-themes github-light-default github-dark-default github-dark-default","git bisect start\ngit bisect bad\ngit bisect good \u003Cidentifiant>\ngit bisect reset\n","bash",[52,239,240,252,261,282],{"__ignoreMap":183},[187,241,242,246,249],{"class":189,"line":190},[187,243,245],{"class":244},"sIXEE","git",[187,247,248],{"class":204}," bisect",[187,250,251],{"class":204}," start\n",[187,253,254,256,258],{"class":189,"line":211},[187,255,245],{"class":244},[187,257,248],{"class":204},[187,259,260],{"class":204}," bad\n",[187,262,263,265,267,270,273,276,279],{"class":189,"line":221},[187,264,245],{"class":244},[187,266,248],{"class":204},[187,268,269],{"class":204}," good",[187,271,272],{"class":224}," \u003C",[187,274,275],{"class":204},"identifian",[187,277,278],{"class":193},"t",[187,280,281],{"class":224},">\n",[187,283,285,287,289],{"class":189,"line":284},4,[187,286,245],{"class":244},[187,288,248],{"class":204},[187,290,291],{"class":204}," reset\n",[10,293,294,295,115],{},"Détails : ",[111,296,298],{"href":297},"\u002Fpratiques\u002Fdeboguer","Déboguer méthodiquement",[14,300,302],{"id":301},"gérer-un-projet","Gérer un projet",[19,304,305,315],{},[22,306,307],{},[25,308,309,312],{},[28,310,311],{},"Outil",[28,313,314],{},"Usage",[38,316,317,325,333,343],{},[25,318,319,322],{},[43,320,321],{},"Tableau Kanban",[43,323,324],{},"Ranger les tâches : à faire, en cours, terminé.",[25,326,327,330],{},[43,328,329],{},"Issue GitHub",[43,331,332],{},"Une tâche ou un bug, avec étapes et résultat attendu.",[25,334,335,340],{},[43,336,337],{},[52,338,339],{},"Closes #12",[43,341,342],{},"Ferme l'issue à la fusion de la pull request.",[25,344,345,348],{},[43,346,347],{},"README",[43,349,350],{},"Ce que c'est, comment le lancer.",[10,352,294,353,115],{},[111,354,302],{"href":355},"\u002Fpratiques\u002Fgerer-un-projet",[14,357,359],{"id":358},"sécurité","Sécurité",[178,361,363],{"className":235,"code":362,"language":237,"meta":183,"style":183},"# .gitignore\n.env\n",[52,364,365,370],{"__ignoreMap":183},[187,366,367],{"class":189,"line":190},[187,368,369],{"class":228},"# .gitignore\n",[187,371,372],{"class":189,"line":211},[187,373,374],{"class":244},".env\n",[19,376,377,387],{},[22,378,379],{},[25,380,381,384],{},[28,382,383],{},"Réflexe",[28,385,386],{},"Action",[38,388,389,404,416,433],{},[25,390,391,394],{},[43,392,393],{},"Secrets",[43,395,396,397,400,401,115],{},"Dans ",[52,398,399],{},".env",", jamais commité, avec un ",[52,402,403],{},".env.example",[25,405,406,409],{},[43,407,408],{},"Entrées utilisateur",[43,410,411,412,415],{},"Afficher avec ",[52,413,414],{},"textContent",", valider côté serveur.",[25,417,418,421],{},[43,419,420],{},"Dépendances",[43,422,423,426,427,426,430,115],{},[52,424,425],{},"npm audit",", ",[52,428,429],{},"npm outdated",[52,431,432],{},"npm ci",[25,434,435,438],{},[43,436,437],{},"Transport",[43,439,440],{},"HTTPS partout.",[10,442,294,443,115],{},[111,444,446],{"href":445},"\u002Fpratiques\u002Fsecurite-de-base","Sécurité de base",[14,448,450],{"id":449},"qualité","Qualité",[19,452,453,463],{},[22,454,455],{},[25,456,457,460],{},[28,458,459],{},"Commande",[28,461,462],{},"Effet",[38,464,465,475,485,495,505],{},[25,466,467,472],{},[43,468,469],{},[52,470,471],{},"npm init @eslint\u002Fconfig@latest",[43,473,474],{},"Crée la configuration d'ESLint.",[25,476,477,482],{},[43,478,479],{},[52,480,481],{},"npx eslint . --fix",[43,483,484],{},"Analyse et corrige.",[25,486,487,492],{},[43,488,489],{},[52,490,491],{},"npx prettier . --write",[43,493,494],{},"Reformate le code.",[25,496,497,502],{},[43,498,499],{},[52,500,501],{},"npx prettier . --check",[43,503,504],{},"Vérifie le style sans modifier.",[25,506,507,512],{},[43,508,509],{},[52,510,511],{},"node --test",[43,513,514],{},"Lance les tests du lanceur intégré à Node.js.",[10,516,294,517,115],{},[111,518,520],{"href":519},"\u002Fpratiques\u002Fqualite-et-mise-en-ligne","Qualité et mise en ligne",[14,522,524],{"id":523},"mettre-en-ligne","Mettre en ligne",[178,526,531],{"className":527,"code":528,"filename":529,"language":530,"meta":183,"style":183},"language-ts shiki shiki-themes github-light-default github-dark-default github-dark-default","export default defineNuxtConfig({\n  runtimeConfig: {\n    apiSecret: '',              \u002F\u002F NUXT_API_SECRET\n    public: { apiBase: '' }     \u002F\u002F NUXT_PUBLIC_API_BASE\n  }\n})\n","nuxt.config.ts","ts",[52,532,533,547,552,566,579,585],{"__ignoreMap":183},[187,534,535,538,541,544],{"class":189,"line":190},[187,536,537],{"class":224},"export",[187,539,540],{"class":224}," default",[187,542,543],{"class":197}," defineNuxtConfig",[187,545,546],{"class":244},"({\n",[187,548,549],{"class":189,"line":211},[187,550,551],{"class":193},"  runtimeConfig: {\n",[187,553,554,557,560,563],{"class":189,"line":221},[187,555,556],{"class":193},"    apiSecret: ",[187,558,559],{"class":204},"''",[187,561,562],{"class":193},",              ",[187,564,565],{"class":228},"\u002F\u002F NUXT_API_SECRET\n",[187,567,568,571,573,576],{"class":189,"line":284},[187,569,570],{"class":193},"    public: { apiBase: ",[187,572,559],{"class":204},[187,574,575],{"class":193}," }     ",[187,577,578],{"class":228},"\u002F\u002F NUXT_PUBLIC_API_BASE\n",[187,580,582],{"class":189,"line":581},5,[187,583,584],{"class":193},"  }\n",[187,586,588],{"class":189,"line":587},6,[187,589,590],{"class":244},"})\n",[10,592,593,594,596,597,426,599,602,603,115],{},"Le ",[52,595,399],{}," n'est pas lu par le serveur compilé : définis les variables chez l'hébergeur. Avant chaque déploiement : lint, tests, ",[52,598,425],{},[52,600,601],{},"npm run build",", variables de production, HTTPS. Détails : ",[111,604,520],{"href":519},[606,607,608],"style",{},"html pre.shiki code .scfrF, html code.shiki .scfrF{--shiki-light:#1F2328;--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}html pre.shiki code .syCW7, html code.shiki .syCW7{--shiki-light:#8250DF;--shiki-default:#D2A8FF;--shiki-dark:#D2A8FF}html pre.shiki code .shWOn, html code.shiki .shWOn{--shiki-light:#0A3069;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html pre.shiki code .sOnC1, html code.shiki .sOnC1{--shiki-light:#CF222E;--shiki-default:#FF7B72;--shiki-dark:#FF7B72}html pre.shiki code .sd6ml, html code.shiki .sd6ml{--shiki-light:#6E7781;--shiki-default:#8B949E;--shiki-dark:#8B949E}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sIXEE, html code.shiki .sIXEE{--shiki-light:#953800;--shiki-default:#FFA657;--shiki-dark:#FFA657}",{"title":183,"searchDepth":211,"depth":221,"links":610},[611,612,613,614,615,616,617],{"id":16,"depth":211,"text":17},{"id":118,"depth":211,"text":119},{"id":175,"depth":211,"text":176},{"id":301,"depth":211,"text":302},{"id":358,"depth":211,"text":359},{"id":449,"depth":211,"text":450},{"id":523,"depth":211,"text":524},"Le mémo des bonnes pratiques : nommage, erreurs, débogage, gestion de projet, sécurité, qualité et mise en ligne.","md","pratiques",{},[623,624,625,626,627,628,347,399,629,630,425],"mémo","aide-mémoire","bonnes pratiques","console","git bisect","issues","ESLint","Prettier",true,"memo","\u002Fpratiques",null,{"title":5,"description":618},[637,640],{"nom":638,"url":639},"Documentation d'ESLint (en anglais)","https:\u002F\u002Feslint.org\u002Fdocs\u002Flatest\u002Fuse\u002Fgetting-started",{"nom":641,"url":642},"MDN, Sécurité","https:\u002F\u002Fdeveloper.mozilla.org\u002Ffr\u002Fdocs\u002FWeb\u002FSecurity","pratiques\u002Findex","Gc_1vS_X5SCwgXBRTiIBwcg90iezNjTv4AIrF4RelFk",[646,648,650,652,654,656,658],{"path":113,"title":114,"stem":647},"pratiques\u002F01.nommer-et-organiser",{"path":172,"title":119,"stem":649},"pratiques\u002F02.lire-une-erreur",{"path":297,"title":298,"stem":651},"pratiques\u002F03.deboguer",{"path":355,"title":302,"stem":653},"pratiques\u002F04.gerer-un-projet",{"path":445,"title":446,"stem":655},"pratiques\u002F05.securite-de-base",{"path":519,"title":520,"stem":657},"pratiques\u002F06.qualite-et-mise-en-ligne",{"path":633,"title":5,"stem":643},[634,660],{"title":114,"path":113,"stem":647,"description":661,"children":-1},"Choisir des noms qui se lisent comme des phrases, découper en petites fonctions et ranger les fichiers dans des dossiers cohérents.",[],[664,666,667,668,670,671,673],{"path":113,"title":114,"niveau":665,"stem":647},"debutant",{"path":172,"title":119,"niveau":665,"stem":649},{"path":297,"title":298,"niveau":665,"stem":651},{"path":355,"title":302,"niveau":669,"stem":653},"intermediaire",{"path":445,"title":446,"niveau":669,"stem":655},{"path":519,"title":520,"niveau":672,"stem":657},"avance",{"path":633,"title":5,"niveau":632,"stem":643},1794583430815]