如何在 Vue 3 中导入 svg?
How do I import an svg in Vue 3?
我试过以下方法:
https://github.com/visualfanatic/vue-svg-loader/tree/master
但与 vue-template-compiler 存在版本冲突,因为它在 Vue 2 中使用。
我试过:
https://github.com/visualfanatic/vue-svg-loader
但我缺少特定的 vue 依赖项。
我注意到使用打字稿有一个警告,您需要声明类型定义文件。但是,我仍然得到“找不到模块'../../assets/myLogo.svg'或其相应的类型声明。”
这是我添加的:
vue.config.js
module.exports = {
chainWebpack: (config) =>
{
const svgRule = config.module.rule('svg');
svgRule.uses.clear();
svgRule
.use('vue-loader-v16')
.loader('vue-loader-v16')
.end()
.use('vue-svg-loader')
.loader('vue-svg-loader');
},
configureWebpack: process.env.NODE_ENV === 'production' ? {} : {
devtool: 'source-map'
},
publicPath: process.env.NODE_ENV === 'production' ?
'/PersonalWebsite/' : '/'
}
垫片-svg.d.ts
declare module '*.svg' {
const content: any;
export default content;
}
MyComponent.vue
<template>
<div>
<MyLogo />
</div>
</template>
<script lang="ts">
import * as MyLogo from "../../assets/myLogo.svg";
export default defineComponent({
name: "MyComponent",
components: {
MyLogo
},
props: {
},
setup(props)
{
return {
props
};
}
});
</script>
不能肯定地说,因为我还没有尝试过 ts,但是正如发布的那样 here
这应该有效。
declare module '*.svg' {
import type { DefineComponent } from 'vue';
const component: DefineComponent;
export default component;
}
我看到你正在使用:
import * as MyLogo from "../../assets/myLogo.svg";
我认为应该是:
import MyLogo from "../../assets/myLogo.svg";
实际上,Vue CLI 开箱即用地支持 SVG。它在内部使用 file-loader。您可以通过 运行 在终端上输入以下命令来确认:
vue inspect --rules
如果列出了“svg”(应该是),那么您所要做的就是:
<template>
<div>
<img :src="myLogoSrc" alt="my-logo" />
</div>
</template>
<script lang="ts">
// Please just use `@` to refer to the root "src" directory of the project
import myLogoSrc from "@/assets/myLogo.svg";
export default defineComponent({
name: "MyComponent",
setup() {
return {
myLogoSrc
};
}
});
</script>
所以不需要任何第三方库——也就是说,如果您的纯粹目的只是为了显示 SVG。
当然,为了满足类型声明上的 TypeScript 编译器:
declare module '*.svg' {
// It's really a string, precisely a resolved path pointing to the image file
const filePath: string;
export default filePath;
}
我试过以下方法: https://github.com/visualfanatic/vue-svg-loader/tree/master
但与 vue-template-compiler 存在版本冲突,因为它在 Vue 2 中使用。
我试过: https://github.com/visualfanatic/vue-svg-loader
但我缺少特定的 vue 依赖项。
我注意到使用打字稿有一个警告,您需要声明类型定义文件。但是,我仍然得到“找不到模块'../../assets/myLogo.svg'或其相应的类型声明。”
这是我添加的:
vue.config.js
module.exports = {
chainWebpack: (config) =>
{
const svgRule = config.module.rule('svg');
svgRule.uses.clear();
svgRule
.use('vue-loader-v16')
.loader('vue-loader-v16')
.end()
.use('vue-svg-loader')
.loader('vue-svg-loader');
},
configureWebpack: process.env.NODE_ENV === 'production' ? {} : {
devtool: 'source-map'
},
publicPath: process.env.NODE_ENV === 'production' ?
'/PersonalWebsite/' : '/'
}
垫片-svg.d.ts
declare module '*.svg' {
const content: any;
export default content;
}
MyComponent.vue
<template>
<div>
<MyLogo />
</div>
</template>
<script lang="ts">
import * as MyLogo from "../../assets/myLogo.svg";
export default defineComponent({
name: "MyComponent",
components: {
MyLogo
},
props: {
},
setup(props)
{
return {
props
};
}
});
</script>
不能肯定地说,因为我还没有尝试过 ts,但是正如发布的那样 here
这应该有效。
declare module '*.svg' {
import type { DefineComponent } from 'vue';
const component: DefineComponent;
export default component;
}
我看到你正在使用:
import * as MyLogo from "../../assets/myLogo.svg";
我认为应该是:
import MyLogo from "../../assets/myLogo.svg";
实际上,Vue CLI 开箱即用地支持 SVG。它在内部使用 file-loader。您可以通过 运行 在终端上输入以下命令来确认:
vue inspect --rules
如果列出了“svg”(应该是),那么您所要做的就是:
<template>
<div>
<img :src="myLogoSrc" alt="my-logo" />
</div>
</template>
<script lang="ts">
// Please just use `@` to refer to the root "src" directory of the project
import myLogoSrc from "@/assets/myLogo.svg";
export default defineComponent({
name: "MyComponent",
setup() {
return {
myLogoSrc
};
}
});
</script>
所以不需要任何第三方库——也就是说,如果您的纯粹目的只是为了显示 SVG。
当然,为了满足类型声明上的 TypeScript 编译器:
declare module '*.svg' {
// It's really a string, precisely a resolved path pointing to the image file
const filePath: string;
export default filePath;
}