当前位置: 首页 > 知识库问答 >
问题:

前端 - 同时使用elementPlus的自定义命名空间和自定义主题,打包报错Module loop: this module is already being loaded.?

徐卓
2025-03-17

使用vue3+vite+scss+element-plus构建项目。
同时使用elementPlus的自定义命名空间和自定义主题,在打包的时候报错
image.png
代码如下:

// styles/element/theme.scss
$lb-namespace: 'lb';

@forward 'element-plus/theme-chalk/src/mixins/config.scss' with (
    $namespace: $lb-namespace
);
@forward 'element-plus/theme-chalk/src/common/var.scss' with (
    $colors: (
        'primary': (
            'base': #3cd7da,
            'light-9': rgb(236 251 251 / 33%)
        ),
        'info': (
            'base': #16fcff
        )
    ),
    $bg-color: (
        '': #ffffff00,
        'overlay': #20577a
    ),
    $dialog: (
        'padding-primary': 12px
    ),
    $fill-color: (
        '': #344866,
        'light': #f5f7fa2b
    ),
    $text-color: (
        'primary': #16fcff,
        'regular': #16fcff,
        'secondary': #16fcff,
        // 'placeholder': darken(#16FCFF, 10%),
        // 'disabled': darken(#16fcff, 20%)
    ),
    $message: (
        'close-size': 30px
    ),
    $input: (
        'bg-color': #ffffff00
    )
);
// styles/element/light-blue.scss
@use './theme.scss' as *;
.#{$namespace}-dialog {
    background-size: cover;
    padding: 0;
    background-color: hsla(0, 0%, 100%, 0);

    .#{$namespace}-dialog__header {
        background-image: url('../../assets/images/dialog-header-bg.png');
        padding: map-get($map: $dialog, $key: padding-primary);
        background-size: unset;
        background-repeat: round;
    }

    .#{$namespace}-dialog__body {
        background: url('../../assets/images/dialog-body-bg.png') round;
        padding: 10px map-get($map: $dialog, $key: padding-primary);
        padding-bottom: 2px;
    }

    .#{$namespace}-dialog__footer {
        background: url('../../assets/images/dialog-footer-bg.png') round;
        padding: 3px map-get($map: $dialog, $key: padding-primary) map-get($map: $dialog, $key: padding-primary);
    }

    // footer带上分割线
    &.footer-top-line {
        .#{$namespace}-dialog__footer {
            border-top: 1px solid map-get($text-color, regular);
            padding-top: 10px;
        }
    }
}

在vite.config.ts中引入

css: {
            preprocessorOptions: {
                scss: {
                    javascriptEnabled: true,
                    // 目前版本sass已抛弃@import命令,改用@use
                    additionalData: `
                        @use "@mb/styles/element/light-blue.scss" as *;
                    `,
                    api: 'modern-compiler'
                }
            }
        }

全局仅此处一个地方引入。
请问打包出现报错的原因是什么,如何修改。

希望打包时不再出现上述报错。
修改后如下所示。可以正常打包,但是样式失效。比如dialog
// main.ts

// css
import '@mb/styles/element/light-blue.scss'

// vite.config.ts

export default ({ mode }: ConfigEnv): UserConfigExport => {
    return {
        plugins: [
            AutoImport({
                resolvers: [
                    ElementPlusResolver({
                        // 自动引入修改主题色添加这一行,使用预处理样式
                        // 不添加将会导致使用ElMessage,ElNotification等组件时默认的主题色会覆盖自定义的主题色
                        importStyle: 'sass'
                    })
                ],
                imports: ['vue', 'vue-router', 'vue-i18n', 'pinia'],
                dts: './types/auto-imports.d.ts',
                eslintrc: {
                    enabled: false,
                    // filepath: '.eslintrc-auto-import.json',
                    globalsPropValue: true
                }
            }),
            Components({
                resolvers: [
                    ElementPlusResolver({
                        // 按需引入修改主题色添加这一行,使用预处理样式
                        importStyle: 'sass'
                    })
                ],
                directoryAsNamespace: true,
                dts: './types/components.d.ts'
            }),
            ElementPlus({
                useSource: true
            })
        ],
        css: {
            preprocessorOptions: {
                scss: {
                    javascriptEnabled: true,
                    // 目前版本sass已抛弃@import命令,改用@use
                    api: 'modern-compiler'
                }
            }
        }
    }
}

共有1个答案

钮兴安
2025-03-17

