环境

WebStorm 2021.3.2
ant-design-vue 3.1.0-rc.4

问题描述

ant-design-vue 官方已经提供了 [web-type.json])(https://unpkg.com/browse/[email protected]/vetur/web-types.json) 并且 WebStorm 2021.3.2 版本也支持 web-type.json, 但是这仅仅适用于全局引用的情况。也就是说我们的 antd 包,必须说完全引入,如下面这样使用

//  main.ts
import { createApp } from "vue";
import Antd from "ant-design-vue";
import App from "./App";
import "ant-design-vue/dist/antd.css";

const app = createApp(App);

app.use(Antd).mount("#app");

这样调用

<template>
  <a-button size="large">按钮</a-button>
</template>

这肯定不是我们想要的结果,我们想要的是按需引用,像下面这样调用

<template>
  <Button size="large">按钮</Button>
</template>
<script lang="ts" setup>
import { Button } from "ant-design-vue";
</script>

但是如果我们按照上面这种方法书写的话,会导致 <Button> 组件,没有 props 提示,并且使用其他组件时,即使在 script 中进行引用,但是由于 setup 语法糖的问题

还是没有办法提示组件名和 porps.

我们来看下 antd 提供的 web-types.json 里面定义的 tag 名称是这样的

{
  "tags": [
    {
      "name": "a-alert",
      "attributes": []
    }
  ]
}

聪明的同学可能想到了,那么我们自己定一个 web-types.json 文件,将 name 改成 Alert 这样的不就行了吗?

答案是不行的,即使我们修改或者引用了我们自己的 web-types.json 文件,当我们在 setup 里面引用 Button 时,

WebStorm 还是会优先分析 import 的类型导出。也就是说如果我们使用 import { Button } from "ant-design-vue"; 来导入

<Button> 组件,它会覆盖 i 刚刚我们自己的 web-types.json 文件。

奇怪 🤔 你不是说 WebStorm 处理不了 setup 语法糖吗。 其实它并不是处理不了,而是没办法理解 antd 的组件导出方式

那么有没有一种办法,既让它有提示,还是按需引用呢?

还真有,就是用 vscode 就行了, vscode 的 vetur 插件对这块支持很好。

??

说了半天让换编辑器?

其实除此之外还真有一种不换编辑器,不换框架的解决方法,就是使用

unplugin-vue-components vite 插件,这样既能实现按需引用,同时也能支持代码提示。

unplugin-vue-components 插件是用于自动引入组件的,也就是说我们可以直接使用组件,而不需要引用

首先我们来安装下

$ yarn add unplugin-vue-components -D

然后我们来编辑下 vite.config.ts

// vite.config.ts
import Components from "unplugin-vue-components/vite";
import { AntDesignVueResolver } from "unplugin-vue-components/resolvers";

export default defineConfig({
  plugins: [
    Components({
      dts: true,
      resolvers: [AntDesignVueResolver()],
    }),
  ],
});

这样的话,我们清理下编辑器缓存并重启,我们依次点击 File->Invalidate Caches->Invalidate And Restart

重启之后我们就可以直接在有组件提示的情况下,开心的开发了。比如我们要使用 <Button> 组件可以这样写

<template>
  <AButton size="large">按钮</AButton>
  <AFormItem :has-feedback="false"></AFormItem>
</template>
<script lang="ts" setup>
//  这里不需要引用 AButton 因为 unplugin-vue-components 插件会自动引用
//  此时我们去修改 AButton 上的 props 已经有代码提示了
</script>