【问题标题】:How do I import an svg in Vue 3?如何在 Vue 3 中导入 svg?
【发布时间】:2021-03-13 22:50:41
【问题描述】:

我尝试了以下操作: https://github.com/visualfanatic/vue-svg-loader/tree/master

但与 vue-template-compiler 存在版本冲突,因为它在 Vue 2 中使用。

我试过了: https://github.com/visualfanatic/vue-svg-loader

但我缺少一个特定的 vue 依赖项。

我注意到使用 typescript 有一个警告,您需要声明类型定义文件。但是,我仍然得到“找不到模块 '../../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/' : '/'
}

shims-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>

【问题讨论】:

    标签: javascript typescript vue.js svg vuejs3


    【解决方案1】:

    不能肯定地说,因为我没有尝试过 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";
    

    【讨论】:

    • 我不知道为什么,但它说它找不到 DefineComponent 类型。 “模块'”../node_modules/vue/dist/vue“'没有导出成员'DefineComponent'。你的意思是'defineComponent'吗?” defineComponent 不是类型。
    • 将导入更改为:“import MyLogo From "../../assets/myLogo.svg" 我收到以下错误。VM117:1 Uncaught DOMException: Failed to execute 'createElement' on '文档':提供的标签名称('/img/myLogo.0b631187.svg')不是有效的名称。
    【解决方案2】:

    实际上,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;
    }
    

    【讨论】:

    • 它“有效”,但编译后的 svg 位置显示 svg 代码,前面带有以下消息:此 XML 文件似乎没有任何与之关联的样式信息。文档树如下所示。
    • 我放弃了并将其移至公开,否则这似乎是一个不错的选择 npmjs.com/package/vue-svg-inline-plugin 。这个答案只是将整个内容复制为纯字符串......它适用于零浏览器。如果您不顾一切,可以将其转换为 base64 数据 URI...
    • @RayFoss 正如我所说,它是带有文件加载器的 Vue CLI。你的设置是什么?您的评论并不能帮助其他人理解这如何会使寻求答案的人失败。
    • @YomT。 CodeSanbox 的 Vue 3 模板,特别是 codesandbox.io/s/vue-3-worker-fibonacci-9v1li
    • @RayFoss 这似乎只能进一步证明它开箱即用。
    猜你喜欢
    • 2020-03-27
    • 2021-02-13
    • 2022-01-05
    • 2022-01-09
    • 2017-11-25
    • 2023-01-20
    • 2022-08-20
    • 2021-10-04
    相关资源
    最近更新 更多