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.json 的 exclude 里加上 venv、model、public 就解决了。
这件事让我顺势把代码质量工具链整理了一遍,装上了 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 也要配,漏掉任何一个都会在某个地方冒出奇怪的问题。代码质量工具链的价值不在于一次性清零所有警告,而在于建立一道自动化的防线,让新引入的问题没有机会悄悄积累。