前端 Vite 项目使用 vite-plugin-dts 打包输出.d.ts文件,分析处理踩坑:Cannot find module ‘vue‘. Did you mean to set ...
创始人
2024-11-04 11:07:40

最近在尝试做一个自己的前端组件库,build 打包构建的时候要输出 .d.ts类型文件,用到 vite-plugin-dts 这个 vite 插件,这里记录自己的使用和踩坑记录,会逐步分析解决问题,跟着思路相信会比较清晰。

安装 vite-plugin-dts

pnpm i vite-plugin-dts -D 

简单使用

先 import 导入一下,然后直接作为插件引入即可,例如:

import { resolve } from "path"; import { defineConfig } from "vite"; import dts from "vite-plugin-dts";  export default defineConfig({   build: {     lib: {       entry: resolve(__dirname, "src/index.ts"),       name: "MyLib",       formats: ["es"],       fileName: "my-lib"     }   },   plugins: [dts()] //在这里作为插件引入 }); 

处理踩坑

引入插件之前 build 是正常的,引入之后 build 报错如下:

src/index.ts:1:26  - error TS2792: Cannot find module 'vue'. Did you mean to set the 'moduleResolution' option to 'nodenext', or to add aliases to the 'paths' option?  1 import type { App } from 'vue';                            ~~~~~ src/index.ts:2:20  - error TS2792: Cannot find module './components/Button'. Did you mean to set the 'moduleResolution' option to 'nodenext', or to add aliases to the 'paths' option?  2 import Button from './components/Button'; 

先直接讲解决方案,有耐心的看后续分析

  1. 在根目录下新建 tsconfig.build.json 文件,写入内容如下:
{   "extends": "@vue/tsconfig/tsconfig.dom.json",   "include": ["src/index.ts", "src/components/**/*", "src/hooks/**/*"],   //include内容根据具体情况自己定制,我是根据组件库自己修改的,如果没动过原来的应该是,下面这个:   //"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],   "compilerOptions": {     "baseUrl": ".",     "paths": {       "@/*": ["./src/*"]     }   },   "references": [     {       "path": "./tsconfig.node.json"     },     {       "path": "./tsconfig.app.json"     }   ] } 
  1. 然后把tsconfig.build.json导入到 vite.config.ts 的插件 dts()中:
dts({ tsconfigPath: "./tsconfig.build.json" }); 
  1. 先 build 一下,看看找不到 Vue 的报错有没有消失,如果消失了说明问题已经解决了,其他的报警应该是路径的问题,把相对路径改成以@/*这种形式的绝对路径,因为tsconfig.build.json中配置了baseUrlpaths,所以要使用绝对路径,而不能使用相对路径,不然插件会找不到。

这样重新 build 就可以了,错误应该会消失。有耐心的朋友可以看看我是怎么一步一步分析和解决的哈。

先说明我的报错的环境

我的项目是 vite 5,vue 3.4, TS 5.4,使用 Vue 官方的推荐安装方式安装的项目环境。安装完成后根目录中有三个 tsconfig 相关的文件,分别是 tsconfig.json,tsconfig.node.json,tsconfig.app.json,其中 tsconfig.json 的内容如下:

{   "files": [],   "references": [     {       "path": "./tsconfig.node.json"     },     {       "path": "./tsconfig.app.json"     }   ] } 

分析报错以及初步尝试修改

报错的位置:src/index.ts

报错的类型: TS 报错

报错的结果:找不到相关模块。如’vue’,‘./components/Button’

报错修改建议:尝试修改 'moduleResolution'nodenext,或者给 paths 添加别名。

初步尝试:
尝试一:全局搜索'moduleResolution'发现他在tsconfig.node.json中,修改后并没有消除错误。

尝试二:我发现 tsconfig.app.json 中"compilerOptions"paths中已经添加了@/*,如下,于是我尝试把'./components/Button'这种相对路径的写法改成带'@/*'的方式,结果 build 还是报错,错误几乎没变。

"paths": {     "@/*": ["./src/*"] } 

后续又去各个国内外知名论坛社区搜了搜,问了AI 发现好多根社区答案重复,尝试了好多方案还是没解决,真是痛苦。

分析和解决

自己根据报错提示和社区没有找到正确的方式,然后就去 vite-plugin-dts官方 github 仓库,看看 issues(找到了一个跟我类似的但是还没解决,我后续解决了之后还给他写了一大篇英文 comment,我见不得别人受苦哈哈哈),看看源码和文档说明。结果看到了关于 options 的接口说明,其中有这么一个属性字段:

/**    * Specify tsconfig.json path    *    * Plugin resolves `include` and `exclude` globs from tsconfig.json    *    * If not specified, plugin will find config file from root    */   tsconfigPath?: string, 

这段代码就是说的,tsconfigPath 是可选的,如果指定了路径,插件会从指定的路径中读取配置文件,然后根据 include 和 exclude 选项来解析 glob 表达式,如果没有指定就从项目根目录找 tsconfig.json 文件。

这就提示我了,默认不传参,插件会从项目根目录开始搜索 tsconfig.json 文件,然后根据 include 和 exclude 选项来解析 glob 表达式。

但是我自己的 tsconfig.json 文件内部是 references 的其他两个文件,除了这两个里面自己并没有 include 和 exclude 选项,所以插件很可能没有解析到 include 和 exclude,这样的效果就是:插件就相当于没有找到任何文件,所以没有生成类型文件。

为了验证我自己的想法,我去 dist 目录一看果然一个都没有生成.d.ts类型文件,稍微看一下源码 getTsConfig 函数的实现,发现确实是进行文件读取再解构得出的 include 和 exclude 一系列配置的,更加验证了我的猜想。

于是我尝试把 tsconfig.app.json 中的 include 和"compilerOptions"的内容复制到 tsconfig.json 中,但是直接就报警告了,说可能会让后续 references 的内容失效,但是我就是想确认一下,所以就没管报警直接 build 的了一下,直接就成功了,现在就只差消除警告了。

上文说过tsconfigPath可以传进去一个配置,用来代替tsconfig.json,所以只需要新建一个tsconfig.build.jsontsconfig.json的内容复制一份进去,然后把这个路径传给vite-plugin-dts插件,就可以了。
我自己的tsconfig.build.json内容如下:

{   "extends": "@vue/tsconfig/tsconfig.dom.json",   "include": ["src/index.ts", "src/components/**/*", "src/hooks/**/*"],   //include内容根据具体情况自己定制,我是根据组件库自己修改的,如果没动过原来的应该是,下面这个:   //"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],   "compilerOptions": {     "baseUrl": ".",     "paths": {       "@/*": ["./src/*"]     }   },   "references": [     {       "path": "./tsconfig.node.json"     },     {       "path": "./tsconfig.app.json"     }   ] } 

vite.config.ts 的 plugins 配置内容:

plugins: [     vue(),     vueJsx(),     dts({       tsconfigPath: './tsconfig.build.json',     }),   ], 

这样就可以通过 build 生成类型文件了。

总结

本文介绍了 vite-plugin-dts 插件的安装和使用,以及如何解决报错使用插件时遇到的找不到相关模块的问题,层层分析错误,并最终找到解决方案,授之以鱼,且授之以渔,学会这个思路,下次你也行。有收获的话可以点个赞哟。

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...