Skip to content

Frameworks reference ​

This page lists the technical framework contracts for RSPFx: mount semantics per framework, package layout with import paths, and fast refresh mechanisms.

For choosing a framework and tutorial prose see docs/frameworks.md; for the preset contract see docs/custom-framework.md.

Mount semantics ​

AdapterPackageMountUpdateUnmountSource
Reactimport { createReactAdapter } from '@mbsks/rspfx-framework-react/headless'createRoot(root).renderroot.renderroot.unmountpackages/framework-react/src/headless.ts:7
Preactimport { createPreactAdapter } from '@mbsks/rspfx-framework-preact/headless'render(vnode, root)render(vnode, root)render(null, root)packages/framework-preact/src/headless.ts:1
Vueimport { createVueAdapter } from '@mbsks/rspfx-framework-vue/headless'createApp(comp).mountunmount + recreateapp.unmountpackages/framework-vue/src/headless.ts:1
Svelteimport { createSvelteAdapter } from '@mbsks/rspfx-framework-svelte/headless'new Component / mount (Svelte 5)$set or recreate$destroy / unmountpackages/framework-svelte/src/headless.ts:1
Solidimport { createSolidAdapter } from '@mbsks/rspfx-framework-solid/headless'render + signalsetPropsdisposepackages/framework-solid/src/headless.ts:1
Vanillaimport { createVanillaAdapter } from '@mbsks/rspfx-framework-vanilla/headless'replaceChildrenreplaceChildrenreplaceChildrenpackages/framework-vanilla/src/headless.ts:1

Usage with SPFx:

ts
import { defineWebPart } from '@mbsks/rspfx-webpart-base';
import { createReactAdapter } from '@mbsks/rspfx-framework-react/headless';
export default defineWebPart<{ name: string }>({
  adapterFactory: () => createReactAdapter((props) => <Hello {...props} />),
});

See packages/webpart-base/src/index.ts:10 for defineWebPart and packages/core/src/base-web-part.ts:10 for BaseWebPart.

Package layout ​

Each @mbsks/rspfx-framework-<fw> has three entry points:

EntryImportExportsNode-safe
indeximport { reactPreset } from '@mbsks/rspfx-framework-react'FrameworkPreset onlyYes
/headlessimport { createReactAdapter } from '@mbsks/rspfx-framework-react/headless'createXAdapter factory (browser, no SPFx dep)No (DOM)
/webpartimport { ReactWebPart } from '@mbsks/rspfx-framework-react/webpart'Thin HeadlessWebPart shim (@mbsks/rspfx-webpart-base) — deprecated, use defineWebPartNo

packages/plugin-api/src/types.ts:29 defines FrameworkPreset.

Fast refresh mechanism ​

Enable with rspfx dev --refresh or dev.fastRefresh: true (packages/core/src/config.ts:138).

FrameworkFast refreshRspack mechanism (preset.rspack())Vite mechanism (preset.vite())
React✅ReactRefreshRspackPlugin from @rspack/plugin-react-refreshimport react from '@vitejs/plugin-react'
Preact✅PreactRefreshRspackPlugin from @rspack/plugin-preact-refreshimport preact from '@prefresh/vite'
Vue✅vue-loader + VueLoaderPlugin (HMR always on)import vue from '@vitejs/plugin-vue'
Svelte✅svelte-loader with { hotReload: true, compilerOptions: { dev: true } }import { svelte } from '@sveltejs/vite-plugin-svelte' with { hot: true }
Solid✅babel-loader with solid-refresh/babel or builtin:swc-loader with rspackExperiments.swcPluginsvite-plugin-solid
Vanilla—Full reloadFull reload

Any failure falls back to reload via /__rspfx_hot.json poll → location.reload() (packages/dev-runtime/src/serve.ts:335). RefreshRuntime is framework-agnostic (packages/dev-runtime/src/refresh.ts:21).

Missing peers are stubbed via BUILD_TIME_ALIASES (packages/compiler-rspack/src/config.ts:16); a warning is logged and reload is used. See docs/fast-refresh.md.

Fluent UI ​

PackageImportPeerUse
@mbsks/rspfx-fluent-adapterimport { FluentWebPart } from '@mbsks/rspfx-fluent-adapter'@fluentui/react ^8.0.0React-only; FluentWebPart extends ReactWebPart and syncs theme via onThemeChanged() (packages/fluent-adapter/src/index.ts:43 buildFluentTheme)

Install: bun add @mbsks/rspfx-fluent-adapter @fluentui/react (or pnpm add / npm i / yarn add). No React 19 support — see docs/react-19.md.

Released under the MIT License.