Turborepo ESLint 配置指南:eslint-config-turbo 从安装、配置到 no-undeclared-env-vars 缓存保护原理
构建工具开发工具CLI【免费下载链接】turboBuild system optimized for JavaScript and TypeScript, written in Rust项目地址https://gitcode.com/gh_mirrors/tu/turbo点击查看免费下载eslint-config-turbo是 Turborepo 官方提供的 ESLint 共享配置包它把 Turborepo 的缓存正确性约束直接带进了静态检查流程——通过内置的turbo/no-undeclared-env-vars规则确保所有在代码中使用的环境变量都被显式声明在turbo.json中。读完本文你将掌握该配置的安装与两种配置方式Flat Config 与 Legacy eslintrc、核心规则的可选项与修复方法并能从源码层面理解规则如何定位工作区、推断框架环境变量以及优化文件系统扫描开销。为什么 Turborepo 需要一套专属 ESLint 配置Turborepo 的缓存机制基于任务输入计算哈希只有哈希一致时才会复用缓存产物。环境变量env vars是影响构建输出的关键输入之一——一个未在turbo.json中声明的环境变量若悄悄改变了构建产物Turborepo 却感知不到就会返回陈旧的缓存结果。eslint-config-turbo正是为堵住这个漏洞而生。它本质上是 eslint-plugin-turbo 的推荐配置封装flat 版本注册turbo插件并开启turbo/no-undeclared-env-vars: errorlegacy 版本则等价于extends: [plugin:turbo/recommended]。你不需要关心插件的底层细节装上配置即获得缓存正确性保护。安装按官方 READMEpackages/eslint-config-turbo/README.md的步骤先安装 ESLint 本体npm install eslint --save-dev再安装eslint-config-turbonpm install eslint-config-turbo --save-dev从仓库内 package.json 可以看到该包的约束条件peerDependencieseslint 6.6.0、turbo 2.0.0即同时兼容早期 ESLint 与较新的 Turbo 版本dependencies仅依赖eslint-plugin-turbo仓库内以workspace:*关联发布后为同名 npm 包exports字段同时暴露了.默认入口与./flatFlat Config 专用入口两个子路径并分别提供import与require两种模块格式。使用方式一Flat Configeslint.config.jsESLint v9 默认采用 Flat Config。在eslint.config.js中导入 flat 入口并展开import turboConfig from eslint-config-turbo/flat; export default [ ...turboConfig // Other configuration ];...turboConfig展开后的数组来自 src/flat/index.tsconst config: ArrayLinter.Config [ { plugins: { turbo: plugin }, rules: { turbo/no-undeclared-env-vars: error } } ];也就是说flat 入口已经替你完成了“注册turbo插件 开启no-undeclared-env-vars为 error 级”两件事。如果还需要配置该规则的选项可以在数组尾部追加一个配置块import turboConfig from eslint-config-turbo/flat; export default [ ...turboConfig, // Other configuration { rules: { turbo/no-undeclared-env-vars: [ error, { allowList: [^ENV_[A-Z]$] } ] } } ];使用方式二Legacyeslintrc*配置如果你的项目仍在使用.eslintrc/.eslintrc.json体系可以在extends中加入turbo可省略eslint-config-前缀{ extends: [turbo] }该入口的实现位于 src/index.ts一行即完成推荐配置的接入const config { extends: [plugin:turbo/recommended] }; module.exports config;plugin:turbo/recommended对应 eslint-plugin-turbo/lib/configs/recommended.ts 中的 legacy 推荐配置注册turbo插件将turbo/no-undeclared-env-vars设为error并向settings.turbo.cacheKey写入一个基于当前项目计算出的缓存键。同样可以覆盖规则选项{ extends: [turbo], rules: { turbo/no-undeclared-env-vars: [ error, { allowList: [^ENV_[A-Z]$] } ] } }核心规则turbo/no-undeclared-env-vars这条规则是整套配置的灵魂。官方规则文档packages/eslint-plugin-turbo/docs/rules/no-undeclared-env-vars.md指出它确保所有可检测到的环境变量用法都被正确纳入缓存键从而保证构建产物在不同环境下可安全复用缓存。触发场景示例假设代码中有const client MyAPI({ token: process.env.MY_API_TOKEN });如果turbo.json既没有在globalEnv声明MY_API_TOKEN也没有在具体任务的env中声明它规则就会报错。错误示例未声明{ pipeline: { build: { dependsOn: [^build], outputs: [dist/**, .next/**, !.next/cache/**, !.next/dev/**] }, lint: {}, dev: { cache: false } } }两种修复方式方式一在根级globalEnv中声明让所有任务共享该环境变量{ globalEnv: [MY_API_TOKEN], pipeline: { build: { dependsOn: [^build], outputs: [dist/**, .next/**, !.next/cache/**, !.next/dev/**] }, lint: {}, dev: { cache: false } } }方式二只在具体任务的env中声明作用域更小{ pipeline: { build: { dependsOn: [^build], env: [MY_API_TOKEN], outputs: [dist/**, .next/**, !.next/cache/**, !.next/dev/**] }, lint: {}, dev: { cache: false } } }规则选项选项必填默认值说明示例allowList否[]需要豁免的环境变量字符串或正则表达式数组。注意只有当该变量对构建输出没有影响时才应豁免[MY_API_TOKEN, ^MY_ENV_PREFIX_[A-Z]$]allowList中的每一项都会被编译为正则见 no-undeclared-env-vars.ts无法编译的项会打印错误日志后被跳过不影响其余项生效。源码视角规则究竟如何工作规则实现位于 packages/eslint-plugin-turbo/lib/rules/no-undeclared-env-vars.ts从源码可以看出它的完整检查链路。1. 检测环境变量访问形式规则监听 AST 的MemberExpression节点识别两种访问入口process.env.X判断node.object为process且node.property为env源码isProcessEnvimport.meta.env.X判断对象是MetaPropertyimport.meta且属性为env源码isImportMetaEnv。对于非 computed 的成员访问如process.env.FOO直接提取属性名检查对process.env的解构写法如const { FOO } process.env则遍历ObjectPattern的每个 key 逐一检查对 computed 字面量访问如process.env[FOO]也能通过Literal提取变量名。2. 声明校验与报错每个变量名会依次经过allowList正则匹配含下文框架推断产生的正则project.test(workspaceName, envKey)校验——查询 turbo.json 中的globalEnv、globalPassThroughEnv以及任务级env配置。若均未命中则报告错误消息会明确指出该变量未在turbo.json或在工作区场景下指明根配置与具体工作区配置中声明。3. 框架环境变量自动推断这是比较巧妙的一点Turborepo 会根据package.json的依赖自动推断框架前缀规则把这一逻辑移植了过来源码注释对此有明确说明。例如检测到vue/cli-service依赖时会从frameworks.json取回VUE_APP_*对应的正则加入豁免列表避免对框架自带的环境变量误报。推断逻辑会同时考量dependencies、devDependencies、peerDependencies并通过strategyall/some决定依赖匹配策略。4. 性能优化配置缓存与限频校验ESLint 会为每个源文件创建一次规则实例如果不做任何优化每次创建都要重新扫描所有工作区的turbo.json/turbo.jsonc把校验复杂度推到 O(源文件数 × 配置数)。源码通过三层机制化解projectCache以cwd为键缓存整个项目对象避免对每个文件重复初始化CONFIG_VALIDATION_INTERVAL_MS 1000限频 1 秒内最多做一次 turbo 配置有效性校验批量 lint 与编辑器持续检查时开销被摊薄配置文件比对采用mtime size的 stat 签名而非内容哈希未变化的配置不会被重复读取。另外frameworkEnvCache与packageJsonDepCache分别缓存框架推断结果与依赖集合均以package.json路径为键。常见问题与排查建议报错信息提示“not listed as a dependency in root turbo.json or workspace turbo.json”说明代码中使用的环境变量未在任何配置中声明。优先判断该变量是否影响构建输出——若影响请按上文两种修复方式加入globalEnv或任务env若确实无害如仅用于本地调试开关再考虑加入allowList。规则未生效确认使用 Flat Config 时导入的是eslint-config-turbo/flat而不是默认入口或 legacy 配置中extends写的是turbo而不是eslint-config-turbo。想绕过某个前缀的所有变量allowList支持正则例如^ENV_[A-Z]$可一次性豁免整类变量规则的 schema源码meta.schema允许传入一个对象数组选项其中还包含用于测试的cwd字段。多工作区项目规则会自动定位当前文件所属的工作区getWorkspaceFromFilePath并能感知工作区级turbo.json的增删改scanForTurboConfigs会扫描所有工作区新增配置文件后无需重启 lint 进程。小结eslint-config-turbo用极小的接入成本把“环境变量必须显式声明”这一 Turborepo 缓存正确性铁律固化进了 CI 与编辑器的每次 lint。理解其背后的no-undeclared-env-vars规则实现——从 AST 检查、框架推断到配置缓存——能帮助你在 monorepo 中更自信地维护缓存命中率避免“缓存未失效但产物已过期”这类隐蔽问题。仓库内的 eslint-config-turbo 源码、规则实现 与 规则文档 可作为进一步深入学习的参考资料。赞分享构建工具开发工具CLI【免费下载链接】turboBuild system optimized for JavaScript and TypeScript, written in Rust项目地址https://gitcode.com/gh_mirrors/tu/turbo点击查看免费下载相关推荐eslint-plugin-turbo 实战指南用 no-undeclared-env-vars 保证 Turborepo 构建缓存正确性eslint plugin turbo 实战指南用 no undeclared env vars 保证 Turborepo 构建缓存正确性 eslint pl构建工具开发工具CLITurborepo 环境变量缓存一致性检查eslint-plugin-turbo no-undeclared-env-vars 规则完全指南Turborepo 环境变量缓存一致性检查eslint plugin turbo no undeclared env vars 规则完全指南 Turborep构建工具开发工具CLI实战指南3步完成相机激光雷达精准标定实战指南3步完成相机激光雷达精准标定 在多传感器融合系统中相机和激光雷达的精确标定是实现环境感知的关键基础。传统标定方法往往依赖人工反复尝试耗时费力且结果自动驾驶计算机视觉创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

