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

View File

@ -3,6 +3,7 @@ import {
mergeRsbuildConfig,
type RsbuildConfig,
type RsbuildMode,
type ConfigParams,
} from "@rsbuild/core";
import { getHaloPluginManifest } from "./utils/halo-plugin";
import { DEFAULT_OUT_DIR_DEV, DEFAULT_OUT_DIR_PROD } from "./constants/build";
@ -21,7 +22,7 @@ export interface RsBuildUserConfig {
/**
* Custom Rsbuild config.
*/
rsbuild: RsbuildConfig;
rsbuild: RsbuildConfig | ((env: ConfigParams) => RsbuildConfig);
}
function createRsbuildPresetsConfig(manifestPath: string) {
@ -134,6 +135,10 @@ export function rsbuildConfig(config?: RsBuildUserConfig) {
);
return defineConfig((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 { EXTERNALS, GLOBALS } from "./constants/externals";
import { DEFAULT_OUT_DIR_DEV, DEFAULT_OUT_DIR_PROD } from "./constants/build";
@ -16,7 +21,7 @@ export interface ViteUserConfig {
/**
* Custom Vite config.
*/
vite: UserConfig;
vite: UserConfig | UserConfigFnObject;
}
function createVitePresetsConfig(manifestPath: string) {
@ -72,6 +77,10 @@ export function viteConfig(config?: ViteUserConfig) {
);
return defineConfig((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);
});
}