You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Rollup打包React组件库时SCSS别名路径导入失败求助

Rollup构建时SCSS路径别名@scss无法解析的解决方案

问题描述

使用TypeScript、SCSS和Rollup构建React组件库,配置路径别名@scss指向src/scss,在button.module.scss中通过@use "@scss/mixins/media"导入样式文件,但执行rollup -c --bundleConfigAsCjs命令构建时出现RollupError:找不到要导入的样式表。

项目结构

elementus/
┣ src/
┃ ┣ scss/
┃ ┃ ┣ mixins/
┃ ┃ ┃ ┣ _colors.scss
┃ ┃ ┃ ┣ _flex.scss
┃ ┃ ┃ ┣ _font.scss
┃ ┃ ┃ ┣ _media.scss
┃ ┃ ┃ ┗ _typography.scss
┃ ┃ ┗ _variables.scss
┃ ┣ ui/
┃ ┃ ┗ button/
┃ ┃   ┣ Button.stories.tsx
┃ ┃   ┣ Button.tsx
┃ ┃   ┣ button.module.scss
┃ ┃   ┗ index.ts
┃ ┣ utils/
┃ ┃ ┣ classNames.ts
┃ ┃ ┗ index.ts
┃ ┣ globals.d.ts
┃ ┗ index.ts
┣ .eslintrc.cjs
┣ .gitignore
┣ README.md
┣ package-lock.json
┣ package.json
┣ rollup.config.mjs
┣ tsconfig.json
┣ tsconfig.node.json
┗ vite.config.ts

当前Rollup配置

import alias from "@rollup/plugin-alias";
import terser from "@rollup/plugin-terser";
import postcssImport from "postcss-import";
import peerDepsExternal from "rollup-plugin-peer-deps-external";
import postcss from "rollup-plugin-postcss";
import typescript from "rollup-plugin-typescript2";
import stringHash from "string-hash";

export default {
  input: ["./src/index.ts"],
  output: {
    dir: "lib",
    format: "esm",
    sourcemap: true,
    preserveModules: true,
    preserveModulesRoot: "src",
  },
  plugins: [
    peerDepsExternal(),
    typescript(),
    alias({
      resolve: [".scss"],
      replacements: {
        "@scss": "./src/scss",
      },
    }),
    terser(),
    postcss({
      plugins: [postcssImport()],
      extensions: [".scss"],
      minimize: true,
      modules: {
        generateScopedName: (name, filename, css) => {
          if (filename.includes("global")) {
            return name;
          }
          const hash = stringHash(css).toString(36).substring(0, 5);
          return `elementus_${name}_${hash}`;
        },
      },
    }),
  ],
};

解决方案

1. 修复Rollup别名配置(使用绝对路径+新语法)

@rollup/plugin-alias的replacements选项已废弃,改用entries并使用绝对路径,避免相对路径解析基准混乱:

import path from 'path'; // 新增路径模块导入

// ...其他导入代码

alias({
  resolve: ['.scss'],
  entries: [ // 替换原replacements配置
    { find: '@scss', replacement: path.resolve(__dirname, 'src/scss') }
  ]
}),

2. 让postcss-import识别@scss别名

SCSS内部的@use语句由postcss-import处理,需单独配置别名解析逻辑:

postcss({
  plugins: [
    postcssImport({
      resolve(id, basedir) {
        // 处理以@scss/开头的路径
        if (id.startsWith('@scss/')) {
          return path.resolve(__dirname, 'src/scss', id.substring(6));
        }
        // 其他路径保持默认解析逻辑
        return require.resolve(id, { paths: [basedir] });
      }
    })
  ],
  // 其余配置保持不变
}),

3. 调整插件执行顺序

确保alias插件在postcss之前执行,让Rollup先完成路径别名解析,再由postcss处理样式文件:

plugins: [
  peerDepsExternal(),
  typescript(),
  alias(/* 配置 */),
  postcss(/* 配置 */), // 将postcss移至terser之前、alias之后
  terser(),
],

4. 同步IDE路径别名(可选)

在tsconfig.json的compilerOptions中添加路径别名,确保开发时IDE能正确识别跳转:

{
  "compilerOptions": {
    // ...其他配置
    "paths": {
      "@scss/*": ["src/scss/*"]
    }
  }
}

内容的提问来源于stack exchange,提问作者A. B. Raihan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:22:50