前端动态背景色与hover冲突:用CSS变量优雅解决

前端动态背景色与hover冲突:用CSS变量优雅解决

写行内样式这块,很多前端er听到"动态设置背景色、hover颜色"第一反应都是:直接el.style.background #f00不就行了?但真到项目里,尤其当你需要在 JS 里根据接口数据动态生成颜色、还要让 hover 有反馈时,事情…

2026/9/20 2:25:50 阅读更多 →
理解UObject内存模型:从创建到GC回收的完整指南

理解UObject内存模型:从创建到GC回收的完整指南

这章节我们直接切入正题:UObject 的内存模型。前四章我们聊完了引擎整体内存框架、分配器、容器,这次终于轮到“对象”本身。在 Unreal 里,UObject 是一切资产、组件、蓝图实例、游戏玩法的载体。你可以不懂分配器的细节,但只要写…

2026/9/20 2:25:50 阅读更多 →
从0到1:Node.js+Vue构建校园流浪动物救助全栈平台

从0到1:Node.js+Vue构建校园流浪动物救助全栈平台

1. 项目概述与整体定位1.1 为什么要做校园流浪动物救助平台这两年走访了不少高校,发现几乎每所大学校园里都有一群特殊的“编外成员”——流浪猫、流浪狗。它们有的被学生投喂着,有的在宿舍楼下安了窝,但普遍面临几个问题:领养信息…

