詳解unplugin?vue?components不能識別組件自動導(dǎo)入類型pnpm
引言
unplugin-vue-components 是一款能幫助組件自動導(dǎo)入的庫,簡單點的說,你不需要使用import xx from 'xxx.vue' 這行語句也能實現(xiàn)導(dǎo)入的效果。
<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>
效果
這里需要實現(xiàn)的效果如下:

發(fā)現(xiàn)問題
但是問題來了,使用pnpm的用戶,我相信許多人是實現(xiàn)不了這上效果的??????。當(dāng)所有的配置文件配好,然后就出現(xiàn)下面的效果啦?。?!
問題效果

你會發(fā)現(xiàn),在組件使用的地方的類型是any, 當(dāng)你去unplugin-vue-components 這里面點擊組件是可以進去的,那么怎么來解決這個引用問題呢?
解決問題
刨根問底
既然組件顯示的類型是any,那么咱們先看下生產(chǎn)的類型聲明文件。
// generated by unplugin-vue-components
// We suggest you to commit this file into source control
// Read more: https://github.com/vuejs/core/pull/3399
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-core 是 vue 模塊下的依賴,不是頂級依賴,導(dǎo)致聲明語句失效。(yarn 和 npm 的 node_modules 平鋪目錄結(jié)構(gòu)允許訪問所有依賴)
解決方案
- ?? (首選)在目錄的根目錄中創(chuàng)建或編輯
.npmrc文件,并在其中添加以下行:public hoist pattern[]=@vue/runtime core - (不推薦)在目錄的根目錄中創(chuàng)建或編輯
.npmrc文件,并在其中添加以下行:shamefully-hoist=true(這樣做將使所有嵌套依賴項都可用作頂級依賴項) - (不推薦)運行
pnpm add@vue/runtime core -D將嵌套模塊添加為頂級依賴項。(您必須確保@vue/runtime內(nèi)核的版本與項目中安裝的vue版本相匹配。) - (不推薦)使用
0.18.5版本的unplugin-vue-components組件,而不是最新版本。(之所以有效,是因為在此版本之前,unplugin-vue-components組件將components.d.ts中的模塊聲明為“vue”。缺點是,您將錯過插件的最新更新和改進。) - (不建議)手動更新
components.d.ts中的模塊聲明名稱,以聲明模塊“vue”,而不是聲明模塊“@vue/runtime core”(這很不方便,因為每當(dāng)取消插入vue組件自動生成新的components.d.ts文件并覆蓋您的更改時,您都必須更新模塊名稱。)
注意: 如果您選擇了選項1或2并創(chuàng)建了.npmrc文件,請在之后運行pnpm i以使用最新的配置更新node_modules。然后,重新加載工作區(qū)。自動導(dǎo)入組件的Intellisense應(yīng)再次工作。
如果這么操作還是不行,就重啟下vscode就ok啦
以上就是詳解unplugin vue components不能識別組件自動導(dǎo)入類型pnpm的詳細(xì)內(nèi)容,更多關(guān)于unplugin vue components組件導(dǎo)入的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
uni-app中使用ECharts配置四種不同的圖表(示例詳解)
在uni-app中集成ECharts可以為我們的應(yīng)用提供強大的圖表功能,我們詳細(xì)說一下如何在uni-app中使用ECharts,并配置四種不同的圖表,感興趣的朋友跟隨小編一起看看吧2024-01-01
vue 2 實現(xiàn)自定義組件一到多個v-model雙向數(shù)據(jù)綁定的方法(最新推薦)
有時候我們需要對一個組件綁定自定義 v-model,以更方便地實現(xiàn)雙向數(shù)據(jù),例如自定義表單輸入控件,這篇文章主要介紹了vue 2 實現(xiàn)自定義組件一到多個v-model雙向數(shù)據(jù)綁定的方法,需要的朋友可以參考下2024-07-07
vue通過watch對input做字?jǐn)?shù)限定的方法
本篇文章主要介紹了vue通過watch對input做字?jǐn)?shù)限定的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
vue-cli2,vue-cli3,vite?生產(chǎn)環(huán)境去掉console.log
console.log一般都是在開發(fā)環(huán)境下使用的,在生產(chǎn)環(huán)境下需要去除?,本文主要介紹了vue-cli2,vue-cli3,vite?生產(chǎn)環(huán)境去掉console.log,具有一定的參考價值,感興趣的可以了解一下2024-05-05
vue中this.$message的實現(xiàn)過程詳解
Message在開發(fā)中的使用頻率很高,也算是Element-UI組件庫中比較簡單的,對于感興趣的朋友可以一起探討一下Message組件的實現(xiàn),本文詳細(xì)介紹了vue中this.$message的實現(xiàn)過程,感興趣的同學(xué)可以參考一下2023-04-04

