概览------一句话看懂这条路径
Angular 17 及以上版本默认启用基于 Vite 与 esbuild 的新构建系统,它会把对依赖包的 预打包结果 存进工作区根目录的 .angular/cache
,并按 CLI 版本号 、项目唯一标识 、构建器名称 等维度分层。vite/deps
子目录正是 Vite 的 optimize Deps 预打包输出 ,Chrome 通过 Source Map 把浏览器加载到的伪装 URL 映射回来,于是你便在 DevTools 里看到这条完整路径。Angular 开发服务器依靠这些缓存实现秒级冷启动、热更新与依赖变更检测。(Angular, vitejs, Angular Blog)
ℹ️ 路径逐段拆解
片段 | 物理/逻辑含义 | 关键要点 |
---|---|---|
.angular |
Angular CLI 自 v13 起引入的工作区隐藏目录,用于 磁盘级构建缓存 与 CLI 运行中间产物 。(Medium, Stack Overflow) | |
cache |
CLI 缓存根目录,位置可通过 ng config cli.cache.path 修改。(Angular) |
|
19.2.6 |
当前使用的 Angular CLI 版本号,用于区分不同版本的缓存,防止升级后因旧产物导致的不一致。(GitHub) | |
abap_test |
工作区内 项目或构建目标的唯一标识 。Angular 支持多项目/多目标缓存隔离,名称通常来自 angular.json 中的 name 字段或派生哈希。(Angular) |
|
vite |
指示本层缓存产物来源于 Vite 构建器 (Angular 17 起为默认 application builder )。(Angular, Angular Love) |
|
deps |
Vite 的 optimizeDeps /pre-bundle 输出目录,里面是 esbuild 打包后的单文件 ESM 依赖,后缀常见 *.mjs 或 chunk-*.js 。(vitejs, Vite) |
Angular CLI 的磁盘缓存体系
缓存为何出现
-
自 v13 起,CLI 将编译、类型检查、代码生成等可复用步骤写入
.angular/cache
,显著缩短重复构建的耗时。(Medium, GitHub) -
缓存按 命令、构建配置、依赖图哈希 等维度切分;每次变更仅命中必要片段。Git 官方示例甚至建议把该目录加入
.gitignore
。(Stack Overflow)
19.2.6 层的意义
当你升级到 @angular/cli 19.2.6
,CLI 会在缓存根目录下新建同名子文件夹;旧版本产物不会互相污染,便于并行维护多分支或回滚。(GitHub)
新构建系统与 Vite 的角色
Angular 17 将 Vite + esbuild 正式推为默认 ng serve
/ng build
实现,官方称其为 application builder ,带来平均 67 % 的冷启动提速。(Angular, Angular Blog)
Vite 在开发模式下会:
-
解析项目入口,收集外部依赖列表。
-
用 esbuild 将依赖 预打包 到
cacheDir/deps
(默认node_modules/.vite/deps
,Angular 则指向.angular/cache/.../vite/deps
)。(vitejs, Vite) -
建立文件系统到虚拟模块的映射表,供浏览器通过
import / @id/...
URL 访问;Source Map 将该 URL 再映射到原始 TypeScript。(DEV Community, vitejs)
如此一来:
-
第一次运行:预打包耗时但被缓存。
-
后续运行 :若
package.json
、vite.config.*
或依赖文件指纹未变,则直接复用缓存,冷启动可达秒级。([GitHub](github.com/vitejs/vite... "`The file does not exist at "node_modules/.vite/deps/chunk*" which is ..."), DEV Community)
Chrome DevTools 为何展示这条路径
浏览器加载的是 Vite dev server 返回的虚拟路径,如 /@id/lodash
。在 Source Map 反向查找、Angular 插件与 VS Code 调试协议的多重协作下,DevTools 把它标注成 真实磁盘路径 ,并在 UI 中折叠成 .angular/cache/.../vite/deps/lodash.js
。这能够:
-
让你直接在浏览器中设置断点调试预打包后的依赖。
-
快速定位缓存失效或冲突场景,例如库作者本地调试时需手动
ng cache clean
。([GitHub](github.com/vitejs/vite... "`The file does not exist at "node_modules/.vite/deps/chunk*" which is ..."), Stack Overflow)
案例研究:abap_test
项目中的调试场景
假设你有一个名为 abap_test
的 Angular 19 单页应用,启用了默认 Vite 构建器,且依赖 SAP UI5 SDK 的 EsModule 发行版。
-
第一次执行
ng serve
-
CLI 检测到
node_modules/@sap/ui5
等大块依赖。 -
Vite 将其与其内部深度导入一起打包进
.angular/cache/19.2.6/abap_test/vite/deps/ui5_sdk.mjs
。
-
-
在 Chrome 中打开
http://localhost:4200
-
Sources 面板下,你会看到与上述路径完全一致的虚拟文件。
-
对 UI5 运行时做步进调试时,断点命中处就是预打包后的 ESM,让调试体验接近源码级细节。
-
若你临时修改了 @sap/ui5
源码,但版本号不变,为防止旧缓存被继续复用,可执行 ng cache clean
或直接删除 .angular/cache/19.2.6/abap_test
。(Stack Overflow, [GitHub](github.com/vitejs/vite... "`The file does not exist at "node_modules/.vite/deps/chunk*" which is ..."))
日常开发中该路径带来的启示
-
加速本地循环 :理解缓存层级能帮助你在需要时精准清理,而非粗暴
rm -rf node_modules
。 -
CI/CD 优化 :在 CI 服务器上持久化
.angular/cache
目录,可大幅减少构建时间;一旦升级 CLI,仅需保存新版本子目录即可。 -
依赖调试 :当你调试未发布的本地库或者链接包时,若发现代码无效,请优先怀疑 Vite
deps
缓存并强制失效。 -
跨版本隔离:多分支并行开发中,同时安装 18.x 与 19.x CLI 时不会相互污染,得益于版本层目录。
-
空间管理 :长期使用后
.angular/cache
体积可能失控,可结合ng cache info
或定期清理策略避免磁盘占用。(GitHub, Medium)
结语
.angular/cache/19.2.6/abap_test/vite/deps
并非神秘乱码,而是 Angular CLI 版本化磁盘缓存 + Vite 依赖预打包 + 项目隔离 的全息快照。透彻理解这条路径,你就能更高效地控制缓存、加速构建、提升调试体验,甚至为 CI/CD 与多项目仓库制定更合理的缓存持久化策略。下一次当你在 DevTools 中遇到类似路径时,心中自会浮现其背后的缓存机制与构建流程。