resolve.alias

  • 类型:
type Alias = Record<string, string | false | (string | false)[]> | Function;
  • 默认值:
const defaultAlias = {
  '@swc/helpers': path.dirname(require.resolve('@swc/helpers/package.json')),
};
  • 版本: >=1.1.7

设置文件引用的别名,对应 Rspack 的 resolve.alias 配置。

对于 TypeScript 项目,你只需要在 tsconfig.json 中配置 compilerOptions.paths 即可,Rsbuild 会自动识别它,不需要额外配置 resolve.alias 字段,详见 「路径别名」

TIP

在 Rsbuild 1.1.7 之前的版本,你可以使用 source.alias 来设置 alias,但该字段将在下一个大版本中被移除。

Object 类型

alias 的值可以定义为 Object 类型,其中的相对路径会自动被 Rsbuild 转换为绝对路径。

export default {
  resolve: {
    alias: {
      '@common': './src/common',
    },
  },
};

以上配置完成后,如果你在代码中引用 @common/Foo.tsx, 则会映射到 <project>/src/common/Foo.tsx 路径上。

Function 类型

alias 的值定义为函数时,可以接受预设的 alias 对象,并对其进行修改。

export default {
  resolve: {
    alias: (alias) => {
      alias['@common'] = './src/common';
    },
  },
};

如果你需要移除 Rsbuild 内置的 @swc/helpers 别名,可以在函数中删除它:

export default {
  resolve: {
    alias: (alias) => {
      delete alias['@swc/helpers'];
    },
  },
};

你也可以在函数中返回一个新对象作为最终结果,新对象会覆盖预设的 alias 对象。

export default {
  resolve: {
    alias: (alias) => {
      return {
        '@common': './src/common',
      };
    },
  },
};

基于 environment 设置

当你面向多个 environments 构建时,可以为每个 environment 设置不同的 alias:

比如为 webnode 环境设置不同的 alias:

export default {
  environments: {
    web: {
      resolve: {
        alias: {
          '@common': './src/web/common',
        },
      },
      output: {
        target: 'web',
      },
    },
    node: {
      resolve: {
        alias: {
          '@common': './src/node/common',
        },
      },
      output: {
        target: 'node',
      },
    },
  },
};

精确匹配

默认情况,resolve.alias 会自动匹配子路径,比如以下配置:

import path from 'node:path';

export default {
  resolve: {
    alias: {
      '@common': './src/common',
    },
  },
};

它的匹配结果如下:

import a from '@common'; // 解析为 `./src/common`
import b from '@common/util'; // 解析为 `./src/common/util`

你可以添加 $ 符号来开启精确匹配,开启后将不会自动匹配子路径。

import path from 'node:path';

export default {
  resolve: {
    alias: {
      '@common$': './src/common',
    },
  },
};

它的匹配结果如下:

import a from '@common'; // 解析为 `./src/common`
import b from '@common/util'; // 保持 `@common/util` 不变

处理 npm 包

你可以使用 alias 将某个 npm 包指向统一的目录。

比如项目中安装了多份 react,你可以将 react 统一指向根目录的 node_modules 中安装的版本,避免出现打包多份 React 代码的问题。

import path from 'node:path';

export default {
  resolve: {
    alias: {
      react: path.resolve(__dirname, './node_modules/react'),
    },
  },
};

当你在使用 alias 处理 npm 包时,请留意项目中是否使用了这个包不同的 major 版本。

比如你的项目中某个模块或 npm 依赖使用了 React 18 的 API,如果你将 React alias 到 17 版本,就会导致该模块无法引用到 React 18 的 API,导致代码异常。

处理 Loader

resolve.alias 不支持为 loader 设置别名。如果你需要为 loader 设置别名,可以使用 Rspack 的 resolveLoader 配置项。

export default {
  tools: {
    rspack: {
      resolveLoader: {
        alias: {
          'amazing-loader': require.resolve('path-to-your-amazing-loader'),
        },
      },
    },
  },
};