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