这个错误发生的主要原因是 SCSS 中的循环引用:

  • 在 vite.config.ts 中,通过 additionalData 全局引入了 @mb/styles/element/light-blue.scss
  • 然后在每个 SCSS 文件编译时,都会预先添加这段引用
  • 当编译 light-blue.scss 本身时,它就会尝试引入自己,导致循环引用

我建议

  • 从 vite.config.ts 中移除 additionalData 中引入 light-blue.scss 的代码
  • 在 main.ts 中明确引入样式文件

首先,修改引入自定义样式的方式。在移除vite.config.ts中的additionalData后,需要确保样式被正确导入和优先级足够高。

// main.ts
// 确保自定义样式在Element Plus之前导入
import '@mb/styles/element/index.scss'; // 新增一个索引文件
// 然后再导入Element Plus组件库
import ElementPlus from 'element-plus';

styles/element/index.scss

// styles/element/index.scss
@use './theme.scss';
@use './light-blue.scss';
@use 'element-plus/theme-chalk/src/index.scss' as *;

修改 theme.scss 文件,尝试增加

// 导出命名空间以便其他文件使用
:export {
  namespace: $lb-namespace;
}

@forward 'element-plus/theme-chalk/src/mixins/config.scss' with (
  $namespace: $lb-namespace
);

应用程序入口处配置Element Plus以使用自定义命名空间

app.use(ElementPlus, {
  // 指定命名空间
  namespace: 'lb'
});
 类似资料:
  • 按照在symfony2中加载应用程序的自定义配置文件时发布的建议,我陷入了名称空间问题。 在中,我有两个文件: 上诉。php: 和Configuration.php: 似乎我犯了某种错误,将文件命名为正在执行: 结果: PHP致命错误:在/var/www/dev.investmentopportunities中找不到类“AppBundle\DependencyInjection\Configura

  • 我正在尝试将管道分隔字符串转换为xml,这很好。但是,我没有得到我在下面展示的实际输出。在我的输出中,父标记与包名一起生成,它也没有生成我想要的名称空间。你能帮我把平面文件转换成我期望的精确输出吗。 CamelConfig。JAVA ConverterRoute。JAVA 来源txt Test.java 输出 测验xml 预期产量 测验xml

  • 本文向大家介绍thinkphp autoload 命名空间自定义 namespace,包括了thinkphp autoload 命名空间自定义 namespace的使用技巧和注意事项,需要的朋友参考一下 使用thinkPHP过程中,一些自定义的类库和第三方类库需要找一个合适的位置放置,放到系统默认的org文件夹感觉不太好,破坏了thinkPHP的原生目录。 就看了一下官方手册,可以在模块或者应用的

  • 问题内容: 除了包级别注释外,还有其他方法可以使用注释来控制自定义名称空间前缀。 可以在元素级别完成吗?也可能有一个带有多个前缀的名称空间吗? 问题答案: 您实际上想做什么?为什么名称空间前缀对您很重要? 对于命名空间前缀,没有标准的元素级注释。 我知道的控制名称空间前缀的选项是: 你已经提到过。 提供习俗。 XML的低级处理(例如,在StAX,SAX或DOM级别)。 我也可以想象: / 通常使用

  • 打开主题配置 选一个自己喜欢的主题吧

  • 自定义主题 Element 默认提供一套主题,CSS 命名采用 BEM 的风格,方便使用者覆盖样式。我们提供了四种方法,可以进行不同程度的样式自定义。 主题编辑器 使用在线主题编辑器,可以修改定制 Element 所有全局和组件的 Design Tokens,并可以方便地实时预览样式改变后的视觉。同时它还可以基于新的定制样式生成完整的样式文件包,供直接下载使用(关于如何使用下载的主题包,请参考本节

  • uView目前可以自定主题色,字体颜色,边框颜色等,所有组件内部的样式,都基于同一套主题,比如您修改了primary主题色,所有用到了primary颜色 的组件都会受影响。 教程 可以在打开的颜色拾取器中输入或者选择颜色,再点"确定"按钮即可。 颜色配置完后,在页面底部下载文件,会得到一个名为uview.theme.scss的文件。 将文件复制到项目的公共目录(视情况而定)中,再在项目根目录的un

  • Element Plus 默认提供一套主题,CSS 命名采用 BEM 的风格,方便使用者覆盖样式。我们提供了四种方法,可以进行不同程度的样式自定义。 仅替换主题色 如果仅希望更换 Element Plus 的主题色,推荐使用在线主题生成工具。Element Plus 默认的主题色是鲜艳、友好的蓝色。通过替换主题色,能够让 Element Plus 的视觉更加符合具体项目的定位。 使用上述工具,可以