unplugin-vue-components 不能识别组件的自动导入的类型 (pnpm)

文章讨论了unplugin-vue-components库在pnpm环境中导致组件类型显示为any的问题。原因是pnpm的依赖结构限制。提供了多种解决方案,包括修改.npmrc文件、使用较旧版本的unplugin-vue-components或手动调整类型声明。建议用户根据情况选择方案,并在更改后更新node_modules和重启VSCode。
摘要由CSDN通过智能技术生成

引言

unplugin-vue-components 是一款能帮助组件自动导入的库,简单点的说,你不需要使用import xx from 'xxx.vue' 这行语句也能实现导入的效果。

<script setup lang="ts">
import ScreenAdpter from '@compontents/ScreenAdpter/index.vue'
import Play from '@components/Play/index.vue'

</script>

<template>
    <ScreenAdpter>
        <Play></Play>
    </ScreenAdpter>
</template>

<style scoped></style>

等同于以下效果

<script setup lang="ts">
</script>

<template>
    <ScreenAdpter>
        <Play></Play>
    </ScreenAdpter>
</template>

<style scoped></style>

效果

这里需要实现的效果如下:请添加图片描述

发现问题

但是问题来了,使用pnpm的用户,我相信许多人是实现不了这上效果的😀😀😀。当所有的配置文件配好,然后就出现下面的效果啦!!!

问题效果

请添加图片描述
你会发现,在组件使用的地方的类型是any, 当你去unplugin-vue-components 这里面点击组件是可以进去的,那么怎么来解决这个引用问题呢?

解决问题

刨根问底

既然组件显示的类型是any,那么咱们先看下生产的类型声明文件。

// generated by unplugin-vue-components
// We suggest you to commit this file into source control
// Read more: types(defineComponent): support for expose component types by pikax · Pull Request #3399 · vuejs/core
import '@vue/runtime-core'

export {}

declare module '@vue/runtime-core' {
  export interface GlobalComponents {
    Play: typeof import('./components/Play/index.vue')['default']
    RouterLink: typeof import('vue-router')['RouterLink']
    RouterView: typeof import('vue-router')['RouterView']
    ScreenAdpter: typeof import('./components/ScreenAdpter/index.vue')['default']
  }
}

在自动生成的components.d.ts文件中的 declare module '@vue/runtime-core' 声明,在 pnpm 中只能访问项目的顶级依赖,而 @vue/runtime-corevue 模块下的依赖,不是顶级依赖,导致声明语句失效。(yarnnpmnode_modules 平铺目录结构允许访问所有依赖)

解决方案

  1. 🌟 (首选)在目录的根目录中创建或编辑.npmrc文件,并在其中添加以下行:public hoist pattern[]=@vue/runtime core

  2. (不推荐)在目录的根目录中创建或编辑.npmrc文件,并在其中添加以下行:shamefully-hoist=true(这样做将使所有嵌套依赖项都可用作顶级依赖项)

  3. (不推荐)运行pnpm add@vue/runtime core -D将嵌套模块添加为顶级依赖项。(您必须确保@vue/runtime内核的版本与项目中安装的vue版本相匹配。)

  4. (不推荐)使用0.18.5版本的unplugin-vue-components组件,而不是最新版本。(之所以有效,是因为在此版本之前,unplugin-vue-components 组件将components.d.ts中的模块声明为“vue”。缺点是,您将错过插件的最新更新和改进。)

  5. (不建议)手动更新components.d.ts中的模块声明名称,以声明模块“vue”,而不是声明模块“@vue/runtime core”(这很不方便,因为每当取消插入vue组件自动生成新的components.d.ts文件并覆盖您的更改时,您都必须更新模块名称。)

注意:
如果您选择了选项1或2并创建了.npmrc文件,请在之后运行pnpm i以使用最新的配置更新node_modules。然后,重新加载工作区。自动导入组件的Intellisense应再次工作。

如果这么操作还是不行,就重启下vscodeok

祝福

即将接近2022年除夕啦,小编在这里祝福大家在新的一年里,新年快乐,心想事成,万事如意,代码永无bugger🎉🎉🎉🎉

unplugin-vue-components

Vue.js项目中,`npm i -D unplugin-vue-components unplugin-auto-import` 是用来安装两个插件命令的命令行操作。`unplugin-vue-components` 和 `unplugin-auto-import` 是Unplugin家族的一部分,Unplugin是一个旨在简化Vue.js配置的工具。 - `npm i -D` 是一个全局安装命令,`-D` 表示以开发依赖(devDependencies)的形式安装。这样做的好处是可以确保这些依赖只在开发环境中使用,不会打包到生产环境。 - `unplugin-vue-components` 是用于自动化管理Vue组件导入的插件,它可以帮助你从大型组件库中按需引入组件,减少不必要的打包体积。 - `unplugin-auto-import` 则是自动导入所需的外部依赖,比如CSS文件和TypeScript声明文件。 以下是安装过程的演示: ```sh # 在终端中,进入你的Vue.js项目目录 cd my-vue-project # 使用npm或yarn安装 npm install -D unplugin-vue-components unplugin-auto-import # 或者 yarn add -D unplugin-vue-components unplugin-auto-import # 如果是Unplugin CLI,还需要先全局安装 npm install -g @vue/cli-plugin-unplugin # 或者 yarn global add @vue/cli-plugin-unplugin # 接下来,在项目的根目录下创建一个配置文件,如.config/unplugin.js (如果不存在) # 内容可能类似于: // unplugin相关配置 module.exports = { plugins: [ { plugin: '@unplugin/vuex', options: {} }, { plugin: '@unplugin/router', options: {} }, { plugin: 'unplugin-vue-components', options: { componentsDir: 'src/components' } }, { plugin: 'unplugin-auto-import', options: { css: true, dts: true } } ] } # 然后运行 vue.config.js 或者 @vue/cli-service.config.js 的更新命令,让配置生效 vue.config.update() # 或者 npm run build --update ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值