Migration
This guide covers migrating an existing Storybook project from the webpack5 or Vite framework to Storybook Rsbuild (e.g. storybook-react-rsbuild).
Using an AI coding agent?
Your agent can handle this migration automatically. Install the agent skills and ask it to migrate your project:
npx skills add rstackjs/agent-skills --skill storybook-rsbuild
yarn dlx skills add rstackjs/agent-skills --skill storybook-rsbuild
pnpm dlx skills add rstackjs/agent-skills --skill storybook-rsbuild
bunx skills add rstackjs/agent-skills --skill storybook-rsbuild
deno run npm:skills npm:add npm:rstackjs/agent-skills --skill npm:storybook-rsbuild
Storybook versions
Match your Storybook version to the correct storybook-rsbuild release:
From Storybook Webpack5 Framework
If your .storybook/main.ts uses a webpack5 framework package (e.g. @storybook/react-webpack5, @storybook/vue3-webpack5), follow this section.
1. Replace packages
Uninstall the old webpack5 framework package, and install the Rsbuild equivalent along with @rsbuild/core.
For example, to migrate a React project:
npm install @rsbuild/core storybook-react-rsbuild -D
yarn add @rsbuild/core storybook-react-rsbuild -D
pnpm add @rsbuild/core storybook-react-rsbuild -D
bun add @rsbuild/core storybook-react-rsbuild -D
deno add npm:@rsbuild/core npm:storybook-react-rsbuild -D
Then remove the old packages:
npm remove @storybook/builder-webpack5 @storybook/react-webpack5
yarn remove @storybook/builder-webpack5 @storybook/react-webpack5
pnpm remove @storybook/builder-webpack5 @storybook/react-webpack5
bun remove @storybook/builder-webpack5 @storybook/react-webpack5
deno remove npm:@storybook/builder-webpack5 npm:@storybook/react-webpack5
The framework package (e.g. storybook-react-rsbuild) includes storybook-builder-rsbuild as a dependency — you do not need to install the builder separately.
Package mapping
2. Update .storybook/main.ts
.storybook/main.ts
// Before
// import type { StorybookConfig } from '@storybook/react-webpack5'
// After
import type { StorybookConfig } from 'storybook-react-rsbuild'
const config: StorybookConfig = {
// Before: framework: '@storybook/react-webpack5',
framework: 'storybook-react-rsbuild',
stories: ['../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
}
export default config
3. Convert webpackFinal to rsbuildFinal
Use
mergeRsbuildConfig for modifications
Always use mergeRsbuildConfig from @rsbuild/core to modify the config. Directly mutating properties like config.tools.rspack = {...} may not work because internal configs can be arrays of functions/objects, and direct assignment may be silently ignored.
.storybook/main.ts
import type { StorybookConfig } from 'storybook-react-rsbuild'
import { mergeRsbuildConfig } from '@rsbuild/core'
const config: StorybookConfig = {
framework: 'storybook-react-rsbuild',
stories: [],
// Before:
// webpackFinal: async (config) => {
// config.resolve.alias['@components'] = path.resolve(__dirname, '../src/components')
// config.module.rules.push({ test: /\.svg$/, use: ['@svgr/webpack'] })
// return config
// },
// After:
rsbuildFinal: async (config) => {
return mergeRsbuildConfig(config, {
source: {
alias: {
'@components': './src/components',
},
},
// For SVG, use @rsbuild/plugin-svgr
})
},
}
export default config
4. Handle webpack-dependent addons
Some Storybook addons use webpackFinal internally. Move them from addons to webpackAddons:
.storybook/main.ts
import type { StorybookConfig } from 'storybook-react-rsbuild'
const config: StorybookConfig = {
framework: 'storybook-react-rsbuild',
stories: [],
// Regular addons (framework-agnostic)
addons: [
'@storybook/addon-docs',
'@storybook/addon-onboarding',
],
// Addons that depend on webpack loaders/plugins
webpackAddons: [
'@storybook/addon-coverage',
],
}
export default config
The webpackAddons field runs each addon's webpackFinal hook and translates the resulting webpack config into Rspack config automatically.
5. Convert common webpack patterns
From Storybook Vite Framework
If your .storybook/main.ts uses a Vite framework package (e.g. @storybook/react-vite, @storybook/vue3-vite), follow this section.
1. Replace packages
Uninstall the old Vite framework package, and install the Rsbuild equivalent along with @rsbuild/core.
For example, to migrate a React project:
npm install @rsbuild/core storybook-react-rsbuild -D
yarn add @rsbuild/core storybook-react-rsbuild -D
pnpm add @rsbuild/core storybook-react-rsbuild -D
bun add @rsbuild/core storybook-react-rsbuild -D
deno add npm:@rsbuild/core npm:storybook-react-rsbuild -D
Then remove the old packages:
npm remove @storybook/builder-vite @storybook/react-vite
yarn remove @storybook/builder-vite @storybook/react-vite
pnpm remove @storybook/builder-vite @storybook/react-vite
bun remove @storybook/builder-vite @storybook/react-vite
deno remove npm:@storybook/builder-vite npm:@storybook/react-vite
Package mapping
2. Update .storybook/main.ts
.storybook/main.ts
// Before
// import type { StorybookConfig } from '@storybook/react-vite'
// After
import type { StorybookConfig } from 'storybook-react-rsbuild'
const config: StorybookConfig = {
// Before: framework: '@storybook/react-vite',
framework: 'storybook-react-rsbuild',
stories: ['../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
}
export default config
3. Convert viteFinal to rsbuildFinal
.storybook/main.ts
import type { StorybookConfig } from 'storybook-react-rsbuild'
import { mergeRsbuildConfig } from '@rsbuild/core'
const config: StorybookConfig = {
framework: 'storybook-react-rsbuild',
stories: [],
// Before:
// viteFinal: async (config) => {
// config.resolve.alias['@'] = path.resolve(__dirname, '../src')
// return config
// },
// After:
rsbuildFinal: async (config) => {
return mergeRsbuildConfig(config, {
source: {
alias: {
'@': './src',
},
},
})
},
}
export default config
4. Convert common Vite patterns
Vite plugins are not compatible
Vite plugins cannot be used with Rsbuild. Find equivalent Rsbuild plugins at the Rsbuild plugin list.
Verification
After migration, verify:
npx storybook dev starts without errors
- All stories render correctly
- HMR works (edit a component, see it update)
npx storybook build completes successfully
- Addons function correctly (especially docs, controls, actions)
Debugging
Enable Rsbuild debug mode to inspect the generated config:
DEBUG=rsbuild storybook dev
Check the CLI output to see where the Rsbuild and Rspack configs are written.