VSCode 在编译时显示 .vue 导入的“找不到模块”TS 错误

Posted

技术标签:

【中文标题】VSCode 在编译时显示 .vue 导入的“找不到模块”TS 错误【英文标题】:VSCode showing "cannot find module" TS error for .vue import while compiling doesn't 【发布时间】:2019-07-17 06:06:39 【问题描述】:

简单地说,vscode 在一个模块中显示了这个错误:

找不到模块'@/components/SidebarToggleIcon'

但是在编译过程中没有出现这样的错误。

这是一个 VueJS 项目,SidebarToggleIcon 是一个 .vue 文件,在 <script lang="ts"> 部分带有 TypeScript。在我添加 @vue/eslint-config-typescript 包之前,此错误在 VSCode 和编译期间出现。现在只是显示在 VSCode 中。

Sidebar.vue

<script lang="ts">
// [skip other imports]
import SidebarToggleIcon from '@/components/SidebarToggleIcon';

@Component
export default class LayoutSidebar extends Vue 

    get sidebarCollapsed(): boolean 
        return preferenceModule.sidebarCollapsed;
    


</script>

SidebarToggleIcon.vue

<script lang="ts">
import Vue from 'vue';
import  getModule  from 'vuex-module-decorators';
import Component from "vue-class-component";
import PreferencesStore from '@/store/PreferencesStore';

const preferenceModule: PreferencesStore = getModule(PreferencesStore);

@Component
export default class SidebarToggleIcon extends Vue 

    get sidebarCollapsed(): boolean 
        return preferenceModule.sidebarCollapsed;
    

    toggle()
        preferenceModule.ToggleSidebar();
    

</script>

这是为什么?我该如何解决?

编辑:不是@ 别名有关的问题,它们可以正确解决(在屏幕截图中,错误上方的行使用它,我使用它else-wear 在项目中),使用相对路径时仍然会出现此错误。我的 TSConfig 有适当的 "paths": "@/*": ["src/*"] 项目。如果这是问题编译也会抛出这个错误,它不会,这仅存在于 VSCode 中。

【问题讨论】:

您找到解决方案了吗?我也遇到了这个错误。 【参考方案1】:

这是因为 TypeScript 不会自动解析 webpack 别名。

TS解析别名需要在tsconfig.jsoncompilerOptions.paths下添加:

  
  "compilerOptions": 
   "paths": 
     "@/*": [
      "./*"
     ]
    
  

【讨论】:

Webpack 别名正在正确解析,请参阅上面的行,它也有一个 @。这不是问题。我可以使用直接路径,这仍然会出现。 另一个选项是它不能正确解析*.vue 文件。您是否尝试向文件添加扩展名以查看它是否有效?例子。 @/components/SidebarToggleIcon.vue 我也试过了。我什至用 vuecli 创建了一个全新的 vue typescript 项目,但问题仍然存在,但仅限于 vscode。 SO,创建了一个新的干净项目,并在我的所有代码中手动编写,我现在可以在导入文件名的末尾使用.vue 进行导入。 这对我没有用。我还没有弄清楚该怎么做【参考方案2】:

在 Sidebar.vue 文件中,尝试在导入声明中添加“.vue”扩展名,如下所示:

import SidebarToggleIcon from '@/components/SidebarToggleIcon.vue';

【讨论】:

这个答案对我有用。也许它与我有这个的 shims-vue.d.ts 有关:declare module '*.vue' import type DefineComponent from 'vue' const component: DefineComponent&lt;, , any&gt; export default component 【参考方案3】:

在我的机器上,VS Code 扩展 Vetur 为我的多项目存储库中的 &lt;script lang="ts"&gt; Vue 组件中的 @/ 导入生成错误消息。

似乎 Vetur 在 VS Code 工作区的***文件夹中查找 tsconfig.json。我的 Vue 应用程序及其 tsconfig.json 位于一个子文件夹中。调用 TypeScript 编译器时,Vetur 没有传递正确的设置。

解决方案 1(临时破解)

从 Vue 项目的根文件夹中启动 VS Code。 (与正确的tsconfig.json 相同的文件夹。)

code .

确保除了compilerOptions.paths 属性(Vetur FAQ) 之外,tsconfig.json 还包含compilerOptions.baseUrl 属性。

这会改变我的 VS Code 设置和扩展设置;因为项目级 .vscode 文件夹不再可访问。 (我使用符号链接来保持工作区级别和 Vue 级别的 .vscode 文件夹同步。)

解决方案 2(破解)

我的工作区中有一个 Vue 项目,因此我将修改后的 tsconfig.json 文件添加到我的整个工作区文件夹(我的 Vue 应用程序文件夹的父文件夹)。


  "compilerOptions": 
    "baseUrl": ".",
    "paths": 
      "@/*": ["myVue/src/*"]
    
  ,
  "exclude": ["node_modules"]

除了"paths" 属性(同样是Vetur FAQ)之外,我还需要"baseUrl" 属性。

我重新加载了 VS Code 以使更改生效。

"exclude" 属性可能不是必需的,但我很担心 Vetur 调用 TypeScript 编译器在node_modules 文件夹上浪费时间。

背景

这可能与(当前)未解决的 Vetur 问题 Multi root support #424 有关。 (总结:Vetur 期望在 VS Code 工作区***文件夹中恰好有一个 SPA。)

【讨论】:

【参考方案4】:

在导入时添加 .vue 扩展后,我通过为 vue 文件添加 typescript shims 解决了这个错误。

我在typings/sfc.d.ts 中创建了一个包含以下内容的文件:

declare module '*.vue' 
    import Vue from 'vue'
    export default Vue

参考资料: https://github.com/vuejs/vue/issues/5298#issuecomment-453036640

【讨论】:

我将它添加到我的src/ 文件夹中(使用electron-webpack),这解决了问题。我只是不知道为什么它解决了这个问题......【参考方案5】:

如果 Vetur 扩展导致错误并且您正在使用 tsconfig 路径映射,那么对我有用的是在***文件夹中创建一个 vetur.config.js 文件,指定在哪里可以找到 tsconfig.json 文件,如下所示:

module.exports = 
  projects: [
    
      root: "./yourprojectdirectory",
      tsconfig: "./tsconfig",
    ,
  ],
;

看起来 Vetur 会尝试在您的根目录中查找 tsconfig.json,因此如果您的项目位于子文件夹中,它将无法自行找到它。

https://vuejs.github.io/vetur/guide/setup.html#advanced

【讨论】:

【参考方案6】:

如果您正在使用 typescript 并希望从 vuejs 项目的外部库中导入组件。这就是我解决问题的方法。

    src/ 创建index.d.ts 文件 添加此代码 -> declare module 'myAwesomeLib' 导入组件 -> import SomeMethod from 'myAwesomeLib'

*.d.ts 文件用于提供关于用 javascript 编写的模块的 typescript 类型信息。

【讨论】:

【参考方案7】:

如果您在 Vue3 中的 *.vue 文件中使用 defineComponent,则它是

declare module '*.vue' 
    import defineComponent from 'vue';
    export default defineComponent;

【讨论】:

以上是关于VSCode 在编译时显示 .vue 导入的“找不到模块”TS 错误的主要内容,如果未能解决你的问题,请参考以下文章

VSCode 中是不是有用于键入时显示的快速文档的设置?

如何仅使用终端输出vscode打开JS文件时显示的问题列表:?

vscode下运行c++找不到头文件是怎么回事

VScode,c++调试时显示“找不到任务g++.exe build active file”,不能debug怎么解决呀?

在 Laravel + Vue 中页面加载时显示所有数据

仅在使用 Vue 悬停时显示截断的文本