close
  • 简体中文
  • Rspack

    Rsbuild 构建于 Rspack 之上,因此你在 Rsbuild 中应用的任何配置同样适用于原生 Rspack 项目。本指南将介绍如何将 Storybook Rsbuild 接入已有的 Rspack 配置。

    完整的参考实现请查看 Rspack React sandbox

    配置

    1. 安装依赖

    以一个 React 示例为起点,安装 storybook-react-rsbuild(参见 React framework 指南),并添加 Rspack 支持所需的 Rsbuild 包。

    npm
    yarn
    pnpm
    bun
    deno
    npm install @rsbuild/core @rsbuild/plugin-react -D

    请确保已安装以下包:

    • storybook
    • @rsbuild/core
    • @rsbuild/plugin-react
    • storybook-react-rsbuild

    2. 创建 rsbuild.config.ts

    Storybook Rsbuild 读取项目 Rsbuild config 的方式,与 @storybook/builder-webpack5 支持自定义 webpack 配置 的方式相同。请在此处配置 Rspack 应用的基础设置。

    rsbuild.config.ts
    import { defineConfig } from '@rsbuild/core'
    import { pluginReact } from '@rsbuild/plugin-react'
    
    export default defineConfig({
      plugins: [pluginReact()],
    })

    3. 配置 .storybook/main.ts

    请参照 React framework 指南 中的设置,使 Storybook 使用 Rsbuild builder。

    .storybook/main.ts
    import { 
    import StorybookConfig
    StorybookConfig
    } from 'storybook-react-rsbuild'
    const
    const config: StorybookConfig
    config
    :
    import StorybookConfig
    StorybookConfig
    = {
    framework: string
    framework
    : 'storybook-react-rsbuild',
    stories: never[]
    stories
    : [],
    addons: never[]
    addons
    : []
    } export default
    const config: StorybookConfig
    config

    此时,npx storybook dev 应该会使用默认的 @rsbuild/core@rsbuild/plugin-react 配置启动。如果你的项目已有自己的 rspack.config,请继续执行步骤 4 —— story 打包只会看到 rsbuild.config.ts 中定义的内容,因此任何未在此处镜像的自定义 rules、plugins 或 aliases 都会在你的 stories 中悄无声息地缺失。

    4. 镜像已有的 rspack.config

    如果你的项目为应用构建维护了一份自定义的 rspack.config.ts / rspack.config.cjs,请在 rsbuild.config.ts 中镜像其关键部分。Storybook 不会读取 rspack.config,它读取的是 rsbuild.config.ts,因此必须显式保持两者的一致性。

    在迁移已有的 Rspack 项目时,请逐一检查你的 rspack.config,并镜像以下每一项(如果它们被自定义过):

    • resolve.alias —— 直接在 rsbuild.config.tsresolve.alias 下设置;或者如果你希望维持单一信息源,也可以通过 tools.rspack 合并。
    • 自定义 module.rules(loader) —— 通过 tools.rspack 合并。注意,Rsbuild 的内置 plugin(pluginReactpluginSass 等)已经注册了最常见的 loader;只有项目特有的 rules(例如 @svgr/webpack、带自定义选项的 less-loader、内部代码生成 loader)才需要迁移。
    • 自定义 plugins —— 通过 tools.rspack 合并。
    • 自定义 externalsoutput.publicPathexperiments —— 通过 tools.rspack 合并。

    下面的示例导入了一份已有的 Rspack 配置,并镜像了它的 resolve.alias 以及一条自定义的 less-loader rule:

    rsbuild.config.ts
    import { defineConfig } from '@rsbuild/core'
    import { pluginReact } from '@rsbuild/plugin-react'
    // import rspackConfig from './rspack.config.cjs'
    const rspackConfig = { resolve: { alias: { '@app': './src' } }, module: { rules: [{}, {}, { loader: 'less-loader' }] } } as any
    
    export default defineConfig({
      plugins: [pluginReact()],
      resolve: {
        alias: rspackConfig.resolve?.alias,
      },
      tools: {
        rspack: (config) => {
          const lessLoader = rspackConfig.module.rules[2]
          config.module!.rules!.push(lessLoader)
          return config
        },
      },
    })

    每一个自定义钩子都可参阅 tools.rspack