十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

typescript-eslint 使用 extraFileExtensions 时 projectService 频繁重载导致变慢怎么解决?

typescript-eslint 使用 extraFileExtensions 时 projectService 频繁重载导致变慢怎么解决? typescript-eslint 使用 extraFileExtensions 时 projectService 频繁重载导致变慢怎么解决【免费下载链接】typescript-eslint:sparkles: Monorepo for all the tooling which enables ESLint to support TypeScript项目地址: https://gitcode.com/GitHub_Trending/ty/typescript-eslint在 typescript-eslint v8 中使用parserOptions.projectService做类型感知 linting 时如果你的 ESLint 配置对同一项目里的不同文件使用了不同的extraFileExtensions值典型场景*.ts文件走一组配置、*.vue文件走另一组配置会出现 lint 明显变慢。原因在官方文档中有明确说明每 lint 一个文件时typescript-eslint 都会检测extraFileExtensions是否变化一旦变化就更新projectService而每次更新都会让底层的 TypeScript 服务器执行一次完整的项目重载full project reload。文件在两类扩展名之间切换时重载会反复发生拖慢整个 lint 过程。适用前提配置中启用了projectServiceparserOptions.projectService并且项目里混合了普通.ts文件与需要额外扩展名如.vue的文件。如何确认是extraFileExtensions变化导致的项目重载在修改配置之前先开启 typescript-estree 的调试日志确认现象。设置调试环境变量后运行 ESLintDEBUGtypescript-eslint:typescript-estree:* eslint 你的原有参数这个环境变量对应 typescript-estree 包的调试日志会包含 TypeScript 服务器tsserver日志如需关闭 tsserver 日志可在值中追加-typescript-eslint:typescript-estree:tsserver:*参见 typescript-estree 文档的 Debugging 章节。文档中给出的问题现象示例日志示例结果具体项目输出会有差异typescript-estree:useProgramFromProjectService Updating extra file extensions: before[]: after[ .vue ] typescript-estree:tsserver:info reload projects. typescript-estree:useProgramFromProjectService Extra file extensions updated: [ .vue ] ... typescript-estree:useProgramFromProjectService Updating extra file extensions: before[ .vue ]: after[] typescript-estree:tsserver:info reload projects. typescript-estree:useProgramFromProjectService Extra file extensions updated: [] ...判断依据是日志中反复出现Updating extra file extensions: before...: after...且前后值不同随后紧跟typescript-estree:tsserver:info reload projects.。如果重载次数与 lint 文件数同量级地频繁出现就属于本文描述的问题。解决方法让所有文件配置共用同一个extraFileExtensions值核心修复方式把extraFileExtensions提取为一个共享常量让同一项目内所有文件的parserOptions都传入同一个值使 lint 过程中扩展名集合保持不变从而不再触发projectService更新和项目重载。Flat Configeslint.config.js// ts-check import { defineConfig } from eslint/config; import tseslint from typescript-eslint; import vueParser from vue-eslint-parser; // 所有 parserOptions 共用这一个值 const extraFileExtensions [.vue]; export default defineConfig( // ... { files: [*.ts], languageOptions: { parser: tseslint.parser, parserOptions: { projectService: true, extraFileExtensions, }, }, }, { files: [*.vue], languageOptions: { parser: vueParser, parserOptions: { parser: tseslint.parser, projectService: true, extraFileExtensions, }, }, }, );Legacy Config.eslintrc.js// 所有 parserOptions 共用这一个值 const extraFileExtensions [.vue]; module.exports { files: [*.ts], parser: typescript-eslint/parser, parserOptions: { projectService: true, extraFileExtensions, }, overrides: [ { files: [*.vue], parser: vue-eslint-parser, parserOptions: { parser: typescript-eslint/parser, projectService: true, extraFileExtensions, }, }, ], };两点说明extraFileExtensions的取值格式是以.开头的扩展名数组默认扩展名.js、.mjs、.cjs、.jsx、.ts、.mts、.cts、.tsx之外的扩展名如.vue才需要显式声明见 Parser 文档的extraFileExtensions一节。上例中的[.vue]来自官方文档示例实际项目请替换为你需要 lint 的额外扩展名。关键是“同一个值”而不是“同一个变量”只要各配置段最终传入的扩展名数组一致就不会在文件间来回切换。原配置中*.ts段不写extraFileExtensions、*.vue段写[.vue]正是导致值在[]和[.vue]之间反复跳变的原因。验证修复效果修改配置后用同一命令重新运行并观察调试日志DEBUGtypescript-eslint:typescript-estree:* eslint 你的原有参数预期变化日志中不再出现成对反复的Updating extra file extensions: before...: after...值不再变化随之typescript-estree:tsserver:info reload projects.的重复出现也随之消失。随后直接跑一次完整的 lint 命令对比耗时即可确认性能是否恢复到正常水平。相关边界该问题只在使用projectService时发生官方 Performance 文档将其归类为 Project Service Issues若你用的是旧的parserOptions.project此重载机制不适用但有各自的 glob 性能问题过宽的**glob 会加大磁盘 IO参考 Performance 文档。projectService与project同时启用会直接报错Enabling project does nothing when projectService is enabled.启用projectService时应移除project配置见 Parser 文档。如果 lint 整体偏慢但不符合本文的重载现象没有反复的reload projects.日志应按 Performance 文档排查其他原因单条规则计时TIMING1、tsconfig中过宽的include、复杂类型导致的慢类型检查等。【免费下载链接】typescript-eslint:sparkles: Monorepo for all the tooling which enables ESLint to support TypeScript项目地址: https://gitcode.com/GitHub_Trending/ty/typescript-eslint创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表