源码级别解析 · 源码深度解析 · 构建系统优化
2026-04-10 | 每日技术深度解读
大型项目的构建时间往往达到分钟级别
缓存命中率可达90%以上,显著提升构建速度
[workspace]
resolver = "3"
members = [
"crates/turbo-trace",
"crates/turborepo*",
"packages/turbo-repository/rust",
]
Turbo使用Cargo workspace组织多个crates
{
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": [
"dist/**",
".next/**",
"build/**"
]
},
"test": {
"dependsOn": ["^build"],
"outputs": []
},
"lint": {
"dependsOn": [],
"inputs": [
"src/**/*.{js,ts,jsx,tsx}"
]
}
}
}
dependsOn中使用^表示跨包依赖
任何一个因素变化都会导致缓存失效
// 基于多因素生成缓存键
pub fn generate_cache_key(
task_config: &TaskConfig,
file_hashes: &HashMap<String, String>,
env_vars: &HashMap<String, String>,
deps: &[String]
) -> String {
let mut hasher = DefaultHasher::new();
// 1. 任务配置哈希
task_config.hash(&mut hasher);
// 2. 文件内容指纹
for (path, hash) in file_hashes {
path.hash(&mut hasher);
hash.hash(&mut hasher);
}
// 3. 环境变量影响
for (key, value) in env_vars {
key.hash(&mut hasher);
value.hash(&mut hasher);
}
// 4. 依赖版本
for dep in deps {
dep.hash(&mut hasher);
}
format!("{:x}", hasher.finish())
}
使用多种因素组合生成唯一的缓存键
即使不部署在Vercel,也可免费使用远程缓存
{
"remoteCache": {
"signature": true,
"team": "my-team",
"token": "cache-token-here",
"endpoint": "https://api.vercel.com/v4"
},
"pipeline": {
"cache": {
"artifacts": true,
"cacheKey": "${{ env.CACHE_KEY }}"
}
}
}
启用签名验证确保缓存完整性
只重新构建真正发生变更的任务
// 检测哪些任务需要重新执行
pub fn detect_changed_tasks(
graph: &TaskGraph,
file_changes: &FileChanges,
cache: &CacheStore
) -> Vec<TaskId> {
let mut changed = Vec::new();
let mut visited = HashSet::new();
// 从修改的文件开始,反向遍历依赖图
for file in &file_changes.modified {
if let Some(tasks) = graph.find_tasks_using_file(file) {
for task_id in tasks {
if !visited.contains(&task_id) {
mark_changed_recursive(&task_id, graph, cache, &mut visited, &mut changed);
}
}
}
}
changed
}
fn mark_changed_recursive(
task_id: &TaskId,
graph: &TaskGraph,
cache: &CacheStore,
visited: &mut HashSet<TaskId>,
changed: &mut Vec<TaskId>
) {
if visited.contains(task_id) {
return;
}
visited.insert(task_id.clone());
// 检查任务是否已缓存且未过期
if !cache.is_valid(task_id) {
changed.push(task_id.clone());
return;
}
// 递归检查依赖
for dep_id in graph.get_dependencies(task_id) {
mark_changed_recursive(dep_id, graph, cache, visited, changed);
}
}
从文件变更开始,递归检查所有受影响的任务
典型项目构建速度提升5-10倍
| 项目 | 传统构建 | Turborepo | 提升倍数 |
|---|---|---|---|
| 大型 monorepo | 8分钟 | 45秒 | 10.7x |
| 小型项目 | 2分钟 | 15秒 | 8.0x |
| CI/CD | 12分钟 | 2分钟 | 6.0x |
| 增量构建 | 不适用 | 5秒 | ∞ |
Rust的内存安全特性确保高效管理
单任务失败不影响整体构建流程
环境变量影响缓存键的生成
Turborepo 重新定义了 JavaScript 构建标准
感谢阅读!
访问 https://atcfu.com/ai-articles/turbopack/ 回顾本文