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

Vue组件嵌入SVG输出[object Module]问题求助

Vue组件嵌入SVG显示[object Module]问题解决

问题描述

尝试在Vue组件中嵌入SVG,最终HTML输出始终显示[object Module]而非预期的SVG内容,未使用Mix,仅使用Webpack,相关代码如下:

相关代码

package.json

...
"devDependencies":{
    "html-loader": "^4.2.0",
    ....
}

components/SvgIcon.vue

<!-- components/SvgIcon.vue -->
<template>
    <div v-html="require(`!html-loader!@svg/${icon}.svg`)"></div>
</template>

<script>
export default {
    props: ['icon']
}
</script>

components/button.vue

<!-- components/button.vue -->
<template>
    ...
    <svg-icon icon="myicon"></svg-icon> <!-- 最终输出显示为[object Module] -->
    ...
</template>
<script>
import SvgIcon from './SvgIcon.vue';
Vue.component('svg-icon', SvgIcon)
...
</script>

webpack.config.js

// webpack.config.js
const { dirname } = require("path");
const path = require("path");

module.exports = {
    module: {
        rules: [
            {
                test: /\.svg$/,
                use: [{
                    loader: 'html-loader',
                    options: {
                        minimize: true
                    }
                }]
            },
            ...
        ]
    },
    resolve: {
        alias: {
            "@svg": path.resolve(__dirname, "svg"),
        }
    },
    ...
}

问题原因

html-loader从v4版本开始,默认启用ES模块语法(导出格式为export default 内容)。直接将require()的结果传给v-html时,得到的是一个模块对象而非SVG字符串,因此页面显示[object Module]。

解决方案

方案1:修改html-loader配置,关闭ES模块输出

在webpack.config.js的html-loader选项中添加esModule: false,让loader输出CommonJS格式的模块:

{
    test: /\.svg$/,
    use: [{
        loader: 'html-loader',
        options: {
            minimize: true,
            esModule: false // 新增该配置
        }
    }]
}

同时,SvgIcon.vue中可以去掉require里的!html-loader!前缀(因为webpack已全局配置svg使用html-loader):

<template>
    <div v-html="require(`@svg/${icon}.svg`)"></div>
</template>

方案2:保留ES模块语法,获取模块的default导出

如果不想修改webpack配置,可在SvgIcon.vue中通过.default获取SVG字符串内容:

<template>
    <div v-html="svgContent"></div>
</template>

<script>
export default {
    props: ['icon'],
    computed: {
        svgContent() {
            return require(`!html-loader!@svg/${this.icon}.svg`).default;
        }
    }
}
</script>

推荐方案1,更符合webpack全局配置的规范,无需在组件中重复指定loader。

内容的提问来源于stack exchange,提问作者bilogic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:14:56