【问题标题】:Importing a *.svg module raises Typescript error : "Cannot find module ..."导入 *.svg 模块会引发 Typescript 错误:“找不到模块...”
【发布时间】:2019-05-25 01:05:41
【问题描述】:

这是一个使用@vue/cli 制作的网络应用程序。 我想使用vue-svg-loader 将内联Svg 加载为vue 组件。

正如vue-svg-loader installation guide 所说,我将此代码放在vue.config.js 中:

module.exports = {
  chainWebpack: (config) => {
    const svgRule = config.module.rule('svg');
    svgRule.uses.clear();
    svgRule
      .use('vue-svg-loader')
      .loader('vue-svg-loader');
  },
};

并使用import ViwanMap from '@/assets/ViwanMap.svg'; 导入我的Svg 文件。

另外,我在src/ 文件夹中创建了一个shims-svg.d.ts,其中包含:

import { VNode } from 'vue';
declare global {
  type Svg = VNode; // With vue-svg-loader, imported svg is a Vue component.
}

declare module '*.svg' {
  const content: Svg;
  export default content;
}

还有我的tsconfig.js

{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "types": [
      "webpack-env"
    ],
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx"
  ],
  "exclude": [
    "node_modules"
  ]
}

编译过程引发此错误:

ERROR in <MY_PROJECT_ROOT>/src/views/Home.vue
12:22 Cannot find module '@/assets/ViwanMap.svg'.

但是,webpack 进程似乎可以正常工作,因为 svg 显示在我的应用程序中。这似乎只是一个打字稿问题。你知道是什么问题吗? 谢谢你:)

【问题讨论】:

    标签: typescript svg vue.js


    【解决方案1】:

    Harshal Patil 的回答有效,但我使用了这里的内容:Official Documentation

    declare module '*.svg' {
      import Vue, {VueConstructor} from 'vue';
      const content: VueConstructor<Vue>;
      export default content;
    }
    

    【讨论】:

    • 我已经把它放在shims-svg.d.ts 中并且效果很好
    【解决方案2】:

    您只需对 .svg 文件的模块声明进行少许调整。你的shims-svg.d.ts 文件应该是:

    declare module '*.svg' {
    
        import { VNode } from 'vue';
    
        // DON'T DECLARE THIS INSIDE GLOBAL MODULE
        type Svg = VNode;
    
        const content: Svg;
        export default content;
    }
    

    请注意,全局范围的扩充只能直接嵌套在外部模块或环境模块声明中。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    相关资源
    最近更新 更多