/** * Basename Injection Plugin for Rspack * * 在 module rules 最前面注入一个 loader,仅匹配应用入口文件, * 把入口里的 process.env.CLIENT_BASE_PATH * 改写为运行时读 window.__BASENAME__(fallback 到构建时常量)。 * * 让 BrowserRouter basename 运行时动态化,实现同一份 bundle 跑在不同 basename 下 * (默认域名 `/app/`、自定义域名 `/` 或 `/`)。 * * 入口文件识别:在 entryOption hook(配置已完全解析合并)中从 entry 提取业务入口路径, * 过滤掉 node_modules 包名(runtime 注入、polyfill 等非业务入口)和 Module Federation * 远程模块,生成精确匹配正则。兜底到 client/src/index.{tsx,ts,jsx,js} 正则。 * * 关键约束: * - 只匹配入口文件,不影响 SDK 内部代码(如 client-toolkit-lite 仍读编译期常量) * - loader 阶段天然早于 DefinePlugin 的表达式替换(rspack 内部 source-transform → parsing → DefinePlugin 流水线顺序) * enforce:'pre' 是用来跟 babel-loader / swc-loader 等其他 loader 抢先,避免被它们先处理掉表达式 * - 兜底常量来自构建时 process.env.CLIENT_BASE_PATH,保证降级运行 */ import type { Compiler } from '@rspack/core'; export interface BasenameInjectionPluginOptions { /** 编译时兜底 basename,通常等于 process.env.CLIENT_BASE_PATH */ envBasePath?: string; } export declare class BasenameInjectionPlugin { private readonly envBasePath; constructor(options?: BasenameInjectionPluginOptions); apply(compiler: Compiler): void; } export default BasenameInjectionPlugin;