如何在 Vue 3 中导入 svg?

新手上路,请多包涵

我试过以下: 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;
}

我的组件.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>

原文由 avenmia 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

实际上,Vue CLI 开箱即用地支持 SVG。它在内部使用 文件加载器。您可以通过在终端上运行以下命令来确认它:

 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;
}

原文由 Yom T. 发布,翻译遵循 CC BY-SA 4.0 许可协议

不能肯定地说,因为我没有尝试过 ts,但正如 这里 发布的那样

这应该工作。

 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";

原文由 Daniel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题