你有没有遇到过这种情况:改了一行代码,重新运行项目,结果等了三分钟才跑起来?旁边的同事却秒开。你以为他电脑贵,其实可能是他懂‘编译缓存’。
什么是编译缓存?
简单说,编译缓存就是把之前已经处理过的代码结果存下来,下次用的时候直接拿,不用从头再来一遍。就像你做饭,切好的菜放进保鲜盒,明天炒菜就不用再切一次。
比如你写了个网页项目,里面有个工具函数文件 utils.js,一个月没动过。每次构建都重新编译它?太浪费。有了编译缓存,系统一看这个文件没变,直接跳过,只处理你刚改的那部分。
它是怎么工作的?
编译器或构建工具(比如 Webpack、Vite、Babel)会在第一次编译时,给每个文件生成一个“指纹”——通常是基于文件内容的哈希值。这个指纹和编译结果一起存进本地磁盘的缓存目录。
下次启动时,工具先比对当前文件内容的指纹和缓存里的是否一致。一样?那就直接用旧的编译结果。不一样?只重新编译这个文件。
<!-- 缓存命中,跳过编译 -->\nHash: a1b2c3d4e5f6 - Matched, using cached output\n\n<!-- 缓存失效,重新编译 -->\nHash: x9y8z7w6v5u4 - Changed, recompiling file...
省的不只是时间
时间就是钱。你多等一分钟,服务器多跑一分钟,云构建平台按分钟计费。大公司每天成千上万次构建,省一秒,一年能省几万块电费和人力成本。
小团队也一样。你用 Vercel 或 Netlify 部署,免费额度有限。缓存用得好,构建快,成功率高,不超限,自然省钱。
怎么让缓存更有效?
别乱改构建配置。有些人为追求“干净”,每次构建前删缓存目录,等于天天重做早饭。除非真出问题,否则别手贱。
还有,依赖别乱升级。今天升个 Babel 插件,缓存全废,全项目重编。建议固定版本号,用 package-lock.json 或 yarn.lock 锁住。
{\n "devDependencies": {\n "@babel/core": "7.20.0" <!-- 锁死版本,避免意外更新 -->\n }\n}
最后,多人协作时,把缓存共享起来更划算。用 webpack-cache-s3 或 Turborepo 的远程缓存,队友编译过的成果,你也能用。相当于全组共用一个厨房,谁切好菜大家都能炒。
别小看这技术细节,用好了,下班早半小时,奶茶钱都省出来了。