1"use strict";(self.rspackChunkvext_website=self.rspackChunkvext_website||[]).push([[6254],{9038(e,n,s){s.r(n);var r=s(4848),i=s(8453);function l(e){let n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",span:"span",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.h1,{id:"frontend-configuration",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#frontend-configuration",children:"#"}),"Frontend Configuration"]}),"\n",(0,r.jsxs)(n.p,{children:["This page is a decision guide, not a second copy of every type member. Start\nwith the defaults, configure only the behavior that changes for your product,\nand use the canonical ",(0,r.jsx)(n.a,{href:"/api/config.html#vextfrontendconfig",children:"VextFrontendConfig API reference"}),"\nwhen you need an exact field, default, or nested option."]}),"\n",(0,r.jsxs)(n.h2,{id:"table-of-contents",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#table-of-contents",children:"#"}),"Table of Contents"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#minimal-config",children:"Minimal Config"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#choose-what-to-configure",children:"Choose What to Configure"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#complete-example",children:"Complete Example"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#production-delivery-profiles",children:"Production Delivery Profiles"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#core-fields",children:"Core Fields"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#build-fields",children:"Build Fields"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#deploy-fields",children:"Deploy Fields"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#seo-fields",children:"SEO Fields"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#i18n-fields",children:"I18n Fields"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#dev-fields",children:"Dev Fields"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#spa-fallback-fields",children:"SPA Fallback Fields"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"#verify-a-configuration-change",children:"Verify a Configuration Change"})}),"\n"]}),"\n",(0,r.jsxs)(n.h2,{id:"choose-what-to-configure",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#choose-what-to-configure",children:"#"}),"Choose What to Configure"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"If you needâ¦"}),(0,r.jsx)(n.th,{children:"Start with"}),(0,r.jsx)(n.th,{children:"Configure"}),(0,r.jsx)(n.th,{children:"What changes"}),(0,r.jsx)(n.th,{children:"Verify"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Server-rendered React pages"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend: true"})}),(0,r.jsx)(n.td,{children:"Nothing else"}),(0,r.jsxs)(n.td,{children:["Vext discovers ",(0,r.jsx)(n.code,{children:"src/frontend"}),", builds browser + SSR output, and serves both at the application origin"]}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"vext build"}),", then ",(0,r.jsx)(n.code,{children:"vext start"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"A different source layout"}),(0,r.jsx)(n.td,{children:"Built-in folders"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"root"}),", ",(0,r.jsx)(n.code,{children:"pages"}
1),", ",(0,r.jsx)(n.code,{children:"componentsDir"}),", ",(0,r.jsx)(n.code,{children:"styles.entry"}),", or ",(0,r.jsx)(n.code,{children:"assetsDir"})]}),(0,r.jsx)(n.td,{children:"Only discovery paths change; generated entries remain Vext-owned"}),(0,r.jsx)(n.td,{children:"Build and load one page plus its global style"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"A browser-size or compatibility target"}),(0,r.jsx)(n.td,{children:"Production defaults"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"build"}),", ",(0,r.jsx)(n.code,{children:"vendorChunks"}),", or ",(0,r.jsx)(n.code,{children:"budgets"})]}),(0,r.jsx)(n.td,{children:"esbuild output, report thresholds, or browser support changes"}),(0,r.jsxs)(n.td,{children:["Inspect ",(0,r.jsx)(n.code,{children:"size-report.json"})," and a production page"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CDN-hosted immutable assets"}),(0,r.jsx)(n.td,{children:"Same-origin delivery"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"deploy.assetBaseUrl"})," and optionally ",(0,r.jsx)(n.code,{children:"deploy.upload"})]}),(0,r.jsx)(n.td,{children:"Generated JS/CSS URLs point at the CDN; Node still owns HTML/SSR"}),(0,r.jsx)(n.td,{children:"Dry-run the upload and request an SSR page + hashed asset"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Search-visible public pages"}),(0,r.jsx)(n.td,{children:"SEO disabled"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"seo"}),", plus route/render metadata"]}),(0,r.jsx)(n.td,{children:"Canonical/meta output and optional sitemap/robots become framework-owned"}),(0,r.jsx)(n.td,{children:"Inspect two page canonicals and the selected SEO artifacts"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"A client-router island"}),(0,r.jsx)(n.td,{children:"No fallback capture"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"spaFallback.scopes"})}),(0,r.jsx)(n.td,{children:"Only declared paths are served by the browser shell"}),(0,r.jsxs)(n.td,{children:["Check an in-scope URL and an excluded ",(0,r.jsx)(n.code,{children:"/api/**"})," URL"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Localized page copy"}),(0,r.jsx)(n.td,{children:"Disabled"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"i18n"})}),(0,r.jsx)(n.td,{children:"Locale artifacts and request-aware document language are generated"}),(0,r.jsx)(n.td,{children:"Build and request two locales"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Avoid adding a field merely because it exists. The defaults deliberately keep\nthe runtime small: React + esbuild, SSR on, buffered streaming, browser code\nsplitting on, production browser minification on, and no CDN/upload adapter."}),"\n",(0,r.jsxs)(n.h2,{id:"minimal-config",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#minimal-config",children:"#"}),"Minimal Config"]}),"\n",(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(n.pre,{className:"shiki css-variables",style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0",lang:"ts",children:(0,r.jsxs)(n.code,{children:[(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" default"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" frontend"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{className:"line",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,r.jsxs)(n.p,{children:["Use ",(0,r.jsx)(n.code,{children:"false"})," to disable frontend completely:"]}),"\n",(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(n.pre,{className:"shiki css-variables",style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0",lang:"ts",children:(0,r.jsxs)(n.code,{children:[(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" default"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" frontend"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{className:"line",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"frontend: true"})," uses ",(0,r.jsx)(n.code,{children:"src/frontend"}),", ",(0,r.jsx)(n.code,{children:"pages"}),", ",(0,r.jsx)(n.code,{children:"components"}),",\n",(0,r.jsx)(n.code,{children:"styles/index.css"}),", and ",(0,r.jsx)(n.code,{children:"public"})," conventions. It creates ",(0,r.jsx)(n.code,{children:"dist/client"})," in a\nproduction build; browser minification is enabled and browser source maps are\ndisabled by default. The SSR renderer is a separate Node bundle and stays\nunminified by default for diagnostics."]}),"\n",(0,r.jsxs)(n.h2,{id:"complete-example",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#complete-example",children:"#"}),"Complete Example"]}),"\n",(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(n.pre,{className:"shiki css-variables",style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0",lang:"ts",children:(0,r.jsxs)(n.code,{children:[(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" default"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" frontend"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" enabled"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" framework"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "react"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" root"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "src/frontend"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" publicDir"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "public"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" publicPath"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "/"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" styles"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" jscss"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { enabled"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" dev"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" hot"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" fastRefresh"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" renderRefresh"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "prompt"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" build"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" target"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "es2022"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" minify"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" sourcemap"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" client"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" external"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" []"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" externalRuntime"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" vendorChunks"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" enabled"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" packages"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"react"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "react-dom"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "react-dom/client"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" assets"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" inlineLimit"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,r.jsx)(n.span,{style:{co
1lor:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" css"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" modules"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" budgets"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" maxInitialJsBrotliBytes"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 60_000"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" maxRouteInitialJsBrotliBytes"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 80_000"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" maxAppOwnedInitialJsBrotliBytes"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 40_000"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" diagnostics"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" leakScan"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" performanceReport"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" deploy"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" assetBaseUrl"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "https://cdn.example.com/my-app/"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" crossOrigin"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "anonymous"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" integrity"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" upload"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" enabled"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" adapter"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "filesystem"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" targetDir"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' ".vext/frontend-cdn"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" publicBaseUrl"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "https://cdn.example.com/my-app/"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" prefix"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "my-app"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" stateFile"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' ".vext/deploy/frontend-assets-state.json"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" exclude"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"**/*.map"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" i18n"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" enabled"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" defaultLocale"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "en-US"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" clientLoad"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "current"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" spaFallback"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" scopes"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" []"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" apiClient"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{className:"line",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,r.jsxs)(n.h2,{id:"production-delivery-profiles",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#production-delivery-profiles",children:"#"}),"Production Delivery Profiles"]}),"\n",(0,r.jsxs)(n.h3,{id:"same-origin-default",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#same-origin-default",children:"#"}),"Same-origin (default)"]}),"\n",(0,r.jsx)(n.p,{children:"Do not configure a CDN for the first production deployment:"}),"\n",(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(n.pre,{className:"shiki css-variables",style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0",lang:"ts",children:(0,r.jsxs)(n.code,{children:[(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" default"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" frontend"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{className:"line",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"vext build"})," writes the frontend closure to ",(0,r.jsx)(n.code,{children:"dist/client"}),"; ",(0,r.jsx)(n.code,{children:"vext start"}),"\nvalidates it and serves assets plus SSR from the same Node service. This is\nthe baseline to keep when a separate static origin provides no material value."]}),"\n",(0,r.jsxs)(n.h3,{id:"cdn-plus-incremental-upload",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#cdn-
1plus-incremental-upload",children:"#"}),"CDN plus incremental upload"]}),"\n",(0,r.jsx)(n.p,{children:"Add only the delivery fields required by the CDN path:"}),"\n",(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(n.pre,{className:"shiki css-variables",style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0",lang:"ts",children:(0,r.jsxs)(n.code,{children:[(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" default"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" frontend"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" deploy"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" assetBaseUrl"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "https://cdn.example.com/my-app/"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" integrity"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" upload"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" enabled"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" adapter"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "filesystem"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" targetDir"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' ".vext/frontend-cdn"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" stateFile"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' ".vext/deploy/frontend-assets-state.json"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" exclude"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"**/*.map"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{className:"line",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"filesystem"})," only stages a deploy tree. Use a custom adapter for a real\nprovider; no cloud SDK or bundler-plugin ecosystem is implicitly installed.\nKeep the state file outside ",(0,r.jsx)(n.code,{children:"frontend.outDir"}),", run ",(0,r.jsx)(n.code,{children:"vext deploy assets --dry-run"}),",\nthen deploy the matching Node ",(0,r.jsx)(n.code,{children:"dist/"})," output."]}),"\n",(0,r.jsxs)(n.h2,{id:"core-fields",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#core-fields",children:"#"}),"Core Fields"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Field"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Meaning"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.enabled"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"false"})}),(0,r.jsx)(n.td,{children:"Enable built-in frontend pipeline"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.framework"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'"react"'})}),(0,r.jsx)(n.td,{children:"Framework label for built-in React support"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.root"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'"src/frontend"'})}),(0,r.jsx)(n.td,{children:"User frontend source root"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.pages"})}),(0,r.jsx)(n.td,{children:"Built-in page conventions"}),(0,r.jsx)(n.td,{children:"Page, document, and error-page discovery settings"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.components
1Dir"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'"components"'})}),(0,r.jsxs)(n.td,{children:["Shared component directory resolved from ",(0,r.jsx)(n.code,{children:"frontend.root"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.assetsDir"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'"assets"'})}),(0,r.jsx)(n.td,{children:"Imported image, font, and media source directory"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.indexHtml"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"src/frontend/pages/_document.html"})}),(0,r.jsx)(n.td,{children:"Document template"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.outDir"})}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:".vext/client"})," in dev, ",(0,r.jsx)(n.code,{children:"dist/client"})," in build"]}),(0,r.jsx)(n.td,{children:"Frontend output directory"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.publicDir"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'"public"'})}),(0,r.jsx)(n.td,{children:"Static public directory"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.publicPath"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'"/"'})}),(0,r.jsx)(n.td,{children:"Public asset URL prefix"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.alias"})}),(0,r.jsxs)(n.td,{children:["Built-in ",(0,r.jsx)(n.code,{children:"@frontend/@pages/@components/@styles/@assets"})]}),(0,r.jsxs)(n.td,{children:["Frontend-safe import aliases; do not alias all of ",(0,r.jsx)(n.code,{children:"src"})," into browser code"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.apiClient"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"true"})}),(0,r.jsxs)(n.td,{children:["Emit route/client contract artifacts; set ",(0,r.jsx)(n.code,{children:"false"})," only when no generated client artifact is wanted"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.errorPages"})}),(0,r.jsx)(n.td,{children:"Built-in error page conventions"}),(0,r.jsx)(n.td,{children:"Map default or status-specific SSR errors to pages"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.adapter"})}),(0,r.jsx)(n.td,{children:"none"}),(0,r.jsx)(n.td,{children:"Advanced compatible adapter seam; not a general plugin loader"})]})]})]}),"\n",(0,r.jsxs)(n.h2,{id:"style-fields",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#style-fields",children:"#"}),"Style Fields"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Field"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Meaning"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.styles.entry"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"styles/index.css"})}),(0,r.jsxs)(n.td,{children:["Global CSS entry resolved from ",(0,r.jsx)(n.code,{children:"frontend.root"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.styles.jscss.enabled"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"true"})}),(0,r.jsx)(n.td,{children:"Enable Vext JSCSS extraction"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.styles.jscss.files"})}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"**/*.style.ts"}),", ",(0,r.jsx)(n.code,{children:"**/*.style.js"}),", ",(0,r.jsx)(n.code,{children:"**/*.css.ts"})]}),(0,r.jsx)(n.td,{children:"JSCSS source globs"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.styles.jscss.runtimeAdapter"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"css-variables"})}),(0,r.jsxs)(n.td,{children:["Emit dynamic variables as CSS custom properties; ",(0,r.jsx)(n.code,{children:"none"}),"/",(0,r.jsx)(n.code,{children:"false"})," uses fallback values"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.styles.jscss.dynamicVars"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"true"})}),(0,r.jsxs)(n.td,{children:["Emit custom property declarations and ",(0,r.jsx)(n.code,{children:"var(...)"})," references"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.styles.jscss.recipes"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"true"})}),(0,r.jsx)(n.td,{children:"Emit recipe variant classes and rules"})]})]})]}),"\n",(0,r.jsxs)(n.h2,{id:"build-fields",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#build-fields",children:"#"}),"Build Fields"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Field"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Meaning"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.build.target"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'"es2022"'})}),(0,r.jsxs)(n.td,{children:["Default browser target passed to esbuild; ",(0,r.jsx)(n.code,{children:"build.client.target"})," overrides it"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.build.minify"})}),(0,r.jsxs)(n.td,{children:["production ",(0,r.jsx)(n.code,{children:"true"})]}),(0,r.jsx)(n.td,{children:"Minify browser output; distinct from the server renderer setting"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.build.sourcemap"})}),(0,r.jsxs)(n.td,{children:["dev ",(0,r.jsx)(n.code,{children:"true"})]}),(0,r.jsxs)(n.td,{children:["Emit browser source maps; production defaults to ",(0,r.jsx)(n.code,{children:"false"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.build.client.assetsDir"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'"assets"'})}),(0,r.jsx)(n.td,{children:"Browser bundle asset subdirectory"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"frontend.build.client.entryNames"})," / ",(0,r.jsx)(n.code,{children:"chunkNames"})," / ",(0,r.jsx)(n.code,{children:"assetNames"})]}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'"[name]-[hash]"'})}),(0,r.jsx)(n.td,{children:"Hashed filename patterns; preserve hashing for immutable caching"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.build.client.splitting"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"true"})}),(0,r.jsx)(n.td,{children:"Enable browser code splitting"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.build.client.external"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"[]"})}),(0,r.jsx)(n.td,{children:"Browser external modules"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.build.client.externalRuntime"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"{}"})}),(0,r.jsx)(n.td,{children:"Import-map URLs for browser externals"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.build.server.outFile"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"server/renderer.cjs"})}),(0,r.jsxs)(n.td,{children:["SSR renderer bundle file under ",(0,r.jsx)(n.code,{children:"frontend.outDir"}),"; its default minify setting is ",(0,r.jsx)(n.code,{children:"false"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.build.vendorChunks"})}),(0,r.jsx)(n.td,{children:"enabled"}),(0,r.jsx)(n.td,{children:"Shared runtime chunk strategy; configure packages only for a measured reason"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.build.budgets"})}),(0,r.jsxs)(n.td,{children:["all limits ",(0,r.jsx)(n.code,{children:"0"})]}),(0,r.jsxs)(n.td,{children:["Enforce raw/gzip/brotli budget thresholds; use ",(0,r.jsx)(n.code,{children:"warnOnly"})," while baselines settle"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.build.assets.inlineLimit"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"0"})}),(0,r.jsx)(n.td,{children:"Inline imported assets below this byte size"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.build.css.modules"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"true"})}),(0,r.jsx)(n.td,{children:"Enable CSS Modules"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.build.diagnostics.leakScan"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"true"})}),(0,r.jsx)(n.td,{children:"Block server-only imports from browser graph"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.build.diagnostics.sizeReport"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"true"})}),(0,r.jsxs)(n.td,{children:["Write ",(0,r.jsx)(n.code,{children:"size-report.json"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.build.diagnostics.performanceReport"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"true"})}),(0,r.jsx)(n.td,{children:"Include route-level performance metrics"})]})]})]}),"\n",(0,r.jsxs)(n.p,{children:["React-related browser externals must define ",(0,r.jsx)(n.code,{children:"externalRuntime"}
1)," mappings. Otherwise the build fails with a friendly diagnostic."]}),"\n",(0,r.jsxs)(n.p,{children:["Browser output is directory-based and uses ",(0,r.jsx)(n.code,{children:"frontend.outDir"}),"; ",(0,r.jsx)(n.code,{children:"frontend.build.client.outFile"})," is not supported. Vext always emits the frontend manifest family required by SSR, preload, deploy, and verification, so ",(0,r.jsx)(n.code,{children:"build.client.manifest"})," / ",(0,r.jsx)(n.code,{children:"build.server.manifest"})," are not configuration fields."]}),"\n",(0,r.jsxs)(n.p,{children:["For a normal product, keep browser code splitting, hashed names, and the\nVext-managed vendor entry enabled. Start with budgets as warnings, inspect the\ncomplete route closure in ",(0,r.jsx)(n.code,{children:"size-report.json"}),", and only then turn the budget\ninto a release-blocking gate."]}),"\n",(0,r.jsxs)(n.h2,{id:"deploy-fields",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#deploy-fields",children:"#"}),"Deploy Fields"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Field"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Meaning"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.deploy.assetBaseUrl"})}),(0,r.jsx)(n.td,{children:"none"}),(0,r.jsx)(n.td,{children:"CDN/public base URL for assets"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.deploy.crossOrigin"})}),(0,r.jsx)(n.td,{children:"none"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"crossorigin"})," value for generated tags"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.deploy.integrity"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"false"})}),(0,r.jsx)(n.td,{children:"Add SRI integrity for generated JS/CSS"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.deploy.upload.enabled"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"false"})}),(0,r.jsxs)(n.td,{children:["Enable ",(0,r.jsx)(n.code,{children:"vext build --upload-assets"})," / ",(0,r.jsx)(n.code,{children:"vext deploy assets"})," upload"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.deploy.upload.adapter"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'"filesystem"'})}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"filesystem"}),", ",(0,r.jsx)(n.code,{children:"mock"}),", or custom adapter"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.deploy.upload.targetDir"})}),(0,r.jsxs)(n.td,{children:["enabled: ",(0,r.jsx)(n.code,{children:".vext/deploy/frontend-assets"})]}),(0,r.jsxs)(n.td,{children:["Local staging destination for ",(0,r.jsx)(n.code,{children:"filesystem"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.deploy.upload.publicBaseUrl"})}),(0,r.jsx)(n.td,{children:"none"}),(0,r.jsxs)(n.td,{children:["Optional public URL reported by upload; filesystem falls back to ",(0,r.jsx)(n.code,{children:"assetBaseUrl"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"frontend.deploy.upload.prefix"})," / ",(0,r.jsx)(n.code,{children:"concurrency"})]}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:'""'})," / ",(0,r.jsx)(n.code,{children:"4"})]}),(0,r.jsx)(n.td,{children:"Upload key namespace and parallelism"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.deploy.upload.stateFile"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:".vext/deploy/frontend-assets-state.json"})}),(0,r.jsx)(n.td,{children:"Incremental upload state"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.deploy.upload.exclude"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'["**/*.map"]'})}),(0,r.jsx)(n.td,{children:"Files excluded from upload"})]})]})]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"assetBaseUrl"})," must be an absolute URL. ",(0,r.jsx)(n.code,{children:"deploy-manifest.json"})," uploads JS,\nCSS, imported media, and copied public files; it does not upload SSR HTML or\nsource maps by default. Use ",(0,r.jsx)(n.code,{children:"vext deploy assets --dry-run"})," before every new\nadapter, prefix, or include/exclude rule."]}),"\n",(0,r.jsxs)(n.h2,{id:"seo-fields",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#seo-fields",children:"#"}),"SEO Fields"]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"frontend.seo"}
1)," is the framework-level SEO entry point. It is disabled when\nomitted; when the object is present, ",(0,r.jsx)(n.code,{children:"enabled"})," defaults to ",(0,r.jsx)(n.code,{children:"true"}),"."]}),"\n",(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(n.pre,{className:"shiki css-variables",style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0",lang:"ts",children:(0,r.jsxs)(n.code,{children:[(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"frontend"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" seo"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" publicOrigin"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" process"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"env"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"PUBLIC_ORIGIN"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ??"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "https://www.example.com"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" titleTemplate"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "%s | Example"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" defaults"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { description"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "Example application"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" sitemap"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" robots"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{className:"line",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"publicOrigin"})," identifies the deployment origin. Vext combines it with each\nrequest pathname, so dynamic pages do not share one fixed URL. Use route-level\n",(0,r.jsx)(n.code,{children:"frontend.seo"})," for static metadata and ",(0,r.jsx)(n.code,{children:"res.render(..., { seo })"})," for metadata\nderived from page data. ",(0,r.jsx)(n.code,{children:"sitemap"})," and ",(0,r.jsx)(n.code,{children:"robots"})," can use ",(0,r.jsx)(n.code,{children:'"build"'})," or ",(0,r.jsx)(n.code,{children:'"runtime"'}),"\nmode; named ",(0,r.jsx)(n.code,{children:"origins"})," support a finite multi-domain deployment."]}),"\n",(0,r.jsxs)(n.p,{children:["See ",(0,r.jsx)(n.a,{href:"/frontend/seo-sitemap.html",children:"SEO, Sitemap, and Robots"})," for dynamic canonical,\nprovider, host-selection, output, and n
1o-hydration examples. The exact nested\nfield list is in the ",(0,r.jsx)(n.a,{href:"/api/config.html#vextfrontendconfig",children:"API reference"}),"."]}),"\n",(0,r.jsxs)(n.h2,{id:"i18n-fields",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#i18n-fields",children:"#"}),"I18n Fields"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Field"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Meaning"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.i18n.enabled"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"false"})}),(0,r.jsx)(n.td,{children:"Scan and bundle frontend page copy when explicitly enabled"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.i18n.source"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"locales"})}),(0,r.jsxs)(n.td,{children:["Locale source directory resolved from ",(0,r.jsx)(n.code,{children:"frontend.root"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.i18n.defaultLocale"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'"inherit"'})}),(0,r.jsx)(n.td,{children:"Fallback frontend locale; inherits request locale by default"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"frontend.i18n.detect"})," / ",(0,r.jsx)(n.code,{children:"inject"})]}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.code,{children:"accept-language"})," / ",(0,r.jsx)(n.code,{children:"used"})]}),(0,r.jsx)(n.td,{children:"SSR locale detection and message injection policy"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.i18n.clientLoad"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'"current"'})}),(0,r.jsx)(n.td,{children:"Browser locale loading mode"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.i18n.clientSwitch"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'"reload"'})}),(0,r.jsx)(n.td,{children:"Browser behavior when the selected locale changes"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.i18n.htmlLang"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"true"})}),(0,r.jsxs)(n.td,{children:["Write request-aware ",(0,r.jsx)(n.code,{children:"{vext.lang}"})," / ",(0,r.jsx)(n.code,{children:"<html lang>"})]})]})]})]}),"\n",(0,r.jsxs)(n.h2,{id:"dev-fields",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#dev-fields",children:"#"}),"Dev Fields"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Field"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Meaning"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.dev.hot"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"true"})}),(0,r.jsx)(n.td,{children:"Enable frontend dev events"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.dev.fastRefresh"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"true"})}),(0,r.jsx)(n.td,{children:"Enable React Fast Refresh when possible"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.dev.transport"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'"sse"'})}),(0,r.jsx)(n.td,{children:"Vext development event-bus transport; this is not a user-selectable WebSocket mode"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.dev.overlay"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"true"})}),(0,r.jsx)(n.td,{children:"Show browser UI for frontend rebuild errors and render refresh prompts"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.dev.debounceMs"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"50"})}),(0,r.jsx)(n.td,{children:"Coalesce rapid file-system changes before a rebuild"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.dev.renderRefresh"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'"prompt"'})}),(0,r.jsx)(n.td,{children:"Browser behavior after render-data backend reload"})]})]})]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"frontend.dev.overlay"})," only controls frontend browser development UI. Backend exception HTML overlays are configured separately through top-level ",(0,r.jsx)(n.code,{children:"dev.errorOverlay"}),"."]}),"\n",(0,r.jsxs)(n.h2,{id:"spa-fallback-fields",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#spa-fallback-fields",children:"#"}),"SPA Fallback Fields"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Field"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Meaning"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.spaFallback.enabled"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"true"})}),(0,r.jsx)(n.td,{children:"Enables arbitration only; with no scopes it captures no page"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.spaFallback.scopes"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"[]"})}),(0,r.jsx)(n.td,{children:"Explicit client-router sub-app fallback scopes"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"frontend.spaFallback.exclude"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:'["/api/**", "/openapi.json", "/docs/**", "/_vext/docs/**"]'})}),(0,r.jsx)(n.td,{children:"Global paths that fallback never captures"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"scopes[].basePath"})}),(0,r.jsx)(n.td,{children:"required"}),(0,r.jsx)(n.td,{children:"URL prefix handled by the shell"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"scopes[].page"})}),(0,r.jsx)(n.td,{children:"required"}),(0,r.jsxs)(n.td,{children:["Shell page id from ",(0,r.jsx)(n.code,{children:"src/frontend/pages/**"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"scopes[].ssr"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"false"})}),(0,r.jsx)(n.td,{children:"Whether the shell should be SSR-rendered"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"scopes[].exclude"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"[]"})}),(0,r.jsx)(n.td,{children:"Paths that must not be handled by fallback"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"scopes[].status"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"200"})}),(0,r.jsx)(n.td,{children:"HTTP status for matched fallback"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Declare individual scopes instead of a site-wide catch-all. API, OpenAPI, and\ndocumentation routes stay excluded by default so a client-router shell cannot\nhide an operational endpoint."}),"\n",(0,r.jsxs)(n.h2,{id:"verify-a-configuration-change",children:[(0,r.jsx)(n.a,{className:"rp-header-anchor","aria-hidden":"true",href:"#verify-a-configuration-change",children:"#"}),"Verify a Configuration Change"]}),"\n",(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(n.pre,{className:"shiki css-variables",style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0",lang:"bash",children:(0,r.jsxs)(n.code,{children:[(0,r.jsx)(n.span,{className:"line",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"# Compile the backend, browser, and SSR closure."})}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"vext"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" build"})]}),"\n",(0,r.jsx)(n.span,{className:"line"}),"\n",(0,r.jsx)(n.span,{className:"line",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"# Required only when configuring an upload path; inspect before writing."})}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"vext"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" deploy"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" assets"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" --dry-run"})]}),"\n",(0,r.jsx)(n.span,{className:"line"}),"\n",(0,r.jsx)(n.span,{className:"line",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"# Verify the production closure and start the Node runtime."})}),"\n",(0,r.jsxs)(n.span,{className:"line",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"vext"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" start"})]})]})})}),"\n",(0,r.jsxs)(n.p,{children:["For a build or budget change, inspect ",(0,r.jsx)(n.code,{children:"dist/client/size-report.json"}),". For a\nCDN change, request one SSR page and one hashed browser asset and confirm they\nbelong to the same release. For SPA fallback, also request a deliberately\nexcluded API path. The ",(0,r.jsx)(n.a,{href:"/api/config.html#vextfrontendconfig",children:"API reference"})," is\nthe canonical source for less-common nested fields."]})]})}function d(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}d.__RSPRESS_PAGE_META={},d.__RSPRESS_PAGE_META["en%2Ffrontend%2Fconfiguration.md"]={toc:[{id:"table-of-contents",text:"Table of Contents",depth:2}
1,{id:"choose-what-to-configure",text:"Choose What to Configure",depth:2},{id:"minimal-config",text:"Minimal Config",depth:2},{id:"complete-example",text:"Complete Example",depth:2},{id:"production-delivery-profiles",text:"Production Delivery Profiles",depth:2},{id:"same-origin-default",text:"Same-origin (default)",depth:3},{id:"cdn-plus-incremental-upload",text:"CDN plus incremental upload",depth:3},{id:"core-fields",text:"Core Fields",depth:2},{id:"style-fields",text:"Style Fields",depth:2},{id:"build-fields",text:"Build Fields",depth:2},{id:"deploy-fields",text:"Deploy Fields",depth:2},{id:"seo-fields",text:"SEO Fields",depth:2},{id:"i18n-fields",text:"I18n Fields",depth:2},{id:"dev-fields",text:"Dev Fields",depth:2},{id:"spa-fallback-fields",text:"SPA Fallback Fields",depth:2},{id:"verify-a-configuration-change",text:"Verify a Configuration Change",depth:2}],title:"Frontend Configuration",headingTitle:"Frontend Configuration",frontmatter:{}},s.d(n,{default:()=>d})}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.