close

Environment API

在这里你可以找到所有与 environment 相关的 API。

参考 多环境构建 了解更多。

Environment context

Environment context 是一个只读对象,提供一些和当前 environment 有关的上下文信息。

  • 类型:
type EnvironmentContext = {
  name: string;
  browserslist: string[];
  config: NormalizedEnvironmentConfig;
  distPath: string;
  entry: RsbuildEntry;
  htmlPaths: Record<string, string>;
  tsconfigPath?: string;
  manifest?: Record<string, unknown> | ManifestData;
};

Environment context 可以通过以下方式获取:

  1. 在 Rsbuild 的 Plugin hooks 中,你可以通过 environmentenvironments 入参获取 environment context 对象。
  2. Environment API 中,可以通过 environments.context 获取。

name

当前环境的唯一名称,用于区分和定位环境,对应于 environments 配置中的 key。

  • 类型: string
  • 示例:
api.modifyRspackConfig((config, { environment }) => {
  if (environment.name === 'node') {
    // modify config for node environment
  }
  return config;
});

browserslist

当前环境设置的目标浏览器范围。详见 浏览器范围

  • 类型: string[]
  • 示例:
api.modifyRspackConfig((config, { environment }) => {
  console.log(environment.browserslist);
  return config;
});

config

当前环境使用的 Rsbuild 配置(经过归一化处理)。

  • 类型:
type NormalizedEnvironmentConfig = DeepReadonly<{
  dev: NormalizedDevConfig;
  html: NormalizedHtmlConfig;
  tools: NormalizedToolsConfig;
  source: NormalizedSourceConfig;
  server: NormalizedServerConfig;
  output: NormalizedOutputConfig;
  plugins?: RsbuildPlugins;
  security: NormalizedSecurityConfig;
  performance: NormalizedPerformanceConfig;
  moduleFederation?: ModuleFederationConfig;
}>;
  • 示例:
api.modifyRspackConfig((config, { environment }) => {
  // Rspack
  console.log(config);
  // Rsbuild config for current environment
  console.log(environment.config);
  return config;
});

distPath

构建产物输出目录的绝对路径,对应 Rsbuild 的 output.distPath.root 配置项。

  • 类型: string
  • 示例:
api.modifyRspackConfig((config, { environment }) => {
  console.log(environment.distPath);
  return config;
});

entry

构建入口对象,对应 source.entry 选项。

  • 类型:
type RsbuildEntry = Record<string, string | string[] | EntryDescription>;
  • 示例:
api.modifyRspackConfig((config, { environment }) => {
  console.log(environment.entry);
  return config;
});

htmlPaths

HTML 产物的路径信息。

这个值是一个对象,对象的 key 为 entry 名称,value 为 HTML 文件在产物目录下的相对路径。

  • 类型:
type htmlPaths = Record<string, string>;
  • 示例:
api.modifyRspackConfig((config, { environment }) => {
  console.log(environment.htmlPaths);
  return config;
});

tsconfigPath

tsconfig.json 文件的绝对路径,若项目中不存在 tsconfig.json 文件,则为 undefined

  • 类型:
type TsconfigPath = string | undefined;
  • 示例:
api.modifyRspackConfig((config, { environment }) => {
  console.log(environment.tsconfigPath);
  return config;
});

manifest

manifest 文件数据。仅在 output.manifest 配置被启用时才能访问。

  • 类型: Record<string, unknown> | ManifestData | undefined
  • 示例:
api.onAfterBuild(({ environments }) => {
  // Get the manifest data of web environment
  console.log(environments.web.manifest);
});

api.onAfterDevCompile(({ environments }) => {
  console.log(environments.web.manifest);
});

api.onAfterEnvironmentCompile(({ environment }) => {
  console.log(environment.manifest);
});

manifest 数据仅在构建完成后才能被访问,你可以在以下 hooks 中访问:

webSocketToken

WebSocket 认证 token,用于认证 WebSocket 连接,防止未授权访问。

