From 46b4ce81e451bb73d49af0af965e0fc95bace997 Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Sat, 14 Mar 2026 19:10:22 +0800 Subject: [PATCH] refactor: shrink eslint fallback layer --- OXLINT_JS_PLUGINS_MIGRATION.md | 242 ++++++++++++++++++ cspell.json | 8 +- .../lint-configs/eslint-config/package.json | 2 - .../eslint-config/src/configs/comments.ts | 23 -- .../eslint-config/src/configs/index.ts | 2 - .../eslint-config/src/configs/oxlint.ts | 13 - .../eslint-config/src/custom-config.ts | 6 + .../lint-configs/eslint-config/src/index.ts | 4 - .../lint-configs/oxlint-config/package.json | 1 + .../oxlint-config/src/configs/comments.ts | 18 ++ .../oxlint-config/src/configs/index.ts | 3 + .../shadcn-ui/src/ui/form/injectionKeys.ts | 1 - pnpm-workspace.yaml | 1 - 13 files changed, 274 insertions(+), 50 deletions(-) create mode 100644 OXLINT_JS_PLUGINS_MIGRATION.md delete mode 100644 internal/lint-configs/eslint-config/src/configs/comments.ts delete mode 100644 internal/lint-configs/eslint-config/src/configs/oxlint.ts create mode 100644 internal/lint-configs/oxlint-config/src/configs/comments.ts diff --git a/OXLINT_JS_PLUGINS_MIGRATION.md b/OXLINT_JS_PLUGINS_MIGRATION.md new file mode 100644 index 000000000..efd982c25 --- /dev/null +++ b/OXLINT_JS_PLUGINS_MIGRATION.md @@ -0,0 +1,242 @@ +# Oxlint JS Plugins 迁移可行性分析 + +更新时间:2026-03-14 + +## 结论 + +对当前仓库,`Oxlint + jsPlugins` 已经足以承接大部分 JS/TS lint 规则,但**现阶段无法在不丢失 lint 能力的前提下完全替换 ESLint**。 + +更准确的判断是: + +- 可行:继续把 JS/TS 主体规则迁移到 Oxlint,并逐步缩小 ESLint 的职责范围。 +- 不可行:立即删除 ESLint,并要求 Oxlint 100% 覆盖当前所有 Vue/JSONC/YAML/pnpm lint 规则。 + +## 官方能力边界 + +根据 Oxc 官方文档,Oxlint 的 JS Plugins 目前具备这些特征: + +- 支持 ESLint v9+ 插件 API,文档表述为“大多数现有 ESLint 插件应可直接工作”。 +- `jsPlugins` 仍处于 `alpha`,不受 semver 稳定性约束。 +- 当前尚未支持两类关键能力: + - 自定义文件格式和解析器,例如 Vue、Svelte、Angular。 + - 依赖 TypeScript type-aware 的 JS 插件规则。 + +另外,官方内建 `vue` 插件当前只覆盖“适用于 script tags 的规则”,并不等价于完整的 `eslint-plugin-vue` 模板规则集。 + +官方文档: + +- JS Plugins: https://oxc.rs/docs/guide/usage/linter/js-plugins.html +- Linter Config: https://oxc.rs/docs/guide/usage/linter/config.html +- Built-in Plugins: https://oxc.rs/docs/guide/usage/linter/plugins + +关键点摘录来源: + +- JS Plugins 兼容 ESLint v9+,且目前为 alpha:`js-plugins.html` +- 暂不支持 custom file formats/parsers 与 type-aware JS plugin rules:`js-plugins.html` +- 内建 `vue` 仅覆盖 script tags 可用规则:`plugins` + +## 仓库当前状态 + +当前仓库已经不是“Oxlint 还没开始接管”的状态,而是**Oxlint 已经承担主体,ESLint 负责补位**。 + +### 1. 根配置 + +- ESLint 入口:[eslint.config.mjs](./eslint.config.mjs) +- Oxlint 入口:[oxlint.config.ts](./oxlint.config.ts) + +两者都只是薄封装: + +- [eslint.config.mjs](./eslint.config.mjs) 直接使用 `@vben/eslint-config` +- [oxlint.config.ts](./oxlint.config.ts) 直接使用 `@vben/oxlint-config` + +### 2. 当前 lint 流程是双跑 + +见 [scripts/vsh/src/lint/index.ts](./scripts/vsh/src/lint/index.ts): + +- 检查时同时执行 `oxlint .` 和 `eslint . --cache` +- 修复时同时执行 `oxlint . --fix` 和 `eslint . --cache --fix` + +这说明工具链层面已经默认接受“Oxlint 负责大部分,ESLint 保留兜底”的模式。 + +### 3. Oxlint 已覆盖的能力 + +见 [internal/lint-configs/oxlint-config/src/configs/plugins.ts](./internal/lint-configs/oxlint-config/src/configs/plugins.ts): + +- 已启用内建插件:`import`、`node`、`oxc`、`typescript`、`unicorn`、`vitest`、`vue` + +见 [internal/lint-configs/oxlint-config/src/configs/tailwindcss.ts](./internal/lint-configs/oxlint-config/src/configs/tailwindcss.ts): + +- 已通过 `jsPlugins` 接入 `eslint-plugin-better-tailwindcss` + +这说明仓库已经验证过一个重要前提:**Oxlint 的 `jsPlugins` 在本项目里不是理论能力,而是已经在生产配置中使用。** + +## 为什么现在还不能彻底删掉 ESLint + +### 1. Vue 模板规则仍依赖 ESLint 生态 + +见 [internal/lint-configs/eslint-config/src/configs/vue.ts](./internal/lint-configs/eslint-config/src/configs/vue.ts): + +- 使用 `vue-eslint-parser` +- 使用 `pluginVue.processors?.['.vue']` +- 配置了大量模板/组件约束规则,例如: + - `vue/attribute-hyphenation` + - `vue/html-self-closing` + - `vue/v-on-event-hyphenation` + - `vue/block-order` + - `vue/require-default-prop` + - `vue/one-component-per-file` + +这部分明显超出“只 lint `