Rspack React 包提供了一套用于创建和配置基于 React 框架的 Rspack 应用的 API,支持 React 组件的开发、构建与服务端渲染,并提供 React Refresh 热模块替换功能。
使用包管理器安装 @esmx/rspack-react 开发依赖:
npm install @esmx/rspack-react -Dtype BuildTarget = 'node' | 'client' | 'server'构建目标环境类型,定义了应用程序的构建目标环境,用于配置构建过程中的特定优化和功能:
node: 构建为 Node.js 环境运行的代码client: 构建为浏览器环境运行的代码server: 构建为服务端环境运行的代码interface RspackAppConfigContext {
esmx: Esmx
buildTarget: BuildTarget
config: RspackOptions
options: RspackAppOptions
}Rspack 应用配置上下文接口,提供了在配置钩子函数中可以访问的上下文信息:
esmx: Esmx 框架实例buildTarget: 当前的构建目标(client/server/node)config: Rspack 配置对象options: 应用配置选项interface RspackAppChainContext {
esmx: Esmx
buildTarget: BuildTarget
chain: RspackChain
options: RspackAppOptions
}Rspack 链式配置上下文接口,提供了在链式配置钩子函数中可以访问的上下文信息:
esmx: Esmx 框架实例buildTarget: 当前的构建目标(client/server/node)chain: rspack-chain 配置对象,用于链式配置options: 应用配置选项interface RspackAppOptions {
minimize?: boolean
config?: (context: RspackAppConfigContext) => void | Promise<void>
chain?: (context: RspackAppChainContext) => void | Promise<void>
}Rspack 应用配置选项接口:
minimize: 是否启用代码压缩,默认根据环境自动选择config: 配置钩子函数,用于修改 Rspack 编译配置chain: 链式配置钩子函数,使用 rspack-chain 进行灵活的配置修改interface RspackHtmlAppOptions extends RspackAppOptions {
css?: 'css' | 'js' | false
loaders?: Partial<Record<keyof typeof RSPACK_LOADER, string>>
styleLoader?: Record<string, any>
cssLoader?: Record<string, any>
lessLoader?: Record<string, any>
styleResourcesLoader?: Record<string, any>
swcLoader?: SwcLoaderOptions
definePlugin?: Record<string, string | Partial<Record<BuildTarget, string>>>
target?: TargetSetting
}Rspack HTML 应用配置选项接口,继承自 RspackAppOptions:
css: CSS 输出方式,可选 'css'(独立文件)或 'js'(打包到JS中),默认根据环境自动选择loaders: 自定义 loader 配置,用于替换默认的 loader 实现styleLoader: style-loader 配置选项cssLoader: css-loader 配置选项lessLoader: Less 编译选项styleResourcesLoader: 全局样式资源自动注入配置swcLoader: TypeScript/JavaScript 编译选项definePlugin: 全局常量定义,支持为不同的构建目标设置不同的值target: 构建目标兼容性配置interface RspackReactAppOptions extends RspackHtmlAppOptions {
// 无额外选项,继承 RspackHtmlAppOptions 的所有选项
}Rspack React 应用配置选项接口,继承自 RspackHtmlAppOptions。所有 RspackHtmlAppOptions 的选项都可用,React 特定的配置由构建工具自动处理。
function createRspackReactApp(esmx: Esmx, options?: RspackReactAppOptions): Promise<App>创建一个 React Rspack 应用实例,自动配置 React 相关功能,包括:
参数:
esmx: Esmx 框架实例options: React 应用配置选项返回值:
示例:
import type { EsmxOptions } from '@esmx/core';
export default {
async devApp(esmx) {
return import('@esmx/rspack-react').then((m) =>
m.createRspackReactApp(esmx, {
// 自定义配置
css: 'css',
chain(context) {
// 额外的链式配置
const { chain, buildTarget } = context;
if (buildTarget === 'client') {
// 客户端特定配置
}
}
})
);
}
} satisfies EsmxOptions;React 特定功能:
createRspackReactApp 函数自动配置以下内容:
.tsx 和 .jsx 添加到解析扩展名配置中process.env.NODE_ENVfunction createRspackHtmlApp(esmx: Esmx, options?: RspackHtmlAppOptions): Promise<App>创建一个 HTML 类型的 Rspack 应用实例。此函数从 @esmx/rspack 重新导出,可在 React 应用中按需使用。
参数:
esmx: Esmx 框架实例options: HTML 应用配置选项返回值:
function createRspackApp(esmx: Esmx, options?: RspackAppOptions): Promise<App>创建一个标准的 Rspack 应用实例。此函数从 @esmx/rspack 重新导出,提供基础的 Rspack 功能。
参数:
esmx: Esmx 框架实例options: Rspack 应用配置选项返回值:
const RSPACK_LOADER: Record<string, string> = {
builtinSwcLoader: 'builtin:swc-loader',
lightningcssLoader: 'builtin:lightningcss-loader',
styleLoader: 'style-loader',
cssLoader: 'css-loader',
lessLoader: 'less-loader',
styleResourcesLoader: 'style-resources-loader',
workerRspackLoader: 'worker-rspack-loader'
}Rspack 内置的 loader 标识符映射对象,提供了常用的 loader 名称常量:
builtinSwcLoader: Rspack 内置的 SWC loader,用于处理 TypeScript/JavaScript 文件,为 TSX/JSX 文件自动配置 React 转换lightningcssLoader: Rspack 内置的 lightningcss loader,用于处理 CSS 文件的高性能编译器styleLoader: 用于将 CSS 注入到 DOM 中的 loadercssLoader: 用于解析 CSS 文件和处理 CSS 模块化的 loaderlessLoader: 用于将 Less 文件编译为 CSS 的 loaderstyleResourcesLoader: 用于自动导入全局样式资源(如变量、mixins)的 loaderworkerRspackLoader: 用于处理 Web Worker 文件的 loader使用这些常量可以在配置中引用内置的 loader,避免手动输入字符串:
import { RSPACK_LOADER } from '@esmx/rspack-react';
export default {
async devApp(esmx) {
return import('@esmx/rspack-react').then((m) =>
m.createRspackReactApp(esmx, {
loaders: {
// 使用常量引用 loader
styleLoader: RSPACK_LOADER.styleLoader,
cssLoader: RSPACK_LOADER.cssLoader,
lightningcssLoader: RSPACK_LOADER.lightningcssLoader
}
})
);
}
};注意事项:
builtinSwcLoader 会自动为 .tsx 和 .jsx 文件配置 React 转换builtinSwcLoader)有特定的配置选项,请参考相应的配置文档重导出 @rspack/core 包的所有内容,提供完整的 Rspack 核心功能,包括插件、loader 和工具函数。
使用 createRspackReactApp 时,以下 React 特定配置会自动应用:
.tsx 和 .jsx 添加到解析扩展名配置中.tsx 和 .jsx 文件创建专用规则,包括:
process.env.NODE_ENV您可以使用 chain 钩子自定义 React 特定行为:
import type { EsmxOptions } from '@esmx/core';
export default {
async devApp(esmx) {
return import('@esmx/rspack-react').then((m) =>
m.createRspackReactApp(esmx, {
chain(context) {
const { chain, buildTarget } = context;
// 修改 React loader 配置
chain.module
.rule('react-tsx')
.use('swc-loader')
.tap((options) => {
return {
...options,
jsc: {
...options.jsc,
transform: {
...options.jsc.transform,
react: {
...options.jsc.transform.react,
// 自定义 React 转换选项
pragma: 'React.createElement',
pragmaFrag: 'React.Fragment'
}
}
}
};
});
}
})
);
}
} satisfies EsmxOptions;React SSR 完全支持。React 组件可以直接使用 react-dom/server 进行渲染,无需特殊的 loader 配置:
import { renderToString } from 'react-dom/server';
import { App } from './App';
export async function render(context) {
const html = renderToString(<App />);
context.html = html;
}import type { EsmxOptions } from '@esmx/core';
export default {
async devApp(esmx) {
return import('@esmx/rspack-react').then((m) =>
m.createRspackReactApp(esmx)
);
}
} satisfies EsmxOptions;import type { EsmxOptions } from '@esmx/core';
export default {
async devApp(esmx) {
return import('@esmx/rspack-react').then((m) =>
m.createRspackReactApp(esmx, {
css: 'css', // 将 CSS 输出到独立文件
cssLoader: {
modules: {
localIdentName: '[name]__[local]--[hash:base64:5]'
}
}
})
);
}
} satisfies EsmxOptions;import type { EsmxOptions } from '@esmx/core';
export default {
async devApp(esmx) {
return import('@esmx/rspack-react').then((m) =>
m.createRspackReactApp(esmx, {
swcLoader: {
jsc: {
parser: {
syntax: 'typescript',
tsx: true,
decorators: true
},
transform: {
legacyDecorator: true
}
}
}
})
);
}
} satisfies EsmxOptions;