feat(ui-plugin-bundler-kit): support function-based configuration for env-aware builds (#7572)

#### What type of PR is this?

/area ui
/area plugin
/kind improvement
/milestone 2.21.x

#### What this PR does / why we need it:

rsbuild example:

```ts
export default rsbuildConfig({
  rsbuild: ({ env, envMode }) => {
    console.log(env,envMode);

    return {
      resolve: {
        alias: {
          "@": "./src",
        },
      },
      plugins: [pluginSass()],
    };
  },
});
```

```ts
export default viteConfig({
  vite: ({ mode }) => {
    const env = loadEnv(mode, process.cwd(), '');
    console.log(env);
    return {
      resolve: {
        alias: {
          "@": fileURLToPath(new URL("./src", import.meta.url)),
        },
      },
    };
  },
});
```

#### Does this PR introduce a user-facing change?

```release-note
None
```
pull/7586/head
Ryan Wang 2025-06-19 16:05:01 +08:00 committed by GitHub
parent 4ca0a09281
commit b602195b11
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 21 additions and 7 deletions

View File

@ -114,7 +114,7 @@ interface ViteUserConfig {
/** /**
* Custom Vite configuration * Custom Vite configuration
*/ */
vite: UserConfig; vite: UserConfig | UserConfigFnObject;
} }
``` ```
@ -131,7 +131,7 @@ interface RsBuildUserConfig {
/** /**
* Custom Rsbuild configuration * Custom Rsbuild configuration
*/ */
rsbuild: RsbuildConfig; rsbuild: RsbuildConfig | ((env: ConfigParams) => RsbuildConfig);
} }
``` ```

View File

@ -3,6 +3,7 @@ import {
mergeRsbuildConfig, mergeRsbuildConfig,
type RsbuildConfig, type RsbuildConfig,
type RsbuildMode, type RsbuildMode,
type ConfigParams,
} from "@rsbuild/core"; } from "@rsbuild/core";
import { getHaloPluginManifest } from "./utils/halo-plugin"; import { getHaloPluginManifest } from "./utils/halo-plugin";
import { DEFAULT_OUT_DIR_DEV, DEFAULT_OUT_DIR_PROD } from "./constants/build"; import { DEFAULT_OUT_DIR_DEV, DEFAULT_OUT_DIR_PROD } from "./constants/build";
@ -21,7 +22,7 @@ export interface RsBuildUserConfig {
/** /**
* Custom Rsbuild config. * Custom Rsbuild config.
*/ */
rsbuild: RsbuildConfig; rsbuild: RsbuildConfig | ((env: ConfigParams) => RsbuildConfig);
} }
function createRsbuildPresetsConfig(manifestPath: string) { function createRsbuildPresetsConfig(manifestPath: string) {
@ -134,6 +135,10 @@ export function rsbuildConfig(config?: RsBuildUserConfig) {
); );
return defineConfig((env) => { return defineConfig((env) => {
const presetsConfig = presetsConfigFn(env); const presetsConfig = presetsConfigFn(env);
return mergeRsbuildConfig(presetsConfig, config?.rsbuild || {}); const userConfig =
typeof config?.rsbuild === "function"
? config.rsbuild(env)
: config?.rsbuild || {};
return mergeRsbuildConfig(presetsConfig, userConfig);
}); });
} }

View File

@ -1,4 +1,9 @@
import { defineConfig, mergeConfig, UserConfig } from "vite"; import {
defineConfig,
mergeConfig,
UserConfig,
UserConfigFnObject,
} from "vite";
import Vue from "@vitejs/plugin-vue"; import Vue from "@vitejs/plugin-vue";
import { EXTERNALS, GLOBALS } from "./constants/externals"; import { EXTERNALS, GLOBALS } from "./constants/externals";
import { DEFAULT_OUT_DIR_DEV, DEFAULT_OUT_DIR_PROD } from "./constants/build"; import { DEFAULT_OUT_DIR_DEV, DEFAULT_OUT_DIR_PROD } from "./constants/build";
@ -16,7 +21,7 @@ export interface ViteUserConfig {
/** /**
* Custom Vite config. * Custom Vite config.
*/ */
vite: UserConfig; vite: UserConfig | UserConfigFnObject;
} }
function createVitePresetsConfig(manifestPath: string) { function createVitePresetsConfig(manifestPath: string) {
@ -72,6 +77,10 @@ export function viteConfig(config?: ViteUserConfig) {
); );
return defineConfig((env) => { return defineConfig((env) => {
const presetsConfig = presetsConfigFn(env); const presetsConfig = presetsConfigFn(env);
return mergeConfig(presetsConfig, config?.vite || {}); const userConfig =
typeof config?.vite === "function"
? config.vite(env)
: config?.vite || {};
return mergeConfig(presetsConfig, userConfig);
}); });
} }