[{"data":1,"prerenderedAt":967},["ShallowReactive",2],{"docs-nav:fr":3,"docs:\u002Ffr\u002Fdocs\u002Finfra\u002Fhosts":137},[4],{"title":5,"path":6,"stem":7,"children":8,"page":44},"Fr","\u002Ffr","fr",[9],{"title":10,"path":11,"stem":12,"children":13},"Qu'est-ce que Fougere","\u002Ffr\u002Fdocs","fr\u002Fdocs\u002Findex",[14,15,19,23,27,45,66,95,116],{"title":10,"path":11,"stem":12},{"title":16,"path":17,"stem":18},"Démarrer","\u002Ffr\u002Fdocs\u002Fgetting-started","fr\u002Fdocs\u002F01.getting-started",{"title":20,"path":21,"stem":22},"App Nuxt existante","\u002Ffr\u002Fdocs\u002Fexisting-app","fr\u002Fdocs\u002F02.existing-app",{"title":24,"path":25,"stem":26},"La CLI","\u002Ffr\u002Fdocs\u002Fcli","fr\u002Fdocs\u002F03.cli",{"title":28,"path":29,"stem":30,"children":31,"page":44},"Concepts","\u002Ffr\u002Fdocs\u002Fconcepts","fr\u002Fdocs\u002F2.concepts",[32,36,40],{"title":33,"path":34,"stem":35},"Philosophie","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fphilosophy","fr\u002Fdocs\u002F2.concepts\u002F1.philosophy",{"title":37,"path":38,"stem":39},"La Frond","\u002Ffr\u002Fdocs\u002Fconcepts\u002Ffrond","fr\u002Fdocs\u002F2.concepts\u002F2.frond",{"title":41,"path":42,"stem":43},"Le chemin le plus court","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fshortest-path","fr\u002Fdocs\u002F2.concepts\u002F3.shortest-path",false,{"title":46,"path":47,"stem":48,"children":49,"page":44},"Schéma","\u002Ffr\u002Fdocs\u002Fschema","fr\u002Fdocs\u002F3.schema",[50,54,58,62],{"title":51,"path":52,"stem":53},"Entités","\u002Ffr\u002Fdocs\u002Fschema\u002Fentities","fr\u002Fdocs\u002F3.schema\u002F1.entities",{"title":55,"path":56,"stem":57},"Vues","\u002Ffr\u002Fdocs\u002Fschema\u002Fviews","fr\u002Fdocs\u002F3.schema\u002F2.views",{"title":59,"path":60,"stem":61},"La carte d'identité","\u002Ffr\u002Fdocs\u002Fschema\u002Fcard","fr\u002Fdocs\u002F3.schema\u002F3.card",{"title":63,"path":64,"stem":65},"Standard Schema","\u002Ffr\u002Fdocs\u002Fschema\u002Fstandard-schema","fr\u002Fdocs\u002F3.schema\u002F4.standard-schema",{"title":67,"path":68,"stem":69,"children":70,"page":44},"Métier","\u002Ffr\u002Fdocs\u002Fbusiness","fr\u002Fdocs\u002F4.business",[71,75,79,83,87,91],{"title":72,"path":73,"stem":74},"Handlers","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fhandlers","fr\u002Fdocs\u002F4.business\u002F1.handlers",{"title":76,"path":77,"stem":78},"Presenters","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fpresenters","fr\u002Fdocs\u002F4.business\u002F2.presenters",{"title":80,"path":81,"stem":82},"Collectors","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fcollectors","fr\u002Fdocs\u002F4.business\u002F3.collectors",{"title":84,"path":85,"stem":86},"Erreurs","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ferrors","fr\u002Fdocs\u002F4.business\u002F4.errors",{"title":88,"path":89,"stem":90},"Seeds","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fseeds","fr\u002Fdocs\u002F4.business\u002F5.seeds",{"title":92,"path":93,"stem":94},"Les faits","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ffacts","fr\u002Fdocs\u002F4.business\u002F6.facts",{"title":96,"path":97,"stem":98,"children":99,"page":44},"Client","\u002Ffr\u002Fdocs\u002Fclient","fr\u002Fdocs\u002F5.client",[100,104,108,112],{"title":101,"path":102,"stem":103},"Queries & commands","\u002Ffr\u002Fdocs\u002Fclient\u002Fqueries-commands","fr\u002Fdocs\u002F5.client\u002F1.queries-commands",{"title":105,"path":106,"stem":107},"Formulaires","\u002Ffr\u002Fdocs\u002Fclient\u002Fforms","fr\u002Fdocs\u002F5.client\u002F2.forms",{"title":109,"path":110,"stem":111},"Session","\u002Ffr\u002Fdocs\u002Fclient\u002Fsession","fr\u002Fdocs\u002F5.client\u002F3.session",{"title":113,"path":114,"stem":115},"invoke","\u002Ffr\u002Fdocs\u002Fclient\u002Finvoke","fr\u002Fdocs\u002F5.client\u002F4.invoke",{"title":117,"path":118,"stem":119,"children":120,"page":44},"Infrastructure","\u002Ffr\u002Fdocs\u002Finfra","fr\u002Fdocs\u002F6.infra",[121,125,129,133],{"title":122,"path":123,"stem":124},"Le gradient","\u002Ffr\u002Fdocs\u002Finfra\u002Fgradient","fr\u002Fdocs\u002F6.infra\u002F1.gradient",{"title":126,"path":127,"stem":128},"Surfaces — REST & GraphQL","\u002Ffr\u002Fdocs\u002Finfra\u002Fsurfaces","fr\u002Fdocs\u002F6.infra\u002F2.surfaces",{"title":130,"path":131,"stem":132},"Déploiement","\u002Ffr\u002Fdocs\u002Finfra\u002Fdeployment","fr\u002Fdocs\u002F6.infra\u002F3.deployment",{"title":134,"path":135,"stem":136},"Hôtes","\u002Ffr\u002Fdocs\u002Finfra\u002Fhosts","fr\u002Fdocs\u002F6.infra\u002F4.hosts",{"id":138,"title":134,"body":139,"description":962,"extension":963,"meta":964,"navigation":642,"path":135,"seo":965,"stem":136,"__hash__":966},"docs_fr\u002Ffr\u002Fdocs\u002F6.infra\u002F4.hosts.md",{"type":140,"value":141,"toc":954},"minimark",[142,146,163,170,175,286,307,311,330,439,455,462,465,469,476,482,568,590,602,714,721,726,730,745,766,769,773,780,788,804,849,919,922,928,932,950],[143,144,134],"h1",{"id":145},"hôtes",[147,148,149,150,154,155,159,160,162],"p",{},"Un ",[151,152,153],"strong",{},"hôte",", c'est ce qui sert le HTTP : Nuxt, Next, TanStack Start, React Router,\nSvelteKit, Express. Une Frond ignore lequel la fait tourner, et rien dans ",[156,157,158],"code",{},"fronds\u002F","\nn'en importe un — les six démos de ce dépôt partagent un dossier ",[156,161,158],{}," identique à\nl'octet près.",[147,164,165,166,169],{},"Ce qu'un hôte fait, c'est monter trois portes et, s'il rend des pages, offrir les quatre\nprimitives client. Tout le reste — le boot, le juge, la table REST, le contrat de\nformulaire — vit dans ",[156,167,168],{},"@fougere\u002Fapp"," et ne change pas.",[171,172,174],"h2",{"id":173},"ce-que-coûte-chaque-hôte","Ce que coûte chaque hôte",[176,177,178,194],"table",{},[179,180,181],"thead",{},[182,183,184,188,191],"tr",{},[185,186,187],"th",{},"Hôte",[185,189,190],{},"Paquet",[185,192,193],{},"Ce que vous écrivez",[195,196,197,214,230,244,256,272],"tbody",{},[182,198,199,203,208],{},[200,201,202],"td",{},"Nuxt",[200,204,205],{},[156,206,207],{},"@fougere\u002Fnuxt",[200,209,210,211],{},"une ligne dans ",[156,212,213],{},"nuxt.config",[182,215,216,219,224],{},[200,217,218],{},"Next",[200,220,221],{},[156,222,223],{},"@fougere\u002Fnext",[200,225,226,227],{},"trois fichiers de route d'une ligne + ",[156,228,229],{},"withFougere()",[182,231,232,235,241],{},[200,233,234],{},"TanStack Start",[200,236,237],{},[238,239,240],"em",{},"aucun",[200,242,243],{},"trois fichiers de route + le plugin Vite",[182,245,246,249,253],{},[200,247,248],{},"React Router",[200,250,251],{},[238,252,240],{},[200,254,255],{},"trois routes ressource + le plugin Vite",[182,257,258,261,265],{},[200,259,260],{},"SvelteKit",[200,262,263],{},[238,264,240],{},[200,266,267,268,271],{},"trois ",[156,269,270],{},"+server.ts"," + le plugin Vite",[182,273,274,277,281],{},[200,275,276],{},"Express",[200,278,279],{},[238,280,240],{},[200,282,283],{},[156,284,285],{},"app.use(fougere())",[147,287,288,289,292,293,296,297,299,300,303,304,306],{},"Trois hôtes n'ont besoin d'aucun paquet, et ce n'est pas un hasard : ils servent des\n",[156,290,291],{},"Request","\u002F",[156,294,295],{},"Response"," standard, donc les portes s'y branchent telles quelles.\n",[156,298,223],{}," existe parce que Next a ",[156,301,302],{},"next\u002Fheaders"," — un seul import — et le module\nNuxt est plus gros parce qu'un événement h3 n'est pas une ",[156,305,291],{},".",[171,308,310],{"id":309},"ce-quune-app-publie","Ce qu'une app publie",[147,312,313,314,317,318,321,322,325,326,329],{},"Quels adaptateurs de protocole sont servis est un fait sur l'",[151,315,316],{},"app",", déclaré une fois\nà côté de ",[156,319,320],{},"db",", ",[156,323,324],{},"remotes"," et ",[156,327,328],{},"auth"," :",[331,332,337],"pre",{"className":333,"code":334,"language":335,"meta":336,"style":336},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","\u002F\u002F fougere.config.ts\nexport default defineFougere({\n  db: 'sqlite',\n  adapters: { rest: true, graphql: true },\n});\n","ts","",[156,338,339,348,370,394,427],{"__ignoreMap":336},[340,341,344],"span",{"class":342,"line":343},"line",1,[340,345,347],{"class":346},"sutJx","\u002F\u002F fougere.config.ts\n",[340,349,351,355,358,362,366],{"class":342,"line":350},2,[340,352,354],{"class":353},"sVHd0","export",[340,356,357],{"class":353}," default",[340,359,361],{"class":360},"sGLFI"," defineFougere",[340,363,365],{"class":364},"su5hD","(",[340,367,369],{"class":368},"sP7_E","{\n",[340,371,373,377,380,384,388,391],{"class":342,"line":372},3,[340,374,376],{"class":375},"skxfh","  db",[340,378,379],{"class":368},":",[340,381,383],{"class":382},"sjJ54"," '",[340,385,387],{"class":386},"s_sjI","sqlite",[340,389,390],{"class":382},"'",[340,392,393],{"class":368},",\n",[340,395,397,400,402,405,408,410,414,417,420,422,424],{"class":342,"line":396},4,[340,398,399],{"class":375},"  adapters",[340,401,379],{"class":368},[340,403,404],{"class":368}," {",[340,406,407],{"class":375}," rest",[340,409,379],{"class":368},[340,411,413],{"class":412},"syTEX"," true",[340,415,416],{"class":368},",",[340,418,419],{"class":375}," graphql",[340,421,379],{"class":368},[340,423,413],{"class":412},[340,425,426],{"class":368}," },\n",[340,428,430,433,436],{"class":342,"line":429},5,[340,431,432],{"class":368},"}",[340,434,435],{"class":364},")",[340,437,438],{"class":368},";\n",[147,440,441,444,445,321,448,325,451,454],{},[156,442,443],{},"graphql: true"," est toute la configuration GraphQL : le schéma est construit depuis les\nentités que l'app a déjà scannées, donc il n'y a ni builder à monter ni types à\nenregistrer. ",[156,446,447],{},"@fougere\u002Fadapter-graphql",[156,449,450],{},"@pothos\u002Fcore",[156,452,453],{},"graphql"," ne sont importés que\nsi vous le déclarez — une app qui n'en sert pas ne transporte pas un constructeur de\nschéma pour le découvrir.",[147,456,457,458,461],{},"Absent veut dire non servi. La porte peut être montée — le fichier de route existe, le\nmiddleware est installé — elle déclinera quand même, parce que ce n'est pas à l'hôte de\ndécider. ",[156,459,460],{},"serveRest"," lit la déclaration lui-même, donc les six hôtes héritent d'une\nseule réponse au lieu de l'épeler chacun à sa façon.",[147,463,464],{},"L'enveloppe n'y figure pas : c'est le fil que les primitives client utilisent, pas une\nprojection qu'une app choisit de publier.",[171,466,468],{"id":467},"monter-les-portes","Monter les portes",[147,470,471,472,475],{},"Monter une porte n'est pas publier un adaptateur : ce que vous écrivez ci-dessous met\nla porte en place, et ",[156,473,474],{},"adapters:"," décide si elle sert quelque chose.",[147,477,478,481],{},[151,479,480],{},"Un hôte au standard Web"," — Next, TanStack Start, React Router, SvelteKit — monte les\nhandlers directement :",[331,483,485],{"className":333,"code":484,"language":335,"meta":336,"style":336},"\u002F\u002F SvelteKit — src\u002Froutes\u002F_fougere\u002Fcall\u002F+server.ts\nimport { fougereCall } from '@fougere\u002Fapp\u002Fweb';\nexport const POST = ({ request }: { request: Request }) => fougereCall(request);\n",[156,486,487,492,517],{"__ignoreMap":336},[340,488,489],{"class":342,"line":343},[340,490,491],{"class":346},"\u002F\u002F SvelteKit — src\u002Froutes\u002F_fougere\u002Fcall\u002F+server.ts\n",[340,493,494,497,499,502,505,508,510,513,515],{"class":342,"line":350},[340,495,496],{"class":353},"import",[340,498,404],{"class":368},[340,500,501],{"class":364}," fougereCall",[340,503,504],{"class":368}," }",[340,506,507],{"class":353}," from",[340,509,383],{"class":382},[340,511,512],{"class":386},"@fougere\u002Fapp\u002Fweb",[340,514,390],{"class":382},[340,516,438],{"class":368},[340,518,519,521,525,529,533,536,540,542,544,546,549,551,555,558,561,563,566],{"class":342,"line":372},[340,520,354],{"class":353},[340,522,524],{"class":523},"sbsja"," const",[340,526,528],{"class":527},"sfCm-"," POST",[340,530,532],{"class":531},"smGrS"," =",[340,534,535],{"class":368}," ({",[340,537,539],{"class":538},"s99_P"," request",[340,541,504],{"class":368},[340,543,379],{"class":531},[340,545,404],{"class":368},[340,547,539],{"class":548},"sucvu",[340,550,379],{"class":531},[340,552,554],{"class":553},"sbgvK"," Request",[340,556,557],{"class":368}," })",[340,559,560],{"class":523}," =>",[340,562,501],{"class":360},[340,564,565],{"class":364},"(request)",[340,567,438],{"class":368},[147,569,570,321,573,325,576,579,580,582,583,585,586,589],{},[156,571,572],{},"fougereCall",[156,574,575],{},"fougereRest",[156,577,578],{},"fougereSession"," prennent une ",[156,581,291],{}," et rendent une\n",[156,584,295],{},". Le fichier que vous créez ",[151,587,588],{},"est"," le consentement : pas de fichier, pas de porte.",[147,591,592,594,595,598,599,329],{},[151,593,276],{}," les ajoute en middlewares, comme ",[156,596,597],{},"express.json()"," ou ",[156,600,601],{},"cors()",[331,603,605],{"className":333,"code":604,"language":335,"meta":336,"style":336},"import { fougere, fougereCall, fougereRest } from '@fougere\u002Fapp\u002Fexpress';\n\napp.use(fougere());                 \u002F\u002F les trois portes\napp.use(fougereCall());             \u002F\u002F ou une par une — l'enveloppe sert vos pages,\napp.use('\u002Fadmin', fougereRest());   \u002F\u002F REST est publique. Ce n'est pas une seule décision.\n",[156,606,607,638,644,667,686],{"__ignoreMap":336},[340,608,609,611,613,616,618,620,622,625,627,629,631,634,636],{"class":342,"line":343},[340,610,496],{"class":353},[340,612,404],{"class":368},[340,614,615],{"class":364}," fougere",[340,617,416],{"class":368},[340,619,501],{"class":364},[340,621,416],{"class":368},[340,623,624],{"class":364}," fougereRest",[340,626,504],{"class":368},[340,628,507],{"class":353},[340,630,383],{"class":382},[340,632,633],{"class":386},"@fougere\u002Fapp\u002Fexpress",[340,635,390],{"class":382},[340,637,438],{"class":368},[340,639,640],{"class":342,"line":350},[340,641,643],{"emptyLinePlaceholder":642},true,"\n",[340,645,646,648,650,653,655,658,661,664],{"class":342,"line":372},[340,647,316],{"class":364},[340,649,306],{"class":368},[340,651,652],{"class":360},"use",[340,654,365],{"class":364},[340,656,657],{"class":360},"fougere",[340,659,660],{"class":364},"())",[340,662,663],{"class":368},";",[340,665,666],{"class":346},"                 \u002F\u002F les trois portes\n",[340,668,669,671,673,675,677,679,681,683],{"class":342,"line":396},[340,670,316],{"class":364},[340,672,306],{"class":368},[340,674,652],{"class":360},[340,676,365],{"class":364},[340,678,572],{"class":360},[340,680,660],{"class":364},[340,682,663],{"class":368},[340,684,685],{"class":346},"             \u002F\u002F ou une par une — l'enveloppe sert vos pages,\n",[340,687,688,690,692,694,696,698,701,703,705,707,709,711],{"class":342,"line":429},[340,689,316],{"class":364},[340,691,306],{"class":368},[340,693,652],{"class":360},[340,695,365],{"class":364},[340,697,390],{"class":382},[340,699,700],{"class":386},"\u002Fadmin",[340,702,390],{"class":382},[340,704,416],{"class":368},[340,706,624],{"class":360},[340,708,660],{"class":364},[340,710,663],{"class":368},[340,712,713],{"class":346},"   \u002F\u002F REST est publique. Ce n'est pas une seule décision.\n",[147,715,716,717,720],{},"Un chemin que Fougere ne sert pas appelle ",[156,718,719],{},"next()",", donc les routes de l'app\ncontinuent de répondre, qu'elles soient déclarées avant ou après.",[147,722,723,725],{},[151,724,202],{}," les monte lui-même — son module a une API pour ça, et il ajoute les composables\nau passage.",[171,727,729],{"id":728},"les-primitives-client","Les primitives client",[147,731,732,321,735,321,738,325,741,744],{},[156,733,734],{},"useQuery",[156,736,737],{},"useCommand",[156,739,740],{},"useFormFor",[156,742,743],{},"useCurrentUser"," existent par framework d'UI, pas\npar hôte :",[746,747,748,755,761],"ul",{},[749,750,751,754],"li",{},[156,752,753],{},"@fougere\u002Freact"," — React, quel que soit ce qui le rend",[749,756,757,760],{},[156,758,759],{},"@fougere\u002Fsvelte"," — Svelte, sous forme de stores",[749,762,763,765],{},[156,764,207],{}," — Vue, via la couche données de Nuxt",[147,767,768],{},"Les règles qu'elles suivent sont communes : la désignation est classe + verbe, et une\ncommande sur une entité revalide toutes les requêtes montées sur cette entité. Seul le\nmodèle d'état change.",[171,770,772],{"id":771},"la-seule-chose-à-dire-à-tout-bundler","La seule chose à dire à tout bundler",[147,774,775,776,779],{},"La désignation lit le nom de classe de l'entité, et ce nom voyage — c'est la méthode\nJSON-RPC (",[156,777,778],{},"post.list",") et le chemin REST. Un minifieur renomme les classes, donc un build\nde production désignerait une entité que personne n'héberge :",[331,781,786],{"className":782,"code":784,"language":785},[783],"language-text","Entity 'j' is not hosted here. Hosted here: post.\n","text",[156,787,784],{"__ignoreMap":336},[147,789,790,791,325,793,796,797,800,801,803],{},"Vous n'avez rien à déclarer pour autant. ",[156,792,207],{},[156,794,795],{},"@fougere\u002Fvite"," réservent les\nnoms d'entités pour vous — le premier depuis le scan qu'il vient de faire, le second en\nlisant ",[156,798,799],{},"fronds\u002F\u003Cfrond>\u002Fentities\u002F",". Sur Next, ",[156,802,229],{}," fait la même chose via webpack :",[331,805,807],{"className":333,"code":806,"language":335,"meta":336,"style":336},"\u002F\u002F next.config.mjs\nimport { withFougere } from '@fougere\u002Fnext\u002Fconfig';\nexport default withFougere();\n",[156,808,809,814,836],{"__ignoreMap":336},[340,810,811],{"class":342,"line":343},[340,812,813],{"class":346},"\u002F\u002F next.config.mjs\n",[340,815,816,818,820,823,825,827,829,832,834],{"class":342,"line":350},[340,817,496],{"class":353},[340,819,404],{"class":368},[340,821,822],{"class":364}," withFougere",[340,824,504],{"class":368},[340,826,507],{"class":353},[340,828,383],{"class":382},[340,830,831],{"class":386},"@fougere\u002Fnext\u002Fconfig",[340,833,390],{"class":382},[340,835,438],{"class":368},[340,837,838,840,842,844,847],{"class":342,"line":372},[340,839,354],{"class":353},[340,841,357],{"class":353},[340,843,822],{"class":360},[340,845,846],{"class":364},"()",[340,848,438],{"class":368},[331,850,852],{"className":333,"code":851,"language":335,"meta":336,"style":336},"\u002F\u002F vite.config.ts — TanStack Start, React Router, SvelteKit\nimport { fougere } from '@fougere\u002Fvite';\nexport default defineConfig({ plugins: [fougere(), sveltekit()] });\n",[156,853,854,859,879],{"__ignoreMap":336},[340,855,856],{"class":342,"line":343},[340,857,858],{"class":346},"\u002F\u002F vite.config.ts — TanStack Start, React Router, SvelteKit\n",[340,860,861,863,865,867,869,871,873,875,877],{"class":342,"line":350},[340,862,496],{"class":353},[340,864,404],{"class":368},[340,866,615],{"class":364},[340,868,504],{"class":368},[340,870,507],{"class":353},[340,872,383],{"class":382},[340,874,795],{"class":386},[340,876,390],{"class":382},[340,878,438],{"class":368},[340,880,881,883,885,888,890,893,896,898,901,903,905,907,910,913,915,917],{"class":342,"line":372},[340,882,354],{"class":353},[340,884,357],{"class":353},[340,886,887],{"class":360}," defineConfig",[340,889,365],{"class":364},[340,891,892],{"class":368},"{",[340,894,895],{"class":375}," plugins",[340,897,379],{"class":368},[340,899,900],{"class":364}," [",[340,902,657],{"class":360},[340,904,846],{"class":364},[340,906,416],{"class":368},[340,908,909],{"class":360}," sveltekit",[340,911,912],{"class":364},"()] ",[340,914,432],{"class":368},[340,916,435],{"class":364},[340,918,438],{"class":368},[147,920,921],{},"Express n'a besoin de rien : il exécute vos sources, rien n'est minifié.",[923,924,925],"callout",{},[147,926,927],{},"Une app qui minifie sans l'un de ces réglages se construira sans erreur et échouera au\npremier appel. L'échec est bruyant — le serveur dit quelle entité il héberge vraiment —\nmais il arrive en production, pas au build.",[171,929,931],{"id":930},"deux-hôtes-à-la-fois","Deux hôtes à la fois",[147,933,934,935,938,939,942,943,949],{},"Rien n'empêche une Frond d'être servie par plusieurs hôtes : faites-la tourner dans son\npropre process avec ",[156,936,937],{},"serve()",", et que les autres l'atteignent par ",[156,940,941],{},"remotes:",". C'est le\n",[238,944,945],{},[946,947,948],"a",{"href":123},"gradient",", et l'hôte n'entre pas dans la décision.",[951,952,953],"style",{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sfCm-, html code.shiki .sfCm-{--shiki-light:#90A4AE;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .sucvu, html code.shiki .sucvu{--shiki-light:#E53935;--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":336,"searchDepth":350,"depth":350,"links":955},[956,957,958,959,960,961],{"id":173,"depth":350,"text":174},{"id":309,"depth":350,"text":310},{"id":467,"depth":350,"text":468},{"id":728,"depth":350,"text":729},{"id":771,"depth":350,"text":772},{"id":930,"depth":350,"text":931},"Faire tourner la même Frond sous Nuxt, Next, TanStack Start, React Router, SvelteKit ou Express.","md",{},{"title":134,"description":962},"0wXTLpJplllOXFoXeVh9PCVFWylXv6h_J64mtBAqj1U",1786637820145]