2026/9/20 2:25:50 阅读更多 →

最新新闻

2026年AI编程工具版图:从补全代码到数字员工的五大阵营解析

2026年AI编程工具版图:从补全代码到数字员工的五大阵营解析

1. 2026年AI编程工具的版图:从“补全代码”到“数字员工”的演变年初整理自己电脑上装的一堆AI编程插件时,我发现一个很有意思的现象:三年前大家口中所谓的“AI编程工具”,默认指的就是GitHub Copilot那种在你敲代码时自动补全下半…

2026/9/20 3:14:15 阅读更多 →
夸克网盘下载限速怎么破?在线解析与直链提取提速方案详解

夸克网盘下载限速怎么破?在线解析与直链提取提速方案详解

网盘限速这件事,几乎每个重度用户都经历过。明明家里宽带跑满能到几百兆,下载网盘里的文件却只有几百KB,一个几GB的安装包要挂一整晚。夸克网盘因为空间给得大方、资源分享活跃,用的人越来越多,但"下载慢"的…

2026/9/20 3:14:15 阅读更多 →
LibreChat自托管部署实战:多模型AI对话中台配置与问题排查

LibreChat自托管部署实战:多模型AI对话中台配置与问题排查

1. 为什么我最终选择了LibreChat作为AI对话中台第一次接触LibreChat是在一个需要同时对接多个大模型接口的项目里。当时团队内部有做文案的、写代码的、做数据分析的,每个人习惯用的模型不一样,有人偏爱某家的长文本能力,有人觉得另一家的代码…

2026/9/20 3:14:15 阅读更多 →
RapidOCR 完整上手指南:从安装到多语言识别的三步路

RapidOCR 完整上手指南:从安装到多语言识别的三步路

RapidOCR 完整上手指南:从安装到多语言识别的三步路 【免费下载链接】RapidOCR 📄 Awesome OCR multiple programing languages toolkits based on ONNX Runtime, OpenVINO, MNN, PaddlePaddle, TensorRT and PyTorch. 项目地址: https://gitcode.com/…

2026/9/20 3:14:15 阅读更多 →
如何 5 分钟从零搭好你的第一个多智能体系统:Multi-Agent Orchestrator 快速上手指南

如何 5 分钟从零搭好你的第一个多智能体系统:Multi-Agent Orchestrator 快速上手指南

如何 5 分钟从零搭好你的第一个多智能体系统:Multi-Agent Orchestrator 快速上手指南 【免费下载链接】agent-squad Flexible and powerful framework for managing multiple AI agents and handling complex conversations 项目地址: https://gitcode.com/GitHub…

2026/9/20 3:14:15 阅读更多 →
LinkSwift 网盘直链解析指南:安装到拿到直链全流程

LinkSwift 网盘直链解析指南:安装到拿到直链全流程

LinkSwift 网盘直链解析指南:安装到拿到直链全流程 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…

2026/9/20 3:13:15 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →