Skip to content

清除 Nx 缓存

当使用 Nx 管理大型项目时,缓存目录可能会占用大量磁盘空间。本文将介绍如何有效管理和清理 Nx 缓存。

Nx 缓存的位置和用途

Nx 默认将缓存存放在 ./node_modules/.cache/nx/ 目录中。这个缓存用于存储构建和测试等任务的运算结果,以提高后续执行的速度。但随着项目发展,缓存可能会增长到数 GB 大小。

推荐的清理方法

使用官方命令(推荐)

从 Nx 15 开始,官方提供了专门的清理命令:

bash
nx reset

这个命令会安全地清理 Nx 的缓存,同时保持缓存的完整性。

手动删除缓存目录

如果希望完全清除缓存,可以直接删除缓存文件夹:

bash
rm -rf ./node_modules/.cache/nx

或者使用跨平台的删除命令。

WARNING

手动删除缓存目录会造成所有缓存失效,可能导致后续构建和测试需要重新计算,增加执行时间。

替代方案:跳过缓存执行

在某些情况下,你可能不需要清除整个缓存,而是希望特定命令不使用缓存:

bash
# 跳过缓存执行构建
npx nx run build --skip-nx-cache

# 跳过缓存执行测试
npx nx run test --skip-nx-cache

高级配置选项

自定义缓存位置

如果担心缓存占用项目空间,可以将其配置到其他位置。在 nx.json 中添加:

json
{
  "tasksRunnerOptions": {
    "default": {
      "options": {
        "cacheDirectory": "/tmp/nx-cache"
      }
    }
  }
}

自动化缓存清理脚本

如果希望定期自动清理缓存,可以创建自定义脚本:

javascript
const fs = require('fs');
const { execSync } = require('child_process');

const cachePath = 'node_modules/.cache/nx';
const maxCacheSizeMB = 2048;

if (fs.existsSync(cachePath)) {
  // 检查缓存大小
  const size = getDirectorySize(cachePath);
  const mbSize = size / 1024 / 1024;
  
  console.log(`NX 缓存大小: ${mbSize.toFixed(2)} MB`);
  
  if (mbSize > maxCacheSizeMB) {
    console.log('清理 NX 缓存...');
    execSync('nx reset', { stdio: 'inherit' });
  }
}

function getDirectorySize(path) {
  // 实现获取目录大小的逻辑
}

注意事项

  1. 区分缓存类型nx clear-cache 命令用于清理 Jest 测试缓存,而非 Nx 计算缓存
  2. 性能影响:清除缓存后首次运行命令可能会变慢
  3. 共享缓存:在 CI/CD 环境中考虑使用分布式缓存以提高效率

最佳实践

  • 定期使用 nx reset 管理缓存大小
  • 在 CI 环境中配置适当的缓存策略
  • 对于大型团队,考虑使用 Nx Cloud 进行分布式缓存

通过合理管理 Nx 缓存,可以在保持构建速度的同时,有效控制磁盘空间的使用。