[{"data":1,"prerenderedAt":1136},["ShallowReactive",2],{"docs-nav:fr":3,"docs:\u002Ffr\u002Fdocs\u002Finfra\u002Fgradient":137},[4],{"title":5,"path":6,"stem":7,"children":8,"page":44},"Fr","\u002Ffr","fr",[9],{"title":10,"path":11,"stem":12,"children":13,"page":-1},"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":122,"body":139,"description":1131,"extension":1132,"meta":1133,"navigation":504,"path":123,"seo":1134,"stem":124,"__hash__":1135},"docs_fr\u002Ffr\u002Fdocs\u002F6.infra\u002F1.gradient.md",{"type":140,"value":141,"toc":1120},"minimark",[142,146,150,155,240,247,276,280,291,310,314,321,758,773,784,788,795,841,848,851,855,930,934,940,943,947,965,968,1023,1032,1036,1049,1055,1061,1090,1093,1099,1103,1109,1116],[143,144,122],"h1",{"id":145},"le-gradient",[147,148,149],"p",{},"Le gradient permet de faire passer une Frond d'une exécution locale à un processus distant\nsans modifier son code métier ni les pages qui l'appellent.",[151,152,154],"h2",{"id":153},"lénoncé-de-topologie","L'énoncé de topologie",[156,157,162],"pre",{"className":158,"code":159,"language":160,"meta":161,"style":161},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","\u002F\u002F fougere.config.ts\nexport default defineFougere({\n  remotes: { blog: 'http:\u002F\u002F127.0.0.1:4100' },\n});\n","ts","",[163,164,165,174,196,228],"code",{"__ignoreMap":161},[166,167,170],"span",{"class":168,"line":169},"line",1,[166,171,173],{"class":172},"sutJx","\u002F\u002F fougere.config.ts\n",[166,175,177,181,184,188,192],{"class":168,"line":176},2,[166,178,180],{"class":179},"sVHd0","export",[166,182,183],{"class":179}," default",[166,185,187],{"class":186},"sGLFI"," defineFougere",[166,189,191],{"class":190},"su5hD","(",[166,193,195],{"class":194},"sP7_E","{\n",[166,197,199,203,206,209,212,214,218,222,225],{"class":168,"line":198},3,[166,200,202],{"class":201},"skxfh","  remotes",[166,204,205],{"class":194},":",[166,207,208],{"class":194}," {",[166,210,211],{"class":201}," blog",[166,213,205],{"class":194},[166,215,217],{"class":216},"sjJ54"," '",[166,219,221],{"class":220},"s_sjI","http:\u002F\u002F127.0.0.1:4100",[166,223,224],{"class":216},"'",[166,226,227],{"class":194}," },\n",[166,229,231,234,237],{"class":168,"line":230},4,[166,232,233],{"class":194},"}",[166,235,236],{"class":190},")",[166,238,239],{"class":194},";\n",[147,241,242,243,246],{},"Une Frond déclarée dans ",[163,244,245],{},"remotes"," reste scannée : ses entités fournissent toujours les\nmétadonnées utilisées par les formulaires, la validation et la DI. Ses opérations sont en\nrevanche exécutées à l'adresse distante. Retirer cette ligne rétablit l'exécution locale.\nLa démo multi-Frond couvre les deux configurations, y compris en build de production :",[156,248,252],{"className":249,"code":250,"language":251,"meta":161,"style":161},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","pnpm dev:blog      # la Frond blog seule, dans son process (:4100)\npnpm dev           # l'app — la consomme via la ligne remotes\n","bash",[163,253,254,266],{"__ignoreMap":161},[166,255,256,260,263],{"class":168,"line":169},[166,257,259],{"class":258},"sbgvK","pnpm",[166,261,262],{"class":220}," dev:blog",[166,264,265],{"class":172},"      # la Frond blog seule, dans son process (:4100)\n",[166,267,268,270,273],{"class":168,"line":176},[166,269,259],{"class":258},[166,271,272],{"class":220}," dev",[166,274,275],{"class":172},"           # l'app — la consomme via la ligne remotes\n",[151,277,279],{"id":278},"le-contrat-dappel","Le contrat d'appel",[147,281,282,283,286,287,290],{},"Un appel est une valeur : ",[163,284,285],{},"(entity, operation, invocation)"," avec\n",[163,288,289],{},"invocation = { params, query, body, state }",".",[292,293,294,301,307],"ul",{},[295,296,297,300],"li",{},[163,298,299],{},"createLocalRunner"," exécute strictement en local ;",[295,302,303,306],{},[163,304,305],{},"createAppRunner"," suit la topologie — façades locales, doublures distantes ;",[295,308,309],{},"les transports sérialisent cette valeur sans changer sa structure.",[151,311,313],{"id":312},"le-format-du-fil","Le format du fil",[147,315,316,317,320],{},"Process-à-process, c'est JSON-RPC 2.0 sur ",[163,318,319],{},"POST \u002F_fougere\u002Fcall"," :",[156,322,326],{"className":323,"code":324,"language":325,"meta":161,"style":161},"language-jsonc shiki shiki-themes material-theme-lighter github-light github-dark","\u002F\u002F → requête\n{ \"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"post.publish\",\n  \"params\": { \"params\": { \"id\": \"…\" }, \"query\": {}, \"body\": null, \"state\": { \"user\": { … } } } }\n\n\u002F\u002F ← succès\n{ \"jsonrpc\": \"2.0\", \"id\": 1, \"result\": { \"id\": \"…\", \"status\": \"published\", … } }\n\n\u002F\u002F ← échec métier — ravivé en FougereError côté appelant\n{ \"jsonrpc\": \"2.0\", \"id\": 1, \"error\": { \"code\": -32000,\n    \"data\": { \"code\": \"CONFLICT\", \"message\": \"Déjà publié\",\n              \"entity\": \"post\", \"operation\": \"publish\" } } }\n","jsonc",[163,327,328,333,395,500,506,512,596,601,607,664,714],{"__ignoreMap":161},[166,329,330],{"class":168,"line":169},[166,331,332],{"class":172},"\u002F\u002F → requête\n",[166,334,335,338,342,346,349,351,353,356,358,361,363,366,368,370,374,376,378,381,383,385,387,390,392],{"class":168,"line":176},[166,336,337],{"class":194},"{",[166,339,341],{"class":340},"s39Yj"," \"",[166,343,345],{"class":344},"sseR_","jsonrpc",[166,347,348],{"class":340},"\"",[166,350,205],{"class":194},[166,352,341],{"class":216},[166,354,355],{"class":220},"2.0",[166,357,348],{"class":216},[166,359,360],{"class":194},",",[166,362,341],{"class":340},[166,364,365],{"class":344},"id",[166,367,348],{"class":340},[166,369,205],{"class":194},[166,371,373],{"class":372},"srdBf"," 1",[166,375,360],{"class":194},[166,377,341],{"class":340},[166,379,380],{"class":344},"method",[166,382,348],{"class":340},[166,384,205],{"class":194},[166,386,341],{"class":216},[166,388,389],{"class":220},"post.publish",[166,391,348],{"class":216},[166,393,394],{"class":194},",\n",[166,396,397,400,403,405,407,409,411,414,416,418,420,422,424,426,428,430,433,435,438,440,443,445,447,450,452,455,457,459,462,464,466,469,471,473,475,477,480,482,484,486,490,493,495,497],{"class":168,"line":198},[166,398,399],{"class":340},"  \"",[166,401,402],{"class":344},"params",[166,404,348],{"class":340},[166,406,205],{"class":194},[166,408,208],{"class":194},[166,410,341],{"class":340},[166,412,402],{"class":413},"sZMiF",[166,415,348],{"class":340},[166,417,205],{"class":194},[166,419,208],{"class":194},[166,421,341],{"class":340},[166,423,365],{"class":372},[166,425,348],{"class":340},[166,427,205],{"class":194},[166,429,341],{"class":216},[166,431,432],{"class":220},"…",[166,434,348],{"class":216},[166,436,437],{"class":194}," },",[166,439,341],{"class":340},[166,441,442],{"class":413},"query",[166,444,348],{"class":340},[166,446,205],{"class":194},[166,448,449],{"class":194}," {},",[166,451,341],{"class":340},[166,453,454],{"class":413},"body",[166,456,348],{"class":340},[166,458,205],{"class":194},[166,460,461],{"class":340}," null",[166,463,360],{"class":194},[166,465,341],{"class":340},[166,467,468],{"class":413},"state",[166,470,348],{"class":340},[166,472,205],{"class":194},[166,474,208],{"class":194},[166,476,341],{"class":340},[166,478,479],{"class":372},"user",[166,481,348],{"class":340},[166,483,205],{"class":194},[166,485,208],{"class":194},[166,487,489],{"class":488},"srjyR"," …",[166,491,492],{"class":194}," }",[166,494,492],{"class":194},[166,496,492],{"class":194},[166,498,499],{"class":194}," }\n",[166,501,502],{"class":168,"line":230},[166,503,505],{"emptyLinePlaceholder":504},true,"\n",[166,507,509],{"class":168,"line":508},5,[166,510,511],{"class":172},"\u002F\u002F ← succès\n",[166,513,515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,545,547,550,552,554,556,558,560,562,564,566,568,570,572,574,577,579,581,583,586,588,590,592,594],{"class":168,"line":514},6,[166,516,337],{"class":194},[166,518,341],{"class":340},[166,520,345],{"class":344},[166,522,348],{"class":340},[166,524,205],{"class":194},[166,526,341],{"class":216},[166,528,355],{"class":220},[166,530,348],{"class":216},[166,532,360],{"class":194},[166,534,341],{"class":340},[166,536,365],{"class":344},[166,538,348],{"class":340},[166,540,205],{"class":194},[166,542,373],{"class":372},[166,544,360],{"class":194},[166,546,341],{"class":340},[166,548,549],{"class":344},"result",[166,551,348],{"class":340},[166,553,205],{"class":194},[166,555,208],{"class":194},[166,557,341],{"class":340},[166,559,365],{"class":413},[166,561,348],{"class":340},[166,563,205],{"class":194},[166,565,341],{"class":216},[166,567,432],{"class":220},[166,569,348],{"class":216},[166,571,360],{"class":194},[166,573,341],{"class":340},[166,575,576],{"class":413},"status",[166,578,348],{"class":340},[166,580,205],{"class":194},[166,582,341],{"class":216},[166,584,585],{"class":220},"published",[166,587,348],{"class":216},[166,589,360],{"class":194},[166,591,489],{"class":488},[166,593,492],{"class":194},[166,595,499],{"class":194},[166,597,599],{"class":168,"line":598},7,[166,600,505],{"emptyLinePlaceholder":504},[166,602,604],{"class":168,"line":603},8,[166,605,606],{"class":172},"\u002F\u002F ← échec métier — ravivé en FougereError côté appelant\n",[166,608,610,612,614,616,618,620,622,624,626,628,630,632,634,636,638,640,642,645,647,649,651,653,655,657,659,662],{"class":168,"line":609},9,[166,611,337],{"class":194},[166,613,341],{"class":340},[166,615,345],{"class":344},[166,617,348],{"class":340},[166,619,205],{"class":194},[166,621,341],{"class":216},[166,623,355],{"class":220},[166,625,348],{"class":216},[166,627,360],{"class":194},[166,629,341],{"class":340},[166,631,365],{"class":344},[166,633,348],{"class":340},[166,635,205],{"class":194},[166,637,373],{"class":372},[166,639,360],{"class":194},[166,641,341],{"class":340},[166,643,644],{"class":344},"error",[166,646,348],{"class":340},[166,648,205],{"class":194},[166,650,208],{"class":194},[166,652,341],{"class":340},[166,654,163],{"class":413},[166,656,348],{"class":340},[166,658,205],{"class":194},[166,660,661],{"class":372}," -32000",[166,663,394],{"class":194},[166,665,667,670,673,675,677,679,681,683,685,687,689,692,694,696,698,701,703,705,707,710,712],{"class":168,"line":666},10,[166,668,669],{"class":340},"    \"",[166,671,672],{"class":413},"data",[166,674,348],{"class":340},[166,676,205],{"class":194},[166,678,208],{"class":194},[166,680,341],{"class":340},[166,682,163],{"class":372},[166,684,348],{"class":340},[166,686,205],{"class":194},[166,688,341],{"class":216},[166,690,691],{"class":220},"CONFLICT",[166,693,348],{"class":216},[166,695,360],{"class":194},[166,697,341],{"class":340},[166,699,700],{"class":372},"message",[166,702,348],{"class":340},[166,704,205],{"class":194},[166,706,341],{"class":216},[166,708,709],{"class":220},"Déjà publié",[166,711,348],{"class":216},[166,713,394],{"class":194},[166,715,717,720,723,725,727,729,732,734,736,738,741,743,745,747,750,752,754,756],{"class":168,"line":716},11,[166,718,719],{"class":340},"              \"",[166,721,722],{"class":372},"entity",[166,724,348],{"class":340},[166,726,205],{"class":194},[166,728,341],{"class":216},[166,730,731],{"class":220},"post",[166,733,348],{"class":216},[166,735,360],{"class":194},[166,737,341],{"class":340},[166,739,740],{"class":372},"operation",[166,742,348],{"class":340},[166,744,205],{"class":194},[166,746,341],{"class":216},[166,748,749],{"class":220},"publish",[166,751,348],{"class":216},[166,753,492],{"class":194},[166,755,492],{"class":194},[166,757,499],{"class":194},[147,759,760,762,763,766,767,769,770,772],{},[163,761,380],{}," est ",[163,764,765],{},"entity.op"," et ",[163,768,402],{}," contient l'invocation. Le navigateur envoie la même\ntrame à Nitro, mais son ",[163,771,468],{}," est ignoré et reconstruit côté serveur.",[147,774,775,776,779,780,783],{},"L'autre moitié du contrat est ce qu'un hôte répond à ",[163,777,778],{},"rpc.discover"," : voir\n",[781,782,59],"a",{"href":60},", qui spécifie le document et ce qu'il faut\nhonorer pour écrire une Frond dans un autre langage.",[151,785,787],{"id":786},"le-saut-est-en-loopback-par-défaut","Le saut est en loopback par défaut",[147,789,790,791,794],{},"Le récepteur écoute ",[163,792,793],{},"127.0.0.1"," et plafonne les corps à 1 Mio. L'élargir est une option :",[156,796,798],{"className":158,"code":797,"language":160,"meta":161,"style":161},"await serve(runner, { hosts: ['0.0.0.0'] })   \u002F\u002F un conteneur, qui le dit\n",[163,799,800],{"__ignoreMap":161},[166,801,802,805,808,811,813,815,818,820,823,825,828,830,833,835,838],{"class":168,"line":169},[166,803,804],{"class":179},"await",[166,806,807],{"class":186}," serve",[166,809,810],{"class":190},"(runner",[166,812,360],{"class":194},[166,814,208],{"class":194},[166,816,817],{"class":201}," hosts",[166,819,205],{"class":194},[166,821,822],{"class":190}," [",[166,824,224],{"class":216},[166,826,827],{"class":220},"0.0.0.0",[166,829,224],{"class":216},[166,831,832],{"class":190},"] ",[166,834,233],{"class":194},[166,836,837],{"class":190},")   ",[166,839,840],{"class":172},"\u002F\u002F un conteneur, qui le dit\n",[147,842,843,844,847],{},"Le défaut n'est pas de la prudence, et l'option n'est pas un trou : c'est l'endroit où un\nfait rencontre un déploiement. Un récepteur lit l'identité de l'appelant sur le fil et ne\nla rétablit pas, donc quiconque atteint le port peut se dire n'importe quel utilisateur.\nEn loopback, cet ensemble vaut « cette machine ». Élargissez ",[163,845,846],{},"hosts"," et il devient ce que\nle réseau laisse passer — à l'exploitant de le refermer : pare-feu, sidecar, mesh.",[147,849,850],{},"Authentifier le lien ne le remplacerait pas non plus : un secret partagé dit qu'un process\na le droit d'appeler, jamais au nom de quel utilisateur il parle. L'identité au niveau de\nla Frond est la question ouverte.",[151,852,854],{"id":853},"comportement-après-séparation","Comportement après séparation",[856,857,858,871],"table",{},[859,860,861],"thead",{},[862,863,864,868],"tr",{},[865,866,867],"th",{},"Élément",[865,869,870],{},"Comportement",[872,873,874,883,904,911,922],"tbody",{},[862,875,876,880],{},[877,878,879],"td",{},"résultats",[877,881,882],{},"formes identiques des deux côtés, listes comprises",[862,884,885,888],{},[877,886,887],{},"erreurs",[877,889,890,891,894,895,897,898,766,900,903],{},"même ",[163,892,893],{},"FougereError"," avec ",[163,896,163],{},", ",[163,899,700],{},[163,901,902],{},"details",", reconstruite à l'arrivée",[862,905,906,908],{},[877,907,468],{},[877,909,910],{},"la session de l'app consommatrice atteint les collectors distants",[862,912,913,916],{},[877,914,915],{},"hôte inaccessible",[877,917,918,921],{},[163,919,920],{},"SERVICE_UNAVAILABLE"," typée → statut 503 ; les appels reprennent après le redémarrage de l'hôte",[862,923,924,927],{},[877,925,926],{},"transport",[877,928,929],{},"timeout et retry sur l'enveloppe, sans retry automatique sur une command",[151,931,933],{"id":932},"le-prix-du-split","Le prix du split",[147,935,936,937,939],{},"Le split ajoute un saut HTTP et l'encodage\u002Fdécodage JSON qu'il implique. Un appel reste\nune valeur ",[163,938,285],{}," ; le transport la met sur le fil et l'en\nretire, puis le côté receveur exécute la même façade que le chemin local. Le coût dépend\ndonc du réseau, de la taille de la charge et du runtime : Fougere ne prétend pas le rendre\nnul.",[147,941,942],{},"Aucun chiffre n'est cité ici : ce dépôt ne livre pas de harnais de bench, et un nombre\nqu'on ne peut pas rejouer n'est pas une mesure.",[151,944,946],{"id":945},"où-le-code-vit","Où le code vit",[147,948,949,950,952,953,957,958,960,961,964],{},"Une Frond peut aussi être déplacée dans un dépôt distinct et rester appelée via ",[163,951,245],{},".\nTrois choses s'appellent « ensemble » et une seule est obligatoire : le ",[954,955,956],"strong",{},"contrat"," doit\nvoyager, le ",[954,959,163],{}," non, les ",[954,962,963],{},"ports"," doivent se joindre.",[147,966,967],{},"Deux commandes couvrent le contrat, selon ce que vous voulez partager :",[856,969,970,982],{},[859,971,972],{},[862,973,974,976,979],{},[865,975],{},[865,977,978],{},"Ce qu'elle fait",[865,980,981],{},"Quand",[872,983,984,1003],{},[862,985,986,994,1000],{},[877,987,988],{},[781,989,991],{"href":990},"\u002Ffr\u002Fdocs\u002Fcli#fougere-sync-consommer-une-frond-distante",[163,992,993],{},"fougere sync",[877,995,996,997,999],{},"demande ",[163,998,778],{}," à l'hôte et reconstruit ses entités en local",[877,1001,1002],{},"l'hôte tourne ; c'est aussi la seule voie pour une Frond écrite dans un autre langage",[862,1004,1005,1013,1020],{},[877,1006,1007],{},[781,1008,1010],{"href":1009},"\u002Ffr\u002Fdocs\u002Fcli#fougere-build-frond-publier-les-entit%C3%A9s-dune-frond",[163,1011,1012],{},"fougere build-frond",[877,1014,1015,1016,1019],{},"compile ",[163,1017,1018],{},"entities\u002F**"," en paquet installable",[877,1021,1022],{},"vous publiez le contrat comme une dépendance",[147,1024,1025,1026,1028,1029,290],{},"Le code source de la Frond ne traverse dans aucun des deux cas. Ce qui reste ouvert, ce\nsont les ",[954,1027,963],{}," : voir ",[781,1030,130],{"href":1031},"\u002Ffr\u002Fdocs\u002Finfra\u002Fdeployment#splitter-en-production",[151,1033,1035],{"id":1034},"un-destinataire-et-un-seul","Un destinataire, et un seul",[147,1037,1038,1040,1041,1044,1045,1048],{},[163,1039,245],{}," nomme une adresse par Frond, et ",[163,1042,1043],{},"Facade\u003CT>"," résout exactement une façade —\n",[163,1046,1047],{},"facadeKeyOf"," produit une clé, le conteneur rend un objet. Tout appel dans Fougere a un\ndestinataire unique, par construction.",[147,1050,1051,1052,1054],{},"Ça couvre plus large qu'il n'y paraît. Un appareil derrière un NAT, qu'on ne peut pas\nappeler, déclare quand même ",[163,1053,245],{}," et envoie vers une passerelle qu'il nomme : un\ndestinataire — et le fait qu'il doive ouvrir la connexion lui-même est une propriété de\ndéploiement, pas un autre genre d'appel.",[147,1056,1057,1058,320],{},"Ce qui n'est pas couvert, c'est ",[954,1059,1060],{},"plusieurs destinataires pour un envoi",[856,1062,1063,1072],{},[859,1064,1065],{},[862,1066,1067,1069],{},[865,1068],{},[865,1070,1071],{},"qui détermine les destinataires",[872,1073,1074,1082],{},[862,1075,1076,1079],{},[877,1077,1078],{},"une flotte",[877,1080,1081],{},"l'émetteur nomme l'ensemble",[862,1083,1084,1087],{},[877,1085,1086],{},"un fait — un post a été publié",[877,1088,1089],{},"personne : ceux qui ont déclaré s'y intéresser",[147,1091,1092],{},"Les deux demandent la même machinerie — le fan-out, un canal vers des membres qui ne\nportent pas d'adresse, et un verdict quand trois sur cinq réussissent. Fougere n'a rien de\ntout ça. Donc « un post est publié, la recherche réindexe et la newsletter met en file »\ns'écrit aujourd'hui en nommant les deux à l'endroit qui émet : l'émetteur porte la liste de\ntout ce qui découle de son propre geste, et un troisième lecteur le rouvre.",[147,1094,1095,1096,1098],{},"Cette section existe pour nommer la moitié qui est là. ",[163,1097,245],{}," se lit comme *l'*énoncé de\ntopologie et il en est un sur deux ; l'autre est conçu et non livré. Le dire garde le\nmanque visible plutôt que surprenant.",[151,1100,1102],{"id":1101},"limites","Limites",[147,1104,1105,1106,1108],{},"Le passage à une Frond distante ajoute les pannes et la latence propres au réseau. Fougere\nles expose sous forme d'erreurs typées, mais ne les masque pas. Le mode local reste le mode\nde référence ; ",[163,1107,245],{}," permet de changer la topologie lorsque le besoin apparaît.",[147,1110,1111,1112,1115],{},"Suite : ",[781,1113,1114],{"href":127},"Surfaces"," — les mêmes opérations derrière REST et GraphQL.",[1117,1118,1119],"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 .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 .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srjyR, html code.shiki .srjyR{--shiki-light:#90A4AE;--shiki-light-font-style:inherit;--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}",{"title":161,"searchDepth":176,"depth":176,"links":1121},[1122,1123,1124,1125,1126,1127,1128,1129,1130],{"id":153,"depth":176,"text":154},{"id":278,"depth":176,"text":279},{"id":312,"depth":176,"text":313},{"id":786,"depth":176,"text":787},{"id":853,"depth":176,"text":854},{"id":932,"depth":176,"text":933},{"id":945,"depth":176,"text":946},{"id":1034,"depth":176,"text":1035},{"id":1101,"depth":176,"text":1102},"Configurer une Frond locale ou distante, le protocole utilisé et le coût réseau.","md",{},{"title":122,"description":1131},"3ICc6FD_AIMm43nzX0_I20-dyS-yoOIodLRYsuunqpY",1786637819107]