@salesforce/vite-plugin-ui-bundle
v12.6.1
Published
Vite plugin for Salesforce UI Bundles
Maintainers
Keywords
Readme
@salesforce/vite-plugin-ui-bundle
Vite plugin for Salesforce UI Bundles
Entry points
This package ships two plugins from one versioned artifact:
| Import | Use for | basePath / language |
| ---------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| @salesforce/vite-plugin-ui-bundle | the default — every bundle, unless something below applies | basePath always /; no language folding |
| @salesforce/vite-plugin-ui-bundle/site | site bundles that need site-specific local-dev handling (today: the language-switcher feature is installed) | per-request basePath = /<lang> + SFDC_ENV.language, driven by languages |
Most bundles use the generic import. The language-switcher feature's setup swaps
a bundle to ./site and passes its LANGUAGES; you rarely edit this by hand.
// Generic bundle
import uiBundlePlugin from "@salesforce/vite-plugin-ui-bundle";
export default defineConfig({ plugins: [uiBundlePlugin()] });
// Site bundle (language switching in local preview)
import siteUiBundlePlugin from "@salesforce/vite-plugin-ui-bundle/site";
export default defineConfig({
plugins: [siteUiBundlePlugin({ languages: ["en_US", "zh_CN", "fr"] })],
});The site plugin composes the same core as the generic plugin (proxying, org
info, API-version bake-in, design mode, HMR are identical); it only adds
site-specific base-path management. With no languages (or an empty array) the
site plugin behaves identically to the generic one.
How the site entry works (local dev only)
On a deployed Experience site the platform injects globalThis.SFDC_ENV.language
and folds the active language into SFDC_ENV.basePath (e.g. /shop/fr),
recomputed from the request URL on every load. The generic dev server does
neither. The site entry mirrors this for local dev, per request:
- A leading URL segment matching a non-default supported language is stripped
before Vite's router sees it, so
/fr/property/1is served exactly like/property/1(SPA fallback). SFDC_ENV.languageandbasePathare recomputed from the URL: a non-default segment →language="<lang>",basePath="/<lang>"; no segment (or the default, which is the first entry oflanguages) →language="<default>",basePath="/".apiPathstays/(never folded), so the/services/*GraphQL proxy still resolves — the language lives inbasePathonly.
All of this is gated to non-production, non-CodeBuilder, and a non-empty
languages list, so a deployed build and every generic bundle are untouched.