仅在开发模式下可用,生产模式下为空字符串。

  • 类型: string
  • 版本: 添加于 v1.4.4

当你需要在浏览器中建立与 Rsbuild dev server 的 WebSocket 连接时,需要使用这个 token 作为 query 参数。

const { webSocketToken } = environments.web.context;

const webSocketUrl = `ws://localhost:${port}${pathname}?token=${webSocketToken}`;

Environment API

Environment API 提供一些与多环境构建相关的 API。

你可以通过 rsbuild.createDevServer()server.setup 使用 environment API,这允许你在服务端获取特定环境下的构建产物信息。

type EnvironmentAPI = {
  [name: string]: {
    context: EnvironmentContext;
    getStats: () => Promise<Stats>;
    loadBundle: <T = unknown>(entryName: string) => Promise<T>;
    getTransformedHtml: (entryName: string) => Promise<string>;
    hot: {
      send: HotSend;
    };
  };
};

context

你可以通过 Environment API 获取和当前环境有关的上下文信息。

const webManifest = environments.web.context.manifest;

console.log(webManifest.entries);

getStats

获取当前环境的产物信息。

  • 类型:
type GetStats = () => Promise<Stats>;
  • 示例:
const webStats = await environments.web.getStats();

console.log(webStats.toJson({ all: false }));

loadBundle

用于在服务端加载并执行构建产物。调用该方法后,会返回指定入口模块导出的内容,通常用于在服务端环境中运行由 Rsbuild 构建生成的产物。

loadBundle 会在构建完成且 onAfterDevCompile hook 执行结束后返回结果。因此,无法在 onAfterDevCompile hook 内调用 loadBundle

  • 类型:
/**
 * @param entryName - 入口名称,和 Rsbuild `source.entry` 的某一个 key 值对应
 * @returns 入口模块的返回值
 */
type LoadBundle = <T = unknown>(entryName: string) => Promise<T>;
  • 示例:
// 加载 `main` 入口的 bundle
const result = await environments.node.loadBundle('main');

getTransformedHtml

获取经过编译和转换后的 HTML 模版内容。

  • 类型:
type GetTransformedHtml = (entryName: string) => Promise<string>;
  • 示例:
// 获取 main 入口的 HTML 内容
const html = await environments.web.getTransformedHtml('main');

该方法会返回完整的 HTML 字符串,包含了所有通过 HTML 插件注入的资源和内容。

hot.send

向当前 environment 对应的客户端发送 HMR 消息。

它和 server.sockWrite 的行为一致,区别是只会影响当前匹配的 environment。

  • 类型:
type HotSend = {
  (type: 'full-reload', data?: { path?: string }): void;
  (type: 'static-changed'): void;
  (type: 'custom', data: { event: string; data?: any }): void;
};

full-reload

如果你发送一个 'full-reload' 的消息,页面将会重新加载。

if (someCondition) {
  environments.web.hot.send('full-reload');
}

当传入 path 且它以 .html 结尾时,Rsbuild 只会重新加载当前 environment 中 URL 与该 HTML 路径匹配的页面。

path'*' 时,Rsbuild 会重新加载当前 environment 中的所有页面。

HTML 路径应当相对于 dev server 根路径,并且不应包含 server.base

environments.web.hot.send('full-reload', {
  path: '/foo.html',
});

'static-changed''full-reload' 的一个别名。

custom

你也可以通过 custom 类型向浏览器发送自定义消息,并携带可选的 data,然后通过 HMR 事件进行处理:

environments.web.hot.send('custom', {
  event: 'count',
  data: { value: 1 },
});

Rsbuild 在 Rspack 的 import.meta.webpackHot 对象上扩展了 on() 方法,它允许你在浏览器端监听自定义事件,并处理数据:

client.js
if (import.meta.webpackHot) {
  import.meta.webpackHot.on('count', (data) => {
    console.log('count update', data.value);
  });
  import.meta.webpackHot.accept();
}