Dev 启动 18 秒排查:Vite 扫描大目录

今天排查了一个 18 秒的 astro dev 启动问题。奇怪的是,astro build 明明很快,慢的只有本地开发服务器启动。

找到真凶

我先看 MDX,接着查 KaTeX,又顺手怀疑了一下 Shiki。最后发现问题不在这些渲染链路上,而是 Vite 在扫描大目录。项目里有 model/venv/,文件很多,Windows 的文件监听被拖慢了。

解决方案很朴素:让 Vite 不要看这些大目录。在 astro.config.mjs 里加上这一段,启动时间就降下来了:

vite: {
  server: {
    watch: {
      ignored: ['**/model/**', '**/venv/**'],
    },
  },
},

问题不在 Vite 本身,而在我把大目录放进了项目根目录,却没有告诉开发工具跳过它们。

顺手建立代码质量保障

解决了启动速度之后,我意识到 venv/model/ 这两个目录不只是 Vite 的麻烦,TypeScript 也在扫描它们。运行 npm run type-check 时出现了这样的报错:

Couldn't find package @astrojs/svelte (searching from .../venv/Lib/site-packages/gradio/_frontend_code/...)

TypeScript 扫进了 Python 虚拟环境里的 Gradio 源码,找到了 Svelte 文件,然后困惑地问:这个包在哪?在 tsconfig.jsonexclude 里加上 venvmodelpublic 就解决了。

这件事让我顺势把代码质量工具链整理了一遍,装上了 ESLint 9 + @typescript-eslint + eslint-plugin-astro,再配上 husky 和 lint-staged 做 Git hooks。配置 ESLint 时踩了两个坑:第一次运行 npm run lint 遇到 339 个错误,其中 147 个来自 public/wordcloud2.js,那是第三方库,用了大量 var,在 ignores 里加上 public/ 就好了。另一个坑是 Husky 9 废弃了 husky add 命令,得手动创建 hook 文件:

echo "npx lint-staged" > .husky/pre-commit
echo "npm run lint" > .husky/pre-push

现在的工作流是:提交时 lint-staged 只检查暂存文件,速度快;推送时跑完整的 npm run lint,确保进远程的代码符合规范。重要提交前还可以跑 npm run validate,把 lint、类型检查、构建三件事一次做完。

几点收获

这两件事放在一起,给了我一个挺实在的教训:大目录放在项目根目录下,就要主动告诉每一个工具”别去那里”,Vite 要配,TypeScript 要配,ESLint 也要配,漏掉任何一个都会在某个地方冒出奇怪的问题。代码质量工具链的价值不在于一次性清零所有警告,而在于建立一道自动化的防线,让新引入的问题没有机会悄悄积累。