DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

Vite 预构建漏掉导入

Vue setup 或 Svelte TS 脚本中,typescript、typeorm 值导入可能被旧扫描正则误当成 import type。核对单词边界与正式 8.3.4 实现。

Vue 的 <script setup lang="ts"> 或 Svelte 的 TypeScript 脚本中有正常的值导入,依赖扫描却没有把包找出来。检查时可以留意导入变量名是否以 type 开头:

import typescript from 'typescript'
import typeorm from 'typeorm'

这两行不是 import type。旧扫描辅助逻辑曾把 typescript、typeorm 这类绑定名误判为类型导入,跳过其包路径。包已经安装,也不能消除这个文本匹配错误。

问题在特定的 TypeScript 扫描辅助路径

Vite 为 Vue setup 和 Svelte 的 TypeScript 脚本提供一段辅助扫描:有些导入在转译阶段看似未使用,会被 esbuild 去掉,后续扫描就无法继续追踪。辅助逻辑提取导入来源,补上供扫描使用的导入,避免漏掉这些依赖。

它同时需要排除真正的类型导入。旧正则用了下面的负向判断:

(?!\s+type)

这里只检查 type 四个字母,没有要求后面是单词边界。因此,import typescript from ... 也符合“import 后面跟着 type”的字面特征,被误排除。

修正后的判断是:

(?!\s+type\b)

type 必须作为完整单词出现,才按这一规则排除。typescript 和 typeorm 后面还有字母,不会落入同一分支。

这个问题有开发分支的最小正则复现,但没有足够信息把受影响范围精确绑定到某个已安装的历史发行版。不能据此写成所有 TypeScript 文件、所有 Vite 项目都漏依赖。已核对的正式版 8.3.4 使用了带单词边界的判断。

先确认漏的是值导入

保留失败文件的完整导入行,核对它进入的脚本类型、实际解析出的包,以及预构建扫描结果。既要看绑定名,也要看代码是否真正需要这个包在运行时参与;不要仅凭包名里有 type 就归因。

如果原代码是下面这种形式,则应继续保持类型导入语义:

import type { DataSource } from 'typeorm'

它本来就不应因为类型标注而产生运行时依赖。为了让包出现在扫描结果里,统一删掉 type、增加无意义的副作用导入,可能改变打包内容和运行行为。

同样,模块解析失败、包的 exports 不允许某个子路径、插件把 TSX 送进错误解析器,都不是这条正则能够修复的。需要先确认错误发生在依赖发现阶段,而不是后续的解析或执行阶段。

使用包含边界修正的兼容版本

项目可以选择包含该修正、且与插件组合兼容的正式版本。8.3.4 的源码已能确认这一点;不要仅凭某个修复提案存在,就认定自己安装的包已经包含它。

升级后按项目原有方式重新启动开发环境,核对先前遗漏的值导入是否被发现,以及实际页面是否仍正常。扫描本身可能在运行时遇到新依赖后补做处理,因此“之前也能打开页面”不能证明预扫描没有漏项。

若应用维护的是自己复制的扫描器,才需要检查其正则中 type 后面的边界。不要把整段 Vite 内部扫描函数移进项目作为通用 API;其输入、转译和依赖发现流程并不是独立的正则匹配器。

验收时同时保留一个真实值导入和一个真正的 import type:前者应进入需要的依赖发现路径,后者仍不应凭空产生运行时导入。这样才能确认修正没有把类型与值的边界反过来破